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 | 接收方端口 |
| 序号 seq | 4B | 本报文段发送数据的第一个字节的序号 |
| 确认号 ack | 4B | 期望收到对方下一个报文段的第一个数据字节序号 |
| 数据偏移 | 4位 | 首部长度,4B 为单位,最大 60B |
| 保留 | 6位 | 保留今后使用 |
| URG | 1位 | 紧急位,URG=1 时紧急指针有效 |
| ACK | 1位 | 确认位,ACK=1 时确认号有效 |
| PSH | 1位 | 推送位,PSH=1 时尽快交付给应用层 |
| RST | 1位 | 复位位,RST=1 时连接出错需重建 |
| SYN | 1位 | 同步位,SYN=1 时请求建立连接 |
| FIN | 1位 | 终止位,FIN=1 时释放连接 |
| 窗口 | 2B | 接收窗口,用于流量控制 |
| 校验和 | 2B | 校验首部和数据(伪首部协议字段为 6) |
| 紧急指针 | 2B | 紧急数据的末尾在报文段中的位置 |
| 选项 | 可变 | 如 MSS(最大报文段长度) |
| 填充 | 可变 | 使首部长度为 4B 的整数倍 |
TCP 连接管理
TCP 连接的建立——三次握手
- 客户机 → 服务器:
SYN = 1, seq = x - 服务器 → 客户机:
SYN = 1, ACK = 1, seq = y, ack = x + 1 - 客户机 → 服务器:
ACK = 1, seq = x + 1, ack = y + 1
TCP 连接的释放——四次握手
- 客户机 → 服务器:
FIN = 1, seq = u - 服务器 → 客户机:
ACK = 1, seq = v, ack = u + 1 - 服务器 → 客户机:
FIN = 1, seq = w, ack = u + 1(服务器数据发完后) - 客户机 → 服务器:
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)