摘要

  • RFC 3021 规定,在使用 31 位掩码的 IPv4 点到点链路上,主机位为零和为一的两个值都必须解释为端点地址。
  • /31 把每条编号链路的地址消耗从四个降到两个,但配置无法自行证明链路只有两个参与者,也无法证明两端代码采用相同解释。

IPv4 地址通常被拆成网络部分和主机部分。主机位全零长期对应子网本身,全一则对应定向广播。按照这套规则,一个 /30 有四个值,却只有中间两个可以分给接口。

点到点链路的现实不同。它只有两个可能端点。一端发送的帧只能到达另一端,不存在需要用定向广播一次选中多个本地节点的集合。RFC 3021 因而把掩码延长到 31 位,只留下一个主机位。零和一不再被扣除,而是分别成为两个路由器的地址。

位没有改变,解释它的条件改变了。这是 RFC 3021 最值得保留的历史意义。

地址节省依赖链路事实

在传统 /30 下,500 条点到点链路消耗 2,000 个地址;采用 /31 后只需 1,000 个。RFC 用当时的说法把节省量换算为四个 class C 地址空间。相比不编号链路,这种方式仍给接口留下可管理、可调试的地址;相比在 PPP 两端使用来自不同网络的主机地址,它也保留了一个直观的共同前缀。

但掩码只是配置,不是拓扑测量。把 /31 写进共享以太网接口,不会把第三个参与者赶走。把同样的命令写到两台设备上,也不证明它们运行的版本都支持 RFC 3021。

标准明确提醒:如果只有一端支持 31 位前缀,链路可能无法正确工作。一端会把全一主机位当作邻居,另一端可能仍把它归入广播规则;全零值也可能在旧路径中遭到丢弃。配置对称,运行语义却不对称。

两个值都分给端点后,定向广播没有位置

一个 /31 只有两个编号可能,而两个都属于端点。链路不再拥有定向广播地址。需要广播流量时,应使用有限广播。远端路由器仍按无类别前缀转发;真正决定某个值是广播还是本机地址的,是与目标网段直接相连的路由器。

去掉定向广播带来有限的安全收益。smurf 类攻击利用广播复制放大流量;RFC 2644 已要求路由器默认关闭定向广播接收。RFC 3021 进一步让这些点到点链路根本没有相应地址。它没有认证邻居,没有保护路由协议,也没有消除其他拒绝服务手段。

窄例外没有废除旧规则

RFC 950 已讨论过一位宽主机字段,也说明两个值都背负传统特殊含义。RFC 1122 与 RFC 1812 则规定主机和路由器如何处理全零与全一形式。RFC 3021 对这些规则作了精确修订:当地址属于带 31 位掩码的点到点端点时,它可以作为源地址,也必须在目的端被当作本机地址交付。

在其他链路类型上,原来的丢弃或广播行为继续成立。因此,把 /31 描述成“违规使用网络地址和广播地址”并不准确。标准不是忽略保留含义,而是在一个不需要那些角色的环境中重新定义它们。

控制平面成功仍不是交付收据

RFC 3021 记录了若干路由器厂商的 beta 实现,以及至少三家 ISP 对 OSPF、IS-IS、BGP 和 EIGRP 的正面测试。这是 2000 年的有限运行证据,不是所有厂商、所有版本或今天部署规模的证明。

邻接建立说明某条控制路径成功。它不证明管理系统能接受这两个地址,不证明 ACL 或监控库不会把它们重新归为特殊值,也不证明数据路径双向无误,更不证明远端应用获得结果。地址配置、拓扑、实现、路由和交付必须分别留证。

来源

Lu Heng 并非 RFC 3021 的作者,也没有为其背书;本文只公开使用其分析框架。