IP 分片和组装的具体过程

本次主题是IP 分片与组装完整过程

在此之前,我们完整讲解过 IP 报头整体格式,其中有三个关键字段,需要在本篇中深度拆解,这三个字段是支撑 IP 分片功能的核心:

  • 16 位标识 (Identification)

  • 3 位标志 (Flags)

  • 13 位片偏移 (Fragment Offset)

一、分片依赖的三大 IP 头部关键字段

需要重点掌握的三个字段:16 位标识 (Identification)、3 位标志 (Flags)、13 位片偏移 (Fragment Offset),三者协同完成 IP 报文分片、接收端重组。

注意:片偏移 (13 位) 表示本片数据在它所属的原始数据报数据区中的偏移量 (以8字节为单位)

16 位标识 (Identification) 源主机为每一份原始 IP 报文分配唯一标识;如果原始报文被分片拆分,所有分片的id完全相同。接收端依靠相同标识,区分哪些分片属于同一个原始报文,方便后续统一组装。

3 位标志 (Flags) 三位中第一位为保留位(预留扩展,当前固定置 0,不使用);剩余两位核心:

判定规则:非末尾分片MF=1;末尾分片 / 未分片完整报文MF=0

  • DF位(Do Not Fragment,禁止分片):置 1 时代表禁止分片 。若报文长度超过链路MTU,设备直接丢弃报文,不会做分片处理。

  • MF位(More Fragment,更多分片):置 1 代表当前分片后仍有其他分片 ;置 0 代表当前是最后一片分片

13 位片偏移 (Fragment Offset) 表示当前分片数据载荷 在原始报文数据区的起始位置,单位固定为 8 字节

  • 真实字节偏移 = 分片偏移数值 × 8【相当于左移 3 位】

  • **强制约束【规定】:**除最后一片分片外,其余所有分片的数据载荷长度必须是 8 的整数倍,保证分片数据连续无空隙。

  • 设计逻辑: IP 报文总长度为 16 位(最大 65535 字节),13 位偏移仅能存储 0~8191 的数值;将真实偏移除以 8 压缩存储,最大可覆盖8191×8=65528字节,完全适配 IP 报文最大长度。

二、分片产生的底层背景:MTUMSS约束

