
本次主题是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 报文最大长度。
二、分片产生的底层背景:MTU与MSS约束
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 IP、TCP、MAC三层数据长度协同规则
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 头,仅修改
Flags、Fragment 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 分片与组装加餐内容到此结束,我们下一讲继续新主题。