摘要

  • RFC 2390 的新增图例让同一条虚电路出现了两个都正确的号码:A 端用 DLCI 50 发送,B 端以 DLCI 70 接收,因为 DLCI 通常只在各自接口具有意义。
  • 因为网络会改写外层 DLCI,InARP 报文体里的硬件地址在抵达时全部无效;接收接口要把帧头中的 Q.922 地址重建到源硬件地址字段。
  • 重建后的值只证明这帧在本接口以哪个本地坐标到达,并不证明对端是谁、是否获授权、其协议地址是否真实,也不证明端到端结果。

同一条电路,两个本地号码

Inverse ARP 的基本问题并不是 RFC 2390 才提出的。1992 年的 RFC 1293 已经处理了这种情况:一台设备知道某条既有虚电路及其链路层标识,却不知道电路另一端的协议地址。RFC 2390 在 1998 年取代前文时,自己也把改动称为轻微调整:规范用语更正式,新增分组图、7.2 节实例以及安全章节。

真正值得单独书写的是那个实例揭开的命名边界。RFC 2427 同月重申,每条虚电路在每个帧中继接口上由 DLCI 唯一标识;在多数情况下,DLCI 严格只具有本地意义。

所以,A 看见通往 B 的电路是 50,B 看见来自 A 的同一条电路却是 70。A 发帧时把 50 放进帧头,网络穿越途中改写它,B 收到时帧头已经变成 70。电路没有换,观察位置换了。把 50 和 70 看成互相矛盾的“真值”,反而是误解了标识符的作用域。

发送者不能预先知道接收者的坐标

ARP 的报文形状包含源硬件地址、源协议地址、目标硬件地址和目标协议地址。在以太网上,发送者通常知道自己的硬件地址,可以直接填写。但帧中继端点没有一个对所有观察者通用的 DLCI。A 只知道自己接口上通往 B 的号码,不知道 B 的接口会用什么号码表示来自 A 的帧。

RFC 2390 的请求实例因此显得反常:A 通过 DLCI 50 发出 InARP 请求时,ar$sha 源硬件地址是 unknown;目标硬件地址则使用 A 本地已知的 Q.922 形式 0x0C21。报文抵达 B 后,外层帧头显示 DLCI 70。按照文中对 C/R、FECN、BECN 与 DE 位归零的处理,这个本地坐标对应 0x1061。

规范没有把问题说成“字段可能过时”,而是明确说:InARP 报文到达目的地时,其中所有硬件地址都无效;但帧头中的地址是正确的。外层网络为了正确交付而更新了坐标,内层报文却仍保留发送端视角,两层现实由此分叉。

接收接口只修复它亲眼看见的事实

B 从外层帧头取出 0x1061,写入内层的源硬件地址字段。这样,B 的 InARP 处理逻辑看到的不再是 unknown,而是对 B 有意义的本地来源坐标。B 回应 A 时也不能提前填写 A 的到达侧号码;响应中的源硬件地址仍为 unknown,直到 A 收到帧,再从自己的外层帧头取出 DLCI 50 的 Q.922 形式 0x0C21。

RFC 2390 坦率承认,这种处理破坏了分层的“纯洁性”。但有效事实恰好只存在于下层。若为了图示整洁而禁止接口把观察结果投射给上层,留下的只会是格式正确、语义无效的字段。

这个例外被限定得很窄。接口只在入站分组上介入,因为发送端无权替接收端命名。目标硬件地址也不会因为字段对称而被“修好”:它在请求与响应里同样无效,InARP 不依赖它,实现可以填零或忽略。规范只重建有观测依据的那一个字段,没有为其余空格编造意义。

干净的字段仍然只是一份有限证据

重建之后,抓包工具会显示一个完整的 Q.922 源地址。视觉上的完整容易诱使系统把它当作更强的事实。其实它只表达:这帧在这个接收接口上,以这个本地地址到达。

RFC 2390 新增的安全章节把上限写得很清楚。ARP 家族没有认证,主机冒充是已知问题,本文也没有加入额外安全机制。从帧头复制地址不会给报文签名,不会验证回应中的协议地址,更不会授予任何权限。

因此必须保留证据链的层次。外层帧头是入站坐标证据;InARP 回应是对端给出的协议地址陈述;本地软件决定是否把映射写入缓存;老化和失效规则决定它还能用多久;后续转发说明可达性是否仍存在;应用层结果则要由应用自己确认。任何一个记录都不能冒充整条链。

号码注册表只协调语法

今天的 IANA ARP Parameters 注册表仍把 15 记录为 Frame Relay 硬件类型,把 8 与 9 记录为 InARP 请求和回应操作码。注册表的价值是避免共享号码冲突,让实现知道字段如何解释。它不证明某张网络正在部署 InARP,不证明某个回应真实,也不让 DLCI 变成全球名称。

控制权由此被分散在不同层面。标准规定转换规则;IANA 维护代码点唯一性;帧中继网络决定各边界看到的标签;接收接口执行本地重建;对端决定是否回应以及陈述哪个协议地址;本地策略决定是否采用这份陈述。

两个相反方向的越界都危险。若相信未经修复的内层字段,就是把发送端局部视角误作接收端现实。若相信修复后的地址就是对端身份,则又把接收端局部视角升级成全球权威。

一张图拆开了四种记录

RFC 2390 的 A、B、C 图把四样东西分开了:作为关系存在的虚电路、A 端的 50、B 端的 70,以及 B 依据实际入站帧重建出的内层字段。它们相关,但不可互换。

这种纪律并没有随帧中继退出主流而过时。现代系统也充满接口号、隧道标签、会话句柄与缓存键。它们往往只对某个观察者有效。可靠架构不会把局部号码包装成普遍身份,也不会因为分层教科书画得整齐,就拒绝来自真实运行层的纠正。

RFC 2390 选择了很薄的公共规则:规定从哪里取值、修复哪个字段、何时介入。身份、信任和后续使用仍由各自机制决定。最重要的事实来自实际收到的帧,而不是来自一个看起来已经填写、却属于错误命名空间的格子。

来源