Skip to content

第5章 运输层

章节概述

运输层为应用进程提供端到端的通信服务,屏蔽网络层的细节。两个核心协议:TCP(可靠、有序、面向连接)和 UDP(不可靠、无序、无连接)。本章难点在于 TCP 的流量控制、拥塞控制和连接管理。

核心概念

  • [[05-运输层|端口号]] 与 [[06-应用层|Socket]]
  • [[UDP协议]]
  • [[05-运输层|TCP]]
  • [[05-运输层|停止等待]] 与 [[05-运输层|ARQ]]
  • [[05-运输层|滑动窗口]]
  • [[05-运输层|TCP流量控制]]
  • [[TCP拥塞控制]]
  • [[TCP三次握手]] 与 [[05-运输层|TCP四次挥手]]

5.1 运输层基本概念

端口(Port)

  • 标识进程(不是主机):IP地址+端口号 = 套接字(Socket)
  • 熟知端口:0–1023(HTTP:80, HTTPS:443, FTP:21, SSH:22, DNS:53, SMTP:25)
  • 注册端口:1024–49151
  • 临时端口:49152–65535

复用与分用

  • 复用:多个进程使用同一网络层(向下)
  • 分用:根据端口号将报文分发给不同进程(向上)

5.2 UDP

源端口(16) | 目的端口(16)
长度(16)   | 检验和(16)
数据...

特点: - 无连接,不保证可靠交付 - 尽最大努力,开销小(8字节首部) - 保留报文边界(不像TCP是字节流) - 适合:实时应用(视频、DNS、DHCP)

5.3 TCP

源端口(16)           | 目的端口(16)
              序号(32)
              确认号(32)
数据偏移(4)|保留(6)|标志位(6) | 窗口(16)
检验和(16)           | 紧急指针(16)
可选字段 + 填充
数据...

标志位:URG, ACK, PSH, RST, SYN, FIN

TCP特点:全双工、面向连接、面向字节流、有序、可靠。

5.4 可靠传输机制

停止等待协议(SW)

  • 发送一帧 → 等待确认 → 再发下一帧
  • 信道利用率极低:\(U = rac{T_D}{T_D + RTT + T_A}\)

连续ARQ(滑动窗口)

  • 发送窗口 \(W_T\):可连续发送但未确认的帧数
  • 累积确认:确认 \(n\) 表示 \(n\) 及之前全部正确收到
  • Go-Back-N:出错后重传出错帧及之后所有帧
  • SACK(选择确认):TCP可选项,精确告知哪些段已收到

5.5 TCP流量控制

接收端通过窗口字段(rwnd, receiver window)控制发送速率:

  • 接收缓冲区满时,rwnd = 0,发送方停止
  • 窗口打开后,接收方发送窗口更新报文
  • 持续计时器(Persist Timer):防止窗口更新丢失导致死锁

5.6 TCP拥塞控制(重点)

四个算法

1. 慢开始(Slow Start) - 初始 cwnd = 1 MSS - 每收到一个ACK:cwnd += 1 MSS(指数增长)

2. 拥塞避免(Congestion Avoidance) - 每个 RTT:cwnd += 1 MSS(线性增长) - cwnd 超过慢开始门限 ssthresh 后进入此阶段

3. 快重传(Fast Retransmit) - 收到 3个重复ACK → 立即重传,不等超时

4. 快恢复(Fast Recovery) - 快重传后:ssthresh = cwnd/2,cwnd = ssthresh(不归1) - 直接进入拥塞避免阶段

  cwnd
   |        /
   |       /  拥塞避免(线性)
   |    ssthresh
   |   /
   |  /  慢开始(指数)
   |/___________________时间

超时事件:ssthresh = cwnd/2,cwnd = 1,重新慢开始。

5.7 TCP连接管理

三次握手(建立连接)

客户端                         服务器
  ──── SYN(seq=x) ────────────────→
  ←─── SYN+ACK(seq=y,ack=x+1) ────
  ──── ACK(ack=y+1) ──────────────→
  (连接建立)
为何三次? 防止旧的重复连接请求到达服务器造成错误。

四次挥手(释放连接)

主动方                         被动方
  ──── FIN(seq=u) ────────────────→
  ←─── ACK(ack=u+1) ──────────────
  ←─── FIN(seq=v) ────────────────
  ──── ACK(ack=v+1) ──────────────→
  等待 2MSL 后关闭
TIME_WAIT(2MSL)原因: 1. 确保最后一个ACK到达对方 2. 让网络中残留报文消逝

参见

  • [[04-网络层]] — IP提供的服务
  • [[06-应用层]] — HTTP/DNS等使用TCP/UDP
  • [[TCP拥塞控制]] — CUBIC、BBR等现代算法
  • [[06-应用层|Socket编程]] — Socket API使用