摘要
- IPv4选项类型字节的最高位不是装饰:零表示只放入首片,一表示复制进所有分片。
- 分片器必须派生而非克隆首部;后续片可能删除非复制选项,缩短IHL,并重新计算长度、偏移、MF与首部校验和。
- Copy为一只分配随行责任,不证明选项被执行、未被沿途改写或最终送达;重组时完整非复制状态仍以零偏移片为准。
三个碎片不需要穿同样长的外套
把一个带选项的数据报想成一张附有两种指令的长纸。纸太长,下一段链路容不下,IPv4模块必须把数据部分切开。最省事的实现似乎是把原首部复印三份,再改长度和偏移。然而IPv4没有选择这种盲目复制。
RFC 791把每个选项的类型八位组拆成三段:一位Copy、两位Class、五位Number。Copy为零时,选项只复制到第一片;为一时,选项复制到所有片。这里的“第一”不是最早到达接收方,而是包含原数据偏移零的那一片。
类型131的Loose Source and Record Route将最高位设为一。它所携带的转发约束可能需要每个后来独立穿越路由器的碎片都能读取。类型7的Record Route将最高位设为零;它留下的观察状态只随零偏移片前进。分片发生后,后续碎片的首部可以少掉类型7,于是IHL也随之变小。
这让“同一数据报”与“相同首部”分开。重组身份依靠地址、协议、Identification、偏移等规则建立,而不是要求每片的选项集合、IHL、总长度、MF位和校验和完全相同。分片是一次有语义的转换,不是剪刀加复印机。
1980年的规范已经要求选择性保管
1980年1月的RFC 760在RFC 791之前已经说明,有些选项需要复制到所有碎片,有些只属于第一片。它描述生成下一片时对Internet首部进行选择性复制,并对新首部重新计算必要字段。
一年后的RFC 791把这条规则压进选项类型本身。分片模块不必维护一张外部的、人为解释的例外表;它可以从类型字节读取可本地验证的一位指令。共享语法极小,却足以让不同实现对派生首部采取一致行动。
但“最小”不等于“粗糙”。第一个碎片由原首部复制而来,后续碎片要选择性构造。移走不复制的选项会改变首部长度;装入的负载数量会改变总长度;片在原数据报中的位置进入Fragment Offset;是否还有后续片体现在More Fragments;每次首部改动都要求新的Header Checksum。
因此抓包里两片IHL不同,不能单凭这一点判为伪造。相反,如果后续片保留了本应只在首片出现的选项,或者丢掉了Copy为一、按规范必须随行的选项,才出现需要进一步解释的偏差。
Copy位分配的是职责,不是价值等级
容易误读的一点是把一当成“重要”、零当成“次要”。选项表并不支持这种排序。Record Route类型7与Timestamp类型68都为Copy零;Loose Source and Record Route类型131、Strict Source and Record Route类型137与Stream Identifier类型136为Copy一。历史上的Basic Security Option类型130也设为一,但其安全标签语义属于另一篇文章。
Copy零不表示记录路由或时间戳无意义。它只表示这些选项的语义不要求在每片独立转发时都复制一份。全部原始选项仍出现在零偏移片中。Copy一也不赋予可靠、优先、认证、机密性或送达保证;它只是告诉分片器,在生成后续首部时不要把这一项省掉。
IANA IPv4参数登记表今天仍把Copy、Class、Number、十进制值、名称与参考文档分列。登记表能证明类型号及其规范归属,却不能证明某种选项仍被广泛发送、路由器正确处理了它,或者到达时字节仍与分片瞬间完全相同。
被复制的选项也可能在路上各自改变
“复制到所有片”很容易被缩写成“每片携带相同字节”。这在分片动作刚完成时可能成立,对到达端却未必成立。RFC 815讨论重组时指出,不同碎片可以走不同路径。带有记录功能的源路由选项在不同路径上可能被不同路由器写入,因此各片到达时保存的路径状态可以分叉。
规范给出的重组处理以第一片记录的返回路由为准,忽略其他碎片中产生的替代版本。这一规则暴露了Copy位的限度:它保证每片拥有继续转发所需的选项容器,不保证所有副本最终形成一个可合并的历史,更不允许接收方把九份不一致的观察简单投票成事实。
来源与记录因此要分开。类型与初始内容来自原数据报;分片器创造副本;沿途路由器可能在被授权的字段内追加状态;重组器再选择规范指定的权威版本。只保存最终某一片的字节,而不保存偏移、到达关系与重组决定,会把这条来源链压扁。
零偏移片决定完整首部有多大
RFC 815还指出一个实用后果:如果非零偏移片先到,接收方可能不知道重组数据报最终的首部长度。原因不是网络把长度弄丢了,而是后续片合法地不含Copy零选项。只有零偏移片带来完整原始选项集合。
所以“首片”必须按偏移定义,不能按到达顺序定义。第三片可以第一个抵达;它仍无权宣称自己的较短IHL就是最终首部的大小。缓存与检查器若把第一份看见的碎片提升为完整权威,会把允许的局部视图误当成整个对象。
RFC 6274在讨论IPv4安全检查时保留了这条边界。某些对重组后传输首部长度的检查需要零偏移片的IHL。如果它尚未到达,实现只能做初步检验,并应在完整首部出现后重新应用严格条件。暂时可计算,不等于结论已经封闭。
End与NOP提醒我们:复制单位也需要语法
IPv4选项区域还有End of Option List与No Operation。它们用于结束与对齐,不应被粗暴描述成普通业务选项的复制开关。分片器构造较短的后续首部时,可能需要删除或加入对齐相关八位组,使首部仍符合32位边界。
这说明选择性复制的对象不是随意截取的原始字节区间,而是按选项语法解析后的结构。若实现不认识长度字段、在一个多字节选项中间切断,或者删除选项后不重新封闭与对齐,Copy位本身也救不了首部。
共同层虽薄,仍需完整语法。最小规范的含义是只共同规定必须共同的东西,不是容许每个实现用猜测代替解析。
后来的脆弱性没有抹去原设计的边界
RFC 8900把IPv4规则概括得很清楚:所有选项都出现在第一片,Copy位为一的选项才出现在后续片。文档同时总结了分片面对中间盒、过滤器、丢包和重组资源时的脆弱性。
这些后来的经验不能倒推成“Copy位从未工作”或“所有分片都会失败”。RFC 8900不是流量普查。它证明的是系统边界会被部署现实施压:只看到后续片的设备拥有的语义少于看到零偏移片的设备;只解析固定首部长度的策略也可能误判合法差异。
IPv6后来把分片限制在源端,并把每片都需携带的首部与只在第一片承载的其余首部区分开来。RFC 8200提供了一种架构对照,却不应抢走本文主题。IPv4的历史问题不是“为什么没有照抄IPv6”,而是它如何在允许中途路由器分片的条件下,把选项语义分配给派生片。
分片器可能是源,也可能是路由器
开头选择路由器,是因为它能把控制边界画得最清楚:原发送端已经交付一个完整数据报,途中节点面对较小MTU,必须在不拥有应用内容解释权的情况下生成多个合法IPv4对象。但IPv4分片并不只发生在路由器。源端也可以生成碎片;具体是否允许还受Don't Fragment等字段与路径条件约束。
无论谁动刀,它取得的权限都很窄:按规范拆分负载,维护重组字段,依据Copy位派生选项集。它没有因此取得改写Record Route历史、把Copy零升级成无意义、或把安全选项解释为加密的权力。
这正是运行代码中的权限边界。分片器能验证一位规则并执行必要转换;接收方能从零偏移片恢复完整非复制状态;其余选择留在各自位置。无需让一个持续在线的中心机构逐包批准,也无需把所有选项都塞进每个碎片来假装一致。
证据链必须容纳合法的不一致
一次合格调查至少应关联源地址、目的地址、协议、Identification、Fragment Offset、MF、IHL、选项类型及其Copy位。只有这样,分析者才能区分三种情况:按规范删除了Copy零选项;错误丢失了Copy一选项;或恶意/缺陷实现制造了互相矛盾的碎片。
校验和正确只证明各自首部在该算法下自洽,不证明各片组合后语义正确。每片都有合法校验和,也可能缺少规范要求的随行选项;每片选项相同,也可能意味着分片器错误复制了本应只在首片出现的状态。
零偏移片缺失时,分析结果应保持未决。把“尚未见到完整选项集合”写成“原数据报没有这些选项”,是把采集缺口变成历史结论。RFC 815与RFC 6274给出的更诚实方法是:先做可逆的初步判断,待权威片到达后重新验证。
来源与证据边界
本文依据RFC 760、RFC 791、RFC 815、RFC 1122、RFC 1812、RFC 6274、RFC 8900、RFC 8200与IANA IPv4参数登记表。它们证明规范机制、历史演进及受限的运行风险,不证明当代选项流量、某产品的一致性、任一攻击发生率或每条路径的实际分片行为。
会员简报
档案背景详情
使用相应会员等级登录,即可解锁完整简报与来源注释。
仅限 Strategic Circle
Strategic Circle
所有读者均可浏览。加入并登录后可解锁档案简报。
加入 Strategic Circle仅限 Leadership Alliance
Leadership Alliance
符合条件的 IP 资产所有者和管理层可登录查看 Leadership Alliance 简报。
加入 Leadership Alliance
