IP 分片重组与 TCP 会话重组

server/2025/3/31 20:46:25/

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.ppmy.cn/server/179996.html

相关文章

JavaScript快速入门之函数

引言 总所周知,JavaScript是一个很随便的语言,因此,在学习它的语法的时候,我是和Java语法对比着学的,可能会有些绕 函数 方法:对象(属性,方法) 函数:放在对…

23种设计模式-代理(Proxy)设计模式

代理设计模式 🚩什么是代理设计模式?🚩代理设计模式的特点🚩代理设计模式的结构🚩代理设计模式的优缺点🚩代理设计模式的Java实现🚩代码总结🚩总结 🚩什么是代理设计模式…

干货分享|DeepSeek技术革命、算力范式重构与场景落地洞察

本文为TsingtaoAI公司负责人汶生为某证券公司管理层和投资者教授的《DeepSeek技术革命、算力范式重构与场景落地洞察》主题培训内容,此次主题培训系统阐述了当前AI技术演进的核心趋势、算力需求的结构性变革,以及行业应用落地的关键路径。 现在我们将全…

【Python爬虫】使用python脚本拉取汽车网站品牌数据

示例代码说明: 在汽车之家网站拉取当月排行榜中汽车品牌、销量和价格信息,存为csv文档输出,使用正则表达式获取网页内容 import re import pandas as pd import requests# 汽车之家车型列表页URL url https://cars.app.autohome.com.cn/ca…

【redis】数据类型之Stream

Redis Stream是Redis 5.0版本引入的一种新的数据类型,它提供了一种持久化的、可查询的、可扩展的消息队列服务。 它结合了Redis高性能的特性与持久化能力,支持: 多消费者组模式(Consumer Groups)消息回溯&#xff08…

vue数字公式篇 Tinymce结合使用(二)

继上一篇的数字公式 , 这次的功能是将公式能插入编辑器以及修改 1、Tinymce 自定义 LateX 按钮,打开公式编辑器窗口 LateX.vue window.tinymce.init({...//基础配置这里我就不写了setup(ed) {//自定义 LateX 按钮ed.ui.registry.addButton(LateX, {text:…

vscode连接服务器失败问题解决

文章目录 问题描述原因分析解决方法彻底删除VS Code重新安装较老的版本 问题描述 vscode链接服务器时提示了下面问题: 原因分析 这是说明VScode版本太高了。 https://code.visualstudio.com/docs/remote/faq#_can-i-run-vs-code-server-on-older-linux-distribu…

面试提问:数仓建设中维度退化一般在哪一层做?可不可以不进行维度退化?

前言 面试提问:最近小A同学去某零售公司面试,面试快结束的时候,面试官抛出这么一个问题:数仓建设中维度退化你们是在哪一层做的?小A同学很爽快的回答道,我们通常是在DWD层进行维度退化。接着面试官继续问道:维度退化为什么不在DWS层做?可不可以不进行维度退化?面试结…