IP协议栈在进行IP分片重组时注意事项

IP协议栈在处理IP分片(IP Fragmentation)时,对分片长度的设定遵循一系列规范,这些规范主要由 IPv4IPv6 协议标准定义,特别是 RFC 791(IPv4)和 RFC 2460(IPv6)。以下是关于IP分片长度设定的主要规范:


一、IPv4 分片长度规范(RFC 791)

1. 最大传输单元(MTU)限制

  • 每个链路层网络有其最大传输单元(MTU),如以太网的MTU通常为 1500字节
  • 当IP数据报的大小超过出接口的MTU时,IP层必须进行分片。

2. IP头部中的关键字段

IPv4头部包含以下与分片相关的字段:

字段长度作用
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隐含此功能

四、实际应用中的建议

  1. 避免分片:分片会增加丢包重传开销、重组失败风险,建议使用路径MTU发现(PMTUD)来避免分片。
  2. TCP MSS(Maximum Segment Size):通常设置为 MTU - IP头 - TCP头 = 1500 - 20 - 20 = 1460 字节,以避免IP层分片。
  3. 防火墙和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分片问题的关键。

此条目发表在linux文章分类目录。将固定链接加入收藏夹。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注