IP 分片回答的是:数据报超过这一跳能装下的长度时,谁可以拆开,接收方凭哪些字段拼回去。IPv4 允许分片时,路径上的路由器也可以拆。IPv6 只有源主机可以拆。截至 2026 年 10 月,标识的现行限制在 RFC 6864,IPv6 分片头在 RFC 8200。

片是同一份数据报的几段

一个可独立引用的定义句:IP 分片把一份 IP 数据报的载荷拆到多个 IP 包里,使每一片都不超过当前这一跳能转发的长度。接收方再按标识和偏移拼回原数据报。

它限制的是单次转发的长度,不是带宽。一条链路允许的最大 IP 包长,见 VPN 的 MTU。分片是包已经超过那个长度之后的处理,不是 MTU 这个数字本身。

问题由谁回答
这一跳最多能转发多长链路 MTU,整条路径上取最小的那一跳
超过之后谁来拆IPv4 看 DF;IPv6 只有源主机
拆开的几片如何认成一份标识、偏移、是否还有后续片
不拆、改让 TCP 少装一点MSS 钳制,发生在握手时

IPv4 用头里的四项来对片

RFC 791 把标识定为 16 位,由发送方赋值,用来帮助拼回同一份数据报。标志占 3 位:第 0 位保留且必须为 0;第 1 位是 DF,0 表示可以分片,1 表示不允许分片;第 2 位是 MF,0 表示最后一片,1 表示后面还有。偏移占 13 位,从原数据报的数据部分起算,单位是 8 字节。第一片的偏移是 0。数据要拆开时,必须落在 8 字节的边界上。未分片的数据报是 MF 为 0 且偏移为 0。

重组时,标识与源地址、目的地址、协议字段一起使用(RFC 791)。只看标识不够。

一个可独立引用的定义句:DF 为 1 时,这份 IPv4 数据报不允许在网络中被分片,装不下就可以丢掉(RFC 791)。RFC 6864 再写明:DF 为 1 的数据报不得被分片,中转设备不得清除 DF。只有 DF 为 0 时,才允许在网络中途分片。

源主机可以在发出之前自己拆成若干片。已经带着 DF 为 1 的那一份,下游不能再拆。RFC 8900 把 DF 为 1 的 IPv4 包和所有 IPv6 包都叫做下游不能再拆的包,同时写明源节点仍可以拆。RFC 6864 的「不得被分片」和这句「源节点仍可以拆」字面并不相同。本文把后者理解成:源在生成片时可以拆开;已经带上 DF 为 1 的片,下游不得再拆。这是对两份文档的对照,不是新的规范。

每个 IPv4 目的地必须能接收 576 字节的数据报,可以是一整份,也可以是待重组的片。每个转发模块必须能转发 68 字节而不再拆。68 来自最长 60 字节的头,加上最小 8 字节的片(RFC 791)。这不是路径 MTU 的推荐值。

标识只对还会被拆的包有意义

RFC 6864 更新了标识的用法,并声明这个字段不得用于分片和重组以外的目的。它把数据报分成两类:

类别判定标识
原子数据报DF 为 1,且 MF 为 0,且偏移为 0没有含义。源可以填任意值。检查头部的设备必须忽略它
非原子数据报DF 为 0,或 MF 为 1,或偏移大于 0在一个最大数据报寿命内,对同一源地址、目的地址和协议不得重复

非原子标识的来源包括始发主机、隧道入口和 NAT。隧道入口若发出可能被再拆的外层包,也要遵守这份唯一性。复制一份已经发出的非原子数据报时,不得复用原来的标识。

DF 为 1 同时阻止对已经是片的包再拆。RFC 6864 没有取消接收方处理重叠片的需要:重传若用了同一个标识、又以另一种切法到达,片仍可能重叠。IPv6 对重叠的处理见下一节,两边不是同一句要求。

IPv6 的分片头只由源加上

一个可独立引用的定义句:IPv6 分片头由紧前面那个头的下一个头字段取值 44 来标识。偏移是 13 位无符号整数,单位仍是 8 字节,起算点是原包可分片部分的开头。M 为 1 表示后面还有片。标识是 32 位(RFC 8200 第 4.5 节)。

与 IPv4 不同,路径上的路由器不分片。源要发出超过路径 MTU 的包时,可以自己拆,由接收方重组。每一份被拆的包,源生成一个标识。在包可能存活的时间里,同一源地址和目的地址上,这个标识必须不同于最近发出的其他已分片包。这里的唯一性按地址对,不按协议号。若有路由头,看的是最终目的地址。

每一片都带上逐片头部:IPv6 头,以及若存在的逐跳选项、位于路由头之前的目的选项、路由头,再加上分片头。扩展头和上层头必须出现在第一片。后续片不再重复这组上层头。

