当前位置: 首页 > article >正文

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)重组原理

  • 接收端 根据以下字段重组分片:

    1. Identification:匹配同一数据包的所有分片。

    2. Fragment Offset:按偏移量排序分片。

    3. 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、MFSequence Number、ACK、SACK
处理重叠策略后到覆盖先到(默认)先到优先(默认)或丢弃新数据
协议栈阶段网络层(IP 层)传输层(TCP 层)
超时机制30 秒(Linux)由 RTO(重传超时)动态计算
典型应用场景UDP、ICMP 大包TCP 流式传输(如 HTTP、FTP)

4. 协议栈中的重组阶段

  1. 网卡收包

    • DMA 将数据包拷贝到内核 Ring Buffer。

  2. IP 层处理

    • 检查分片(ip_defrag()),重组后交给传输层。

  3. TCP 层处理

    • 排序乱序数据(tcp_data_queue()),提交到接收缓冲区。

  4. 应用层读取

    • 通过 recv() 从 TCP 缓冲区拷贝数据到用户空间。


5. 关键问题与优化

(1)IP 分片的问题

  • 性能开销:重组消耗 CPU/内存。

  • 安全风险:分片可被用于攻击(如泪滴攻击)。

  • 优化

    • 避免分片:PMTUD(路径 MTU 发现)或设置 DF=1

(2)TCP 重组的挑战

  • 乱序容忍:需合理设置窗口大小和缓冲区。

  • 优化

    • 启用 SACK 减少重传。

    • 调整 tcp_rmem 扩大接收缓冲区。


总结

  • IP 分片重组 在网络层完成,依赖分片字段和超时机制,处理策略通常覆盖后到分片。

  • TCP 会话重组 在传输层完成,依赖序列号和滑动窗口,默认优先保留先到数据。

  • 重叠处理策略 影响安全性和可靠性,需根据场景权衡(如防御攻击 vs. 保证数据正确性)。

  • 协议栈分层 确保各司其职:IP 层负责分片,TCP 层负责流式重组。


http://www.kler.cn/a/611733.html

相关文章:

  • 二分查找模板--从题目中讲解三大二分模板
  • [vue]计算属性
  • WPF ContentPresenter详解2
  • 网损仪详解
  • 比R版本快几十倍| Pyscenic单细胞转录因子预测
  • nVisual对接企业微信实现机房设备与连接变更的自动化审批
  • 硬件防火墙配置与优化:给网络装上最稳的安全阀
  • 深入探索 C++20 中的 std::make_obj_using_allocator
  • 使用Python可视化图结构:从GraphML文件生成节点关系图(lightrag 生成)
  • springcloud项目在框架搭建时的问题的总结
  • 使用HTTP提交git时,每次都要输入用户名和密码的解决方案
  • CentOS 7 宝塔部署
  • 【工具】openEuler 22.03 (LTS-SP3) 如何离线安装 git-lfs
  • Spring Boot集成阿里云OSS:对象存储实战指南
  • OpenBMC:BmcWeb 生效路由2 Trie字典树添加节点
  • vscode profile
  • 7.8 窗体间传递数据
  • 数据结构每日一题day4(顺序表)★★★★★
  • 【计科】从操作系统到虚拟化技术(进程调度,内存映射,设备IO,文件、网络管理)
  • 地图(死亡细胞)