TCP 协议的特点

  • 面向连接:通信前需要建立连接(三次握手),通信后释放连接(四次握手)
  • 可靠传输:通过序号、确认、重传等机制保证数据可靠传输
  • 全双工通信:双方可以同时发送和接收数据
  • 面向字节流:TCP 不保留应用层数据的边界
  • 流量控制:通过滑动窗口机制控制发送速率
  • 拥塞控制:动态调整发送窗口,避免网络拥塞

TCP 报文段

报文段格式

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Port          |       Destination Port        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Acknowledgment Number                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Data |           |U|A|P|R|S|F|                               |
| Offset| Reserved  |R|C|S|S|Y|I|        Window                 |
|       |           |G|K|H|T|N|N|                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Checksum            |         Urgent Pointer        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Options                    |    Padding    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

首部字段

字段长度说明
源端口2B发送方端口
目的端口2B接收方端口
序号 seq4B本报文段发送数据的第一个字节的序号
确认号 ack4B期望收到对方下一个报文段的第一个数据字节序号
数据偏移4位首部长度,4B 为单位,最大 60B
保留6位保留今后使用
URG1位紧急位,URG=1 时紧急指针有效
ACK1位确认位,ACK=1 时确认号有效
PSH1位推送位,PSH=1 时尽快交付给应用层
RST1位复位位,RST=1 时连接出错需重建
SYN1位同步位,SYN=1 时请求建立连接
FIN1位终止位,FIN=1 时释放连接
窗口2B接收窗口,用于流量控制
校验和2B校验首部和数据(伪首部协议字段为 6)
紧急指针2B紧急数据的末尾在报文段中的位置
选项可变如 MSS(最大报文段长度)
填充可变使首部长度为 4B 的整数倍

TCP 连接管理

TCP 连接的建立——三次握手

  1. 客户机 → 服务器:SYN = 1, seq = x
  2. 服务器 → 客户机:SYN = 1, ACK = 1, seq = y, ack = x + 1
  3. 客户机 → 服务器:ACK = 1, seq = x + 1, ack = y + 1

TCP 连接的释放——四次握手

  1. 客户机 → 服务器:FIN = 1, seq = u
  2. 服务器 → 客户机:ACK = 1, seq = v, ack = u + 1
  3. 服务器 → 客户机:FIN = 1, seq = w, ack = u + 1(服务器数据发完后)
  4. 客户机 → 服务器:ACK = 1, seq = u + 1, ack = w + 1

TCP 可靠传输

序号机制

TCP 对每个字节的数据进行编号,报文段的序号是该段第一个字节的编号。

确认与重传

  • 累计确认:确认号表示期望收到的下一个字节的序号
  • 超时重传:发送方启动重传计时器,超时则重传
  • 冗余 ACK(快速重传):连续收到 3 个重复 ACK,立即重传

超时时间计算

  • RTTs(加权平均往返时间):平滑处理 RTT 测量值
  • RTO(超时重传时间):略大于 RTTs

TCP 流量控制

基于滑动窗口机制:

  • 接收方通过窗口字段告知发送方自己的接收能力
  • 发送窗口大小 = min[接收窗口 rwnd, 拥塞窗口 cwnd]

传输层 vs 数据链路层流量控制:

  • 传输层:端到端,滑动窗口可动态变化
  • 数据链路层:点到点,窗口大小固定

TCP 拥塞控制

发送窗口

四种算法

慢开始(Slow Start)

  • 初始 cwnd = 1(或 MSS)
  • 每收到一个 ACK,cwnd 加倍(指数增长)
  • 当 cwnd < ssthresh 时执行慢开始

拥塞避免(Congestion Avoidance)

  • 当 cwnd ≥ ssthresh 时执行拥塞避免
  • 每经过一个 RTT,cwnd 增加 1(线性增长)

快重传(Fast Retransmit)

  • 收到 3 个冗余 ACK 时,立即重传丢失的报文段
  • 不必等待重传计时器超时

快恢复(Fast Recovery)

  • 快重传后,将 ssthresh = cwnd / 2
  • cwnd = ssthresh(不再从 1 开始)
  • 继续执行拥塞避免

拥塞控制状态图

慢开始(指数增长)→ cwnd ≥ ssthresh → 拥塞避免(线性增长)
     ↑                                          │
     │                                          ↓
     └──── ssthresh = cwnd/2 ←── 快恢复 ←── 3 个冗余 ACK
                                         或超时(cwnd = 1)