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分片问题的关键。