IP 分片和组装的具体过程

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不使用剩余两位核心判定规则非末尾分片MF1末尾分片 / 未分片完整报文MF0。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×865528字节完全适配 IP 报文最大长度。二、分片产生的底层背景MTU与MSS约束2.1 什么是MTU最大传输单元Maximum Transmission Unit数据链路层以太网MAC帧规定单次能承载的上层数据最大长度以太网标准MTU1500字节。 这里的 1500 字节特指MAC帧的有效载荷也就是网络层交付给链路层的完整 IP 报文总长度上限。如果 IP 报文超过 1500 字节链路层无法直接传输必须由 IP 层分片。云服务器网口eth0默认MTU1500该数值支持手动配置修改。ens0: flags4163UP,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 0x20link 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 02.2IP、TCP、MAC三层数据长度协同规则IP 标准头部固定 20 字节因此交付给MAC层的 IP 报文最大 1500 字节其中数据载荷最大只能 1480 字节1500-20。IP 层会向上告知 TCP下发的数据段载荷不要超过 1480 字节。TCP 头部标准 20 字节因此 TCP 实际发送的业务数据最大为 1460 字节该数值称为MSS最大段尺寸 Maximum Segment Size。理想场景TCP 严格遵守MSS1460TCP 段 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 字节链路MTU1500单分片最大总长度 1500 字节单片最大数据载荷 1500 - 20 1480 字节统一标识1234所有分片标识完全一致分片规则每一片分片都必须携带完整独立 IP 头部头部复制原始报文 IP 头仅修改Flags、Fragment Offset字段源 IP、目的 IP、版本、生存时间、协议等字段保持不变。分片拆分计算原始载荷 2980 字节单片最多承载 1480 字节载荷第 1 片数据载荷 1480 字节IP 头部 20 字节分片总长 1500 字节MF1后续还有分片真实偏移字节0分片偏移数值 0 ÷ 8 0第 2 片数据载荷 1480 字节IP 头部 20 字节分片总长 1500 字节MF1后续还有分片真实偏移字节1480分片偏移数值 1480 ÷ 8 185第 3 片剩余载荷 2980 - 1480 - 1480 20 字节IP 头部 20 字节分片总长 40 字节MF0最后一片无后续分片真实偏移字节1480 1480 2960分片偏移数值 2960 ÷ 8 370分片核心细节补充不能直接将 3000 字节报文对半拆分后半段若无独立 IP 头部缺少源 / 目的 IP 地址路由器无法路由转发。网络中每一个分片都等同于一份独立完整 IP 报文可独立选路传输。分片头部来源全部复制原始 IP 头部副本仅修改分片相关字段。数据链路层最小载荷适配最后一片仅 20 字节载荷若不满足MAC帧最小载荷要求链路层会自动填充占位字节上层 IP 无需处理。偏移量定义边界片偏移只针对原始报文的数据载荷计算不包含原始 IP 头部 20 字节。四、接收端分片完整组装流程组装分为三步识别分片报文 → 判断分片是否全部收齐 → 按偏移排序重组完整报文4.1 第一步接收端如何判断收到的 IP 报文是分片接收端依靠MF标志、Fragment Offset两个字段联合判定未分片完整报文满足两个条件MF0且片偏移 0只要满足任意一条即为分片报文MF1代表后方存在更多分片片偏移≠0代表该分片不是原始报文的起始数据段哪怕MF0仅末尾分片会出现此情况。4.2 第二步如何判断同一原始报文的分片全部收齐分片分组通过 16 位标识 (Identification)将标识相同的分片归集为一组代表属于同一份原始报文。分片完整性校验必须存在片偏移 0的分片缺失代表首片丢失整组分片直接丢弃必须存在MF0的分片缺失代表末尾分片丢失持续等待超时后丢弃全部分片分片连续校验将所有分片按片偏移升序排序用当前分片真实偏移字节 当前分片载荷长度结果必须等于下一分片真实偏移字节。不相等即代表中间分片丢失整组丢弃。4.3 第三步分片重组完整 IP 报文将归集完成、校验完整的分片按照片偏移从小到大排序剥离每一片的独立 IP 头部只提取分片内部的数据载荷按偏移顺序拼接所有载荷还原原始 2980 字节完整数据重新生成一份标准 20 字节 IP 头部填充原始报文总长度、校验和等字段组装出完整 3000 字节 IP 报文将组装完成的完整 IP 报文向上交付 TCP 传输层。补充特性IP 分片、重组对上层 TCP 完全透明。TCP 下发大数据段只会收到组装完成的完整报文全程感知不到底层分片操作。五、总结分片三大核心字段16 位标识区分同源分片、3 位DF/MF标志控制分片权限与分片收尾、13 位片偏移记录分片数据位置分片根源是链路MTU1500字节限制TCPMSS1460是规避分片的最优方案分片硬性规则所有分片携带独立 IP 头部除末尾分片外载荷长度必须是 8 字节整数倍组装核心逻辑标识分组、偏移排序、连续校验缺任意分片则整份报文失效重传代价高。本次 IP 分片与组装加餐内容到此结束我们下一讲继续新主题。