重组只使用源地址、目的地址和分片标识都相同的片。拼回之后的包里没有分片头。从收到第一片起 60 秒内不够拼齐,就必须放弃,并丢掉已经收到的片。片与片重叠时,也必须放弃并丢掉全部已收片,且不应发送 ICMP 差错。网络里可能出现完全相同的重复片;实现可以把这种完全重复丢掉,同时保留同一包的其他片。不同片在分片头之前的头部,内容和数量都允许不一样。

偏移和 M 都为 0 时,这是一整份数据报,应按已经拼好的包处理,并与其他标识相同的片分开。RFC 6864 在介绍 IPv6 时还引用了已被取代的 RFC 2460,其中包含「收到下一跳 MTU 小于 1280 的包太大报文时要带上分片头」的旧要求。RFC 8200 的变更说明写明已经删掉这段。因此不能把那句旧要求写成 2026 年 10 月的现行规则。

IPv6 要求互联网上每条链路的 MTU 至少 1280 字节。链路本身装不下时,要在 IPv6 下面的层做分片和重组。节点必须能接受重组后达到 1500 字节的分片包,也允许接受更大的。依赖 IPv6 分片、又要发送超过路径 MTU 的上层协议,若没有把握对端能重组,就不应当发送重组后超过 1500 字节的包。

它和探包、钳制各管一步

经典路径 MTU 发现靠的是禁止再分片,加上 ICMP「包太大」。分组层探包则用确认来试包长,见 路径 MTU 探包。TCP 在握手时预先缩小单段载荷,是另一条少依赖这条 ICMP 的路,见 TCP MSS 钳制。三件事可以同时存在:钳制缩小了 TCP 段,UDP 仍可能大过路径,源或路由器再把那个 UDP 包拆开。

RFC 8900 解释分片为何脆弱,并写明自己不建议废止分片。它建议新的协议和应用不要依赖 IP 分片;依赖分片的旧协议应当去掉这层依赖。同一节把 IPsec 隧道模式和 IP-in-IP 封装举成「有时没有可行替代」的例子,并说应用和协议不一定知道下层是不是正依赖这种分片。IP-in-IP 的具体策略,该文档指向 RFC 4459,本文不复述。

DNS 把装不下的应答标成截断,是报文自己的标志,见 DNS 截断位。IP 层把同一份 UDP 拆成多片,是另一条路:片若丢失,接收方看不到一份带截断位的 DNS 报文。

隧道里可能拆的是两层中的一层

封装生成一份新的外层 IP 包。外层若被拆开,片的目的地址是隧道对端,重组发生在拆封装之前。内层若先被拆开,每一片再各自封装,内层的重组发生在内层目的地。哪一层先被拆,取决于当时谁发现下一跳装不下,以及外层或内层的 DF。某一客户端在 2026 年 10 月先拆哪一层,本文没有测量。

IPv6 要求上层头必须在第一片。IPv4 由于头部长度,上层头通常也在第一片,这是 RFC 8900 的观察,不是一条「必须」的新要求。后续片往往看不到端口。出口若在拆隧道之后改写传输标识,就不能只靠后续片里的端口来认会话。标识的唯一性因此也约束 NAT,见 出口 NAPT。运营商在更外面再做的那一层地址共享,见 CGNAT。RFC 8900 提到这种设备要翻译分片地址时会用到虚拟重组,并写明虚拟重组费状态、也怕被耗尽。本文不复述那个算法。

一个可独立引用的结论句:隧道在工作,只说明多了一层外层包。它既不表示已经发生分片,也不表示重组一定发生在 VPN 服务器上。

本文不提供修改 DF、调整接口长度或关闭分片的步骤。

现象对照

现象更可能先看什么
小包能到,接近链路长度的包消失路径长度或 ICMP「包太大」,不一定已经分成了片
同一标识下只有偏移为 0 的片后续片丢失,或还在 60 秒的 IPv6 重组窗口里
IPv6 包带分片头,沿途路由器声称自己拆过与 RFC 8200 不符。分片头应由源加上
外层地址是 VPN 对端,片在对端之前到齐拆的是外层,重组在拆封装之前
内层目的地才拼齐,外层每片都是完整 IP 包先拆了内层,再逐片封装

核对清单

  1. 先看谁有权拆:IPv6 只有源;IPv4 要 DF 为 0,下游才可以拆;
  2. DF 为 1 不能被清掉:中转设备不得清除这一位,也不得拆这份数据报;
  3. 原子数据报的标识没有含义:DF、MF 和偏移三者一起判定,不能单看标识是否为 0;
  4. 两套重组键不一样:IPv4 含协议号,IPv6 不含;IPv6 从第一片起算 60 秒;
  5. 隧道有两层可拆:外层在对端重组,内层在内层目的地重组。