IP 分片重组与 TCP 会话重组
1. IP 分片重组(IP Fragmentation & Reassembly)
(1)分片原因
-
当 IP 数据包长度超过 MTU(Maximum Transmission Unit)(如以太网默认 1500 字节)时,路由器或发送端会将其分片。
-
分片字段:
-
Identification(16 比特):同一数据包的所有分片共享相同 ID。
-
Fragment Offset(13 比特):当前分片在原始数据包中的偏移量(以 8 字节为单位)。
-
Flags(3 比特):
-
MF(More Fragments)=1
:表示后续还有分片。 -
DF(Don’t Fragment)=1
:禁止分片(如 ICMP 探测包)。
-
-
(2)重组原理
-
接收端 根据以下字段重组分片:
-
Identification:匹配同一数据包的所有分片。
-
Fragment Offset:按偏移量排序分片。
-
MF 标志:若
MF=0
,表示最后一个分片。
-
-
重组策略:
-
重叠分片处理:
-
若分片范围重叠(如恶意攻击或网络异常),协议栈通常选择 后到达的分片覆盖先到达的(Linux 默认策略)。
-
也可选择 丢弃重叠分片(取决于实现)。
-
-
超时机制:
-
若部分分片丢失,重组队列会等待一段时间(如 Linux 默认 30 秒),超时后丢弃所有分片。
-
-
(3)协议栈处理阶段
-
在网络层(IP 层)完成重组,之后将完整数据包交给传输层(如 TCP/UDP)。
-
关键函数(Linux 内核):
-
ip_defrag()
:处理分片重组。 -
ip_frag_queue()
:管理分片队列。
-
2. TCP 会话重组(TCP Stream Reassembly)
(1)重组原因
-
TCP 是面向流的协议,但网络传输可能乱序、丢失或重复。
-
接收端需对数据段(Segment)按序列号(Sequence Number)排序,确保应用层收到有序数据。
(2)重组原理
-
基于序列号(Sequence Number):
-
每个 TCP 段的序列号标识其第一个字节的全局位置。
-
接收方通过 滑动窗口机制 确认连续数据(
ACK
)并缓存乱序数据。
-
-
重组策略:
-
乱序数据缓存:
-
若收到非连续数据(如
Seq=100
先于Seq=50
到达),内核会缓存乱序段,等待缺失数据。
-
-
重叠数据处理:
-
若数据范围重叠(如重传或恶意攻击),TCP 会选择 覆盖旧数据 或 丢弃新数据(取决于实现)。
-
Linux 默认策略:保留先到达的数据(避免重传污染)。
-
-
SACK(Selective ACK):
-
通过 TCP 选项
SACK
精确告知发送方已收到的乱序数据块,减少不必要的重传。
-
-
(3)协议栈处理阶段
-
在传输层(TCP 层)完成重组,排序后的数据存入接收缓冲区,供应用层读取。
-
关键机制:
-
滑动窗口:动态调整接收窗口,控制发送速率。
-
重传队列:管理疑似丢失的数据段。
-
-
关键函数(Linux 内核):
-
tcp_rcv_established()
:处理已建立连接的数据。 -
tcp_data_queue()
:管理数据排序和提交。
-
3. IP 分片 vs. TCP 重组对比
特性 | IP 分片重组 | TCP 会话重组 |
---|---|---|
触发条件 | 数据包超过 MTU | 数据乱序、丢失、重复 |
依赖字段 | Identification、Fragment Offset、MF | Sequence Number、ACK、SACK |
处理重叠策略 | 后到覆盖先到(默认) | 先到优先(默认)或丢弃新数据 |
协议栈阶段 | 网络层(IP 层) | 传输层(TCP 层) |
超时机制 | 30 秒(Linux) | 由 RTO(重传超时)动态计算 |
典型应用场景 | UDP、ICMP 大包 | TCP 流式传输(如 HTTP、FTP) |
4. 协议栈中的重组阶段
-
网卡收包
-
DMA 将数据包拷贝到内核 Ring Buffer。
-
-
IP 层处理
-
检查分片(
ip_defrag()
),重组后交给传输层。
-
-
TCP 层处理
-
排序乱序数据(
tcp_data_queue()
),提交到接收缓冲区。
-
-
应用层读取
-
通过
recv()
从 TCP 缓冲区拷贝数据到用户空间。
-
5. 关键问题与优化
(1)IP 分片的问题
-
性能开销:重组消耗 CPU/内存。
-
安全风险:分片可被用于攻击(如泪滴攻击)。
-
优化:
-
避免分片:PMTUD(路径 MTU 发现)或设置
DF=1
。
-
(2)TCP 重组的挑战
-
乱序容忍:需合理设置窗口大小和缓冲区。
-
优化:
-
启用
SACK
减少重传。 -
调整
tcp_rmem
扩大接收缓冲区。
-
总结
-
IP 分片重组 在网络层完成,依赖分片字段和超时机制,处理策略通常覆盖后到分片。
-
TCP 会话重组 在传输层完成,依赖序列号和滑动窗口,默认优先保留先到数据。
-
重叠处理策略 影响安全性和可靠性,需根据场景权衡(如防御攻击 vs. 保证数据正确性)。
-
协议栈分层 确保各司其职:IP 层负责分片,TCP 层负责流式重组。