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头部包含以下与分片相关的字段:
data-ad-format="fluid" data-ad-layout-key="-7k+ex-4a-9w+4a">字段长度作用Identification16位标识同一原始数据报的所有分片Flags3位包含:DF(Don’t Fragment)、MF(More Fragments)Fragment Offset13位指示该分片在原始数据报中的偏移量(以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。
三、通用规范总结
规范IPv4IPv6是否允许中间路由器分片是否(仅源主机可分片)分片最小数据单元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分片问题的关键。