“选出出口和IP下一跳后,ARP邻居解析再取得该接口上的目的MAC。表从哪里来则另看距离向量、链路状态和BGP路径向量与策略:它们分别展开旧估计回传、混合数据库版本和局部偏好不收敛的轨迹,不能…”
主机知道网页服务器的IP地址,仍未必知道下一帧应填写哪个目的MAC。ARP解决的是一段局域链路上的地址对应关系:给定已经选好的IP下一跳,询问这条链路上哪个MAC持有它。
形式陈述
路由决定问谁,ARP决定帧写给谁
先执行IP最长前缀转发,得到出口接口
本页取以太网承载IPv4,单个接口只对应一个未标记的广播域,不含代理ARP、地址冲突检测或隧道。一次普通ARP请求包含发送方IP/MAC和目标IP;外层以太目的地址为全1广播地址。请求里的目标硬件地址尚未知,可以填零;RFC826并不要求它等于以太广播地址。
拥有目标IP的节点可向请求者单播ARP应答,提供自身IP/MAC。ARP消息直接由以太帧承载,EtherType为0x0806;它不是先装进一个IPv4包再发送。IPv4数据帧的EtherType为0x0800,后续数据和地址解析应分开计数。
请求者的最小状态
对一个邻居键,可用“未知、等待解析、已解析”描述请求者:缓存有效时直接封装数据;未知时发请求并暂存有限数量的数据;应答提供可用映射后发送暂存数据;重试预算用尽则报告本次邻居解析失败。队列上限、重试间隔、缓存老化是实现策略,本页不把某个数值说成RFC826的固定要求。
同一邻居有多份待发IP包时,可以合并解析请求;这不使ARP应答变成数据包已送达的确认。应答只给出链路地址映射,后续以太帧仍可能丢失。
直觉
给远方收件人送信,先找到本地下一站
若A与B不在同一IP子网,A不能靠一次局域网广播询问远端B。A把IP包的最终目的保留为B,同时把第一段帧的目的填成网关的MAC。网关拆掉第一段帧,再按自己的路由表选择第二段的下一跳。
广播域限定了谁能听见ARP请求。普通路由器不会把左接口收到的ARP广播原样传播到右接口;否则“某个IP在哪条本地链路上”的回答会失去接口范围。这里假设没有代理ARP,避免让代答行为混入基本轨迹。
例子与边界
两段局域网,分别问一次
A的地址为192.0.2.10/24,MAC记为MA。路由器R左接口为192.0.2.1、MAC为MRL;右接口为198.51.100.1、MAC为MRR。B为198.51.100.20/24、MAC为MB。A有经192.0.2.1的默认路由,R有两个直连子网,所有ARP缓存初始为空。
A要发送一个目的为B、TTL为64的IPv4包。完整顺序是:
- A查表:B不匹配本地192.0.2.0/24,选择默认路由,下一跳192.0.2.1
- A在左LAN广播ARP请求:发送方192.0.2.10/MA,目标IP192.0.2.1
- R左接口识别目标为自己,向MA单播应答,给出192.0.2.1/MRL;A缓存左接口上的该对应
- A发送数据帧:以太源MA、目的MRL;帧内IP仍是192.0.2.10→198.51.100.20,TTL64
- R取出IP包,查右侧直连路由,下一跳就是198.51.100.20;R在右LAN广播ARP请求,发送方198.51.100.1/MRR,目标198.51.100.20
- B向MRR单播应答;R得到MB,发送以太源MRR、目的MB的数据帧,IP端点保持不变,转发后的TTL为63
忽略重试和无关帧,一共出现两份ARP请求、两份ARP应答和两份承载该IP包的数据帧。两份请求分别限制在左右广播域,并没有一份从A跨过R到B。
A的缓存不需要因此出现B→MB;A发送后续去B的包仍只需要本地下一跳MRL。R则在两个接口分别保存A/MA和B/MB一类邻居关系。是否已经学到A取决于接收处理,不能把整个网络的映射想成一张全局ARP表。
接收者也可以从请求学习
RFC826的接收算法不是“只有应答才学习”。先检查硬件/协议类型等可处理条件;若发送方协议地址已有表项,先更新其硬件地址。随后判断目标协议地址是否是自己;是自己而发送方尚不在表中时,再加入发送方映射。若该消息还是请求,就生成应答。
因此,上例R左接口可在收到A的请求时学到A/MA,B也可在收到R右接口的请求时学到R/MRR。反过来,一个仅旁听到、目标不是自己的请求,并不按这份基本算法无条件为陌生发送方新建表项;已知发送方的更新与未知发送方的插入有不同条件。
路由错了,解析成功也救不了
若A误配了一个不通向B的网关,但那台网关确实回应ARP,A仍可能成功发出第一段以太帧。ARP成功只说明已取得下一跳MAC,不证明该下一跳能继续抵达B。无路由、邻居解析失败、远端无响应,应分别定位。
普通ARP消息本身也没有为IP/MAC绑定提供密码学真实性证明。收到一份格式有效的映射,不等于验证了发送方有权声明该IP;需要额外网络信任或防护时,不能从本页状态机推导已经具备认证。
推论与应用
三个表分别回答三个问题
路由表回答“目的IP应从哪个接口、交给哪个IP下一跳”;ARP缓存回答“在这个接口上,该下一跳IP对应哪个MAC”;交换机FDB回答“目的MAC应走哪个桥端口”。三者可能同时参与一份包的传送,但清空其中一张表不会自动清空另外两张。
主机迁移或网卡更换后,旧ARP缓存可能仍指向旧MAC,桥的FDB也可能仍指向旧端口。排查时应逐层核对键和更新时间。IPv6使用自己的邻居发现机制;把本例IPv4地址换成IPv6文本,并不构成一个可用的IPv6协议轨迹。
参考资料
- David C. Plummer,1982,RFC826:An Ethernet Address Resolution Protocol,章节“Packet Generation”“Packet Reception”“Related issue”:路由先提供下一跳、请求/应答字段、先合并已知发送方及老化问题;两段地址与计数是本文自建例
- Larry L. Peterson、Bruce S. Davie,Computer Networks: A Systems Approach,§3.3.6 Address Translation (ARP),Address Translation:IP下一跳与本地链路地址的分工