2.1 什么是MTU(最大传输单元 Maximum Transmission Unit

数据链路层(以太网MAC帧)规定单次能承载的上层数据最大长度,以太网标准MTU=1500字节。 这里的 1500 字节特指**MAC帧的有效载荷** ,也就是网络层交付给链路层的完整 IP 报文总长度 上限。如果 IP 报文超过 1500 字节,链路层无法直接传输,必须由 IP 层分片

云服务器网口eth0默认MTU=1500,该数值支持手动配置修改。

bash 复制代码
ens0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.132  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::20c:29ff:fe9b:4fa0  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:9b:4f:a0  txqueuelen 1000  (Ethernet)
        RX packets 29  bytes 3846 (3.8 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 45  bytes 6153 (6.1 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

2.2 IPTCPMAC三层数据长度协同规则

IP 标准头部固定 20 字节,因此交付给MAC层的 IP 报文最大 1500 字节,其中数据载荷最大只能 1480 字节(1500-20)。

IP 层会向上告知 TCP:下发的数据段载荷不要超过 1480 字节。

TCP 头部标准 20 字节,因此 TCP 实际发送的业务数据最大为 1460 字节,该数值称为**MSS(最大段尺寸 Maximum Segment Size)**。

理想场景:TCP 严格遵守MSS=1460,TCP 段 20 字节头部 + 1460 业务数据 = 1480 字节载荷,加上 IP20 字节头部刚好 1500 字节,三层无分片、传输效率最高。

2.3 强制分片的痛点:丢包概率大幅上升

若 TCP 下发超过 1480 字节的大数据段,IP 层必须执行分片,会产生严重缺陷: 原始报文拆分多片后,任意一片分片丢失,接收端都无法完成组装 ,会直接丢弃所有已收到的同标识分片,TCP 收不到对应ACK应答,触发超时重传。

举例:一份报文拆分为 3 片,单片丢包概率 1%,整体报文丢失概率提升至 3%;分片数量越多,丢包风险越高。因此工程中会尽量规避 IP 分片。

三、实例实操:3000 字节 IP 报文完整分片流程

前置已知条件

  • 原始 IP 报文总长度:3000 字节

  • IP 标准头部:20 字节,原始报文数据载荷 = 3000 - 20 = 2980 字节

  • 链路MTU=1500,单分片最大总长度 1500 字节,单片最大数据载荷 = 1500 - 20 = 1480 字节

  • 统一标识:1234(所有分片标识完全一致)

  • 分片规则:每一片分片都必须携带完整独立 IP 头部 ,头部复制原始报文 IP 头,仅修改FlagsFragment Offset字段;源 IP、目的 IP、版本、生存时间、协议等字段保持不变。

分片拆分计算

原始载荷 2980 字节,单片最多承载 1480 字节载荷:

第 1 片:数据载荷 1480 字节,IP 头部 20 字节,分片总长 1500 字节

  • MF=1(后续还有分片)

  • 真实偏移字节:0,分片偏移数值 = 0 ÷ 8 = 0

第 2 片:数据载荷 1480 字节,IP 头部 20 字节,分片总长 1500 字节

  • MF=1(后续还有分片)

  • 真实偏移字节:1480,分片偏移数值 = 1480 ÷ 8 = 185

第 3 片:剩余载荷 2980 - 1480 - 1480 = 20 字节,IP 头部 20 字节,分片总长 40 字节

  • MF=0(最后一片,无后续分片)

  • 真实偏移字节:1480 + 1480 = 2960,分片偏移数值 = 2960 ÷ 8 = 370

分片核心细节补充

**不能直接将 3000 字节报文对半拆分:**后半段若无独立 IP 头部,缺少源 / 目的 IP 地址,路由器无法路由转发。网络中每一个分片都等同于一份独立完整 IP 报文,可独立选路传输。

**分片头部来源:**全部复制原始 IP 头部副本,仅修改分片相关字段。

数据链路层最小载荷适配: 最后一片仅 20 字节载荷,若不满足MAC帧最小载荷要求,链路层会自动填充占位字节,上层 IP 无需处理。

偏移量定义边界: 片偏移只针对原始报文的数据载荷计算,不包含原始 IP 头部 20 字节。

四、接收端分片完整组装流程

组装分为三步:识别分片报文 → 判断分片是否全部收齐 → 按偏移排序重组完整报文

4.1 第一步:接收端如何判断收到的 IP 报文是分片?

接收端依靠MF标志、Fragment Offset两个字段联合判定:

未分片完整报文满足两个条件:MF=0 片偏移 = 0;

只要满足任意一条,即为分片报文:

  • MF=1,代表后方存在更多分片;

  • 片偏移≠0,代表该分片不是原始报文的起始数据段(哪怕MF=0,仅末尾分片会出现此情况)。

4.2 第二步:如何判断同一原始报文的分片全部收齐?

分片分组 :通过 16 位标识 (Identification),将标识相同的分片归集为一组,代表属于同一份原始报文。

分片完整性校验

  • 必须存在片偏移 = 0的分片:缺失代表首片丢失,整组分片直接丢弃;

  • 必须存在**MF=0**的分片:缺失代表末尾分片丢失,持续等待超时后丢弃全部分片;

  • 分片连续校验:将所有分片按片偏移升序排序;用当前分片真实偏移字节 + 当前分片载荷长度,结果必须等于下一分片真实偏移字节。不相等即代表中间分片丢失,整组丢弃。

4.3 第三步:分片重组完整 IP 报文

  • 将归集完成、校验完整的分片,按照片偏移从小到大排序;

  • 剥离每一片的独立 IP 头部,只提取分片内部的数据载荷;

  • 按偏移顺序拼接所有载荷,还原原始 2980 字节完整数据;

  • 重新生成一份标准 20 字节 IP 头部,填充原始报文总长度、校验和等字段,组装出完整 3000 字节 IP 报文;

  • 将组装完成的完整 IP 报文向上交付 TCP 传输层。

补充特性:IP 分片、重组对上层 TCP 完全透明。TCP 下发大数据段,只会收到组装完成的完整报文,全程感知不到底层分片操作。

五、总结

分片三大核心字段: 16 位标识区分同源分片、3 位DF/MF标志控制分片权限与分片收尾、13 位片偏移记录分片数据位置;

分片根源是链路MTU=1500字节限制,TCPMSS=1460是规避分片的最优方案;

**分片硬性规则:**所有分片携带独立 IP 头部,除末尾分片外,载荷长度必须是 8 字节整数倍;

**组装核心逻辑:**标识分组、偏移排序、连续校验,缺任意分片则整份报文失效,重传代价高。

本次 IP 分片与组装加餐内容到此结束,我们下一讲继续新主题。

相关推荐
coward913 小时前
千兆以太网卡(Ethernet)驱动初始化完成,但是无法udhcpc获取ip
服务器·网络·嵌入式硬件·tcp/ip
Moshow郑锴3 小时前
qlik-cli - Get started with examples
服务器·windows·microsoft
男孩李3 小时前
浅谈Linux的last命令
java·linux·服务器
夫唯不争,故无尤也3 小时前
Ubuntu阿里云服务器一键安装RustDesk指南
服务器·ubuntu·阿里云
遗悲风3 小时前
防火墙双 ISP 出口 IP-Link 链路检测、NAT 与 Web 认证综合实验
tcp/ip·安全·接口隔离原则·防火墙
软件技术员4 小时前
SSL.com 证书:免费单域名 90 天证书
网络·网络协议·ssl
腾霄星月4 小时前
内网横向移动全套实操重点知识总结
网络·安全·网络安全
Web极客码4 小时前
如何在WordPress中添加动态内容
服务器·前端·wordpress
星恒随风4 小时前
Linux 权限详解:从 rwx、chmod 到 umask、目录权限与粘滞位
linux·运维·服务器·笔记·学习