Skip to content

方法Method

ARP与IP下一跳的链路地址解析

Address Resolution Protocol · ARP neighbor resolution · 地址解析协议

先由路由表选IP下一跳,再在指定接口解析MAC;复算请求、应答和两跳帧地址,区分ARP缓存、交换表及远端目的地址。

主机知道网页服务器的IP地址,仍未必知道下一帧应填写哪个目的MAC。ARP解决的是一段局域链路上的地址对应关系:给定已经选好的IP下一跳,询问这条链路上哪个MAC持有它。

形式陈述 ​

路由决定问谁,ARP决定帧写给谁 ​

先执行IP最长前缀转发,得到出口接口 e 和下一跳IP h。若目的在该接口直连子网内,h 可以就是最终目的IP;否则通常是网关的IP。ARP缓存以 (e,h) 为键,值为下一跳MAC及有效性状态。跨接口不能仅按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,避免让代答行为混入基本轨迹。

先选IP下一跳,再解析该接口的MAC
例子与边界

两段局域网,分别问一次 ​

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包。完整顺序是:

  1. A查表:B不匹配本地192.0.2.0/24,选择默认路由,下一跳192.0.2.1
  2. A在左LAN广播ARP请求:发送方192.0.2.10/MA,目标IP192.0.2.1
  3. R左接口识别目标为自己,向MA单播应答,给出192.0.2.1/MRL;A缓存左接口上的该对应
  4. A发送数据帧:以太源MA、目的MRL;帧内IP仍是192.0.2.10→198.51.100.20,TTL64
  5. R取出IP包,查右侧直连路由,下一跳就是198.51.100.20;R在右LAN广播ARP请求,发送方198.51.100.1/MRR,目标198.51.100.20
  6. 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下一跳与本地链路地址的分工
关系图谱3 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组