IP协议栈在处理IP分片(IP Fragmentation)时,对分片长度的设定遵循一系列规范,这些规范主要由 IPv4 和 IPv6 协议标准定义,特别是 RFC 791(IPv4)和 RFC 2460(IPv6)。以下是关于IP分片长度设定的主要规范:
一、IPv4 分片长度规范(RFC 791)
1. 最大传输单元(MTU)限制
- 每个链路层网络有其最大传输单元(MTU),如以太网的MTU通常为 1500字节。
 - 当IP数据报的大小超过出接口的MTU时,IP层必须进行分片。
 
2. IP头部中的关键字段
IPv4头部包含以下与分片相关的字段:
| 字段 | 长度 | 作用 | 
|---|---|---|
| Identification | 16位 | 标识同一原始数据报的所有分片 | 
| Flags | 3位 | 包含:DF(Don’t Fragment)、MF(More Fragments) | 
| Fragment Offset | 13位 | 指示该分片在原始数据报中的偏移量(以8字节为单位) | 
3. 分片长度的基本要求
- 分片的数据部分必须是8字节的整数倍:
 - 因为 
Fragment Offset字段以 8字节 为单位,所以每个分片(除最后一个)的数据部分必须能被8整除。 - 例如:若MTU=1500,IP头部20字节,则数据部分最多1480字节。但为了满足8字节对齐,实际使用的数据部分为 1480 – (1480 % 8) = 1472 字节。
 - 所以第一个分片可携带1472字节数据,偏移为0;下一个偏移为1472/8=184,依此类推。
 - 最小分片大小:
 - 每个分片必须至少携带 8字节数据(否则无法形成有效分片),加上20字节IP头部,最小分片总长度为28字节。
 - 实际中,大多数链路要求最小帧长更高(如以太网为64字节),因此实际分片不会太小。
 
4. DF位(Don’t Fragment)
- 如果IP头部中 
DF=1,路由器不能对该数据报进行分片。 - 若数据报过大且DF=1,则路由器丢弃该报文,并返回 ICMP “Fragmentation Needed” 错误(类型3,代码4)。
 
5. MF位(More Fragments)
- 除最后一个分片外,所有分片的 
MF=1。 - 最后一个分片的 
MF=0。 
二、IPv6 分片规范(RFC 2460)
1. 禁止在中间路由器上分片
- IPv6 禁止中间路由器对数据报进行分片。
 - 分片只能由源主机进行(使用分片扩展头部)。
 
2. 路径MTU发现(PMTUD)是必须的
- IPv6依赖路径MTU发现机制(PMTUD)来确定整条路径上的最小MTU。
 - 源主机根据PMTUD结果决定是否需要分片。
 
3. 分片扩展头部
- 使用“分片扩展头部”(Fragment Extension Header)来支持分片。
 - 包含:
 - Identificaiton(32位)
 - Offset(13位,同IPv4,以8字节为单位)
 - M flag(1位,表示是否有更多分片)
 
4. 分片对齐要求
- 与IPv4相同,分片偏移以8字节为单位,因此每个分片的数据部分(除最后一个)必须是8字节的整数倍。
 
5. 最小链路MTU
- IPv6规定所有链路必须支持至少 1280字节 的MTU。
 - 实际中推荐使用 1500字节 以太网MTU。
 
三、通用规范总结
| 规范 | IPv4 | IPv6 | 
|---|---|---|
| 是否允许中间路由器分片 | 是 | 否(仅源主机可分片) | 
| 分片最小数据单元 | 8字节对齐 | 8字节对齐 | 
| 分片偏移单位 | 8字节 | 8字节 | 
| 分片标识字段 | 16位 | 32位 | 
| 是否强制使用PMTUD | 否(可选) | 是(推荐或必需) | 
| DF位作用 | 控制是否允许分片 | 无DF位,但PMTUD隐含此功能 | 
四、实际应用中的建议
- 避免分片:分片会增加丢包重传开销、重组失败风险,建议使用路径MTU发现(PMTUD)来避免分片。
 - TCP MSS(Maximum Segment Size):通常设置为 
MTU - IP头 - TCP头 = 1500 - 20 - 20 = 1460字节,以避免IP层分片。 - 防火墙和NAT设备可能丢弃分片包,导致通信失败。
 
五、参考标准
- RFC 791 – Internet Protocol (IPv4)
 - RFC 2460 – Internet Protocol, Version 6 (IPv6)
 - RFC 1191 – Path MTU Discovery (IPv4)
 - RFC 1981 – Path MTU Discovery for IPv6
 - RFC 8200 – Updated IPv6 Specification
 
总结
IP协议栈对分片长度的核心规范包括:
- 分片数据长度必须是8字节的整数倍(由Fragment Offset单位决定);
 - 每个分片包含IP头部+数据部分;
 - IPv4允许路由器分片,IPv6仅允许源主机分片;
 - 使用MTU和PMTUD控制分片行为,尽量避免分片以提高性能和可靠性。
 
合理设计应用数据大小、启用PMTUD、设置合适的MSS,是避免IP分片问题的关键。