ARP¶
简介¶
ARP(Address Resolution Protocol,地址解析协议)
通过ARP获取IP和MAC的映射关系。一般通过广播自己的IP和MAC,或查询远端IP的MAC
在IPv6中,NDP(邻居发现协议)代替ARP
ARP报文格式¶

| ARP报文字段 | 长度 | 描述 |
|---|---|---|
| 硬件类型 | 2字节 | 如以太网(0x0001) |
| 协议类型 | 2字节 | 如网际协议(IP)(0x0800)、IPv6(0x86DD) |
| 硬件地址长度 | 1字节 | 每种硬件地址的字节长度,一般为6(以太网) |
| 协议地址长度 | 1字节 | 每种协议地址的字节长度,一般为4(IPv4) |
| 操作码 | 2字节 | 1为ARP请求 2为ARP应答 3为RARP请求 4为RARP应答 |
| 源硬件地址 | 由硬件地址长度决定,一般6字节 |
发送方MAC地址 |
| 源协议地址 | 由协议地址长度决定,一般4字节 |
发送方IP地址 |
| 目标硬件地址 | 由硬件地址长度决定,一般6字节 |
目标MAC地址 |
| 目标协议地址 | 由协议地址长度决定,一般4字节 |
目标IP地址 |
免费ARP¶
主机主动将自己的MAC和IP信息广播到局域网
使用自己的IP地址作为目的IP地址发送ARP请求。
例如:192.168.1.7主动发送广播ARP(源&目的IP一致的ARP请求)

免费ARP作用¶
-
检测IP地址冲突
当设备接口的协议状态变为Up时,设备主动对外发送免费ARP报文。 正常情况下不会收到ARP应答, 如果收到,则表明本网络中存在与自身IP地址重复的地址。 如果检测到IP地址冲突,设备会周期性的广播发送免费ARP应答报文,直到冲突解除。
-
通告新的MAC地址
更换了网卡后MAC地址变化了,送一个免费ARP刷新其他设备内的动态ARP表
-
在VRRP备份组中用来通告主备发生变换
发生主备变换后,MASTER设备会广播发送一个免费ARP报文来通告发生了主备变换。
ARP请求与应答¶
例如:
1.192.168.1.7通过广播ARP请求查询192.168.1.2的MAC地址

2.192.168.1.2收到请求后,回复应答
3.局域网网内设备不处理不是针对自己IP的请求。
ARP表¶
主机或三层网络设备(路由器)上会维护一张ARP表,用于存储IP地址和MAC地址的映射关系,
一般ARP表项包括动态ARP表项和静态ARP表项。
动态ARP表项¶
- 由ARP报文自动生成和维护,
- 可老化,
- 可被新的ARP报文更新,
- 可被静态ARP表项覆盖。 动态ARP适用于拓扑结构复杂、通信实时性要求高的网络。
静态ARP表项¶
手工添加的IP地址和MAC地址之间固定的映射关系。
静态ARP表项不会被老化,不会被动态ARP表项覆盖。
ARP老化¶
ARP高速缓存¶
为了避免每次通信前,都要发送ARP请求
每台主机或设备上都维护着一个高速ARP缓存
存放最近学习到的IP地址和MAC地址的映射关系
查表流程¶
主机每次发送报文时,
会先在本地高速缓存中查找目的IP地址所对应的MAC地址
如果查到,则不会再发送ARP请求报文,而是直接将报文发至这个MAC地址;
如果查不到,则广播发送ARP请求报文,进行ARP地址解析。
老化¶
由于缓存容量和ARP表项存活时间有限制
动态ARP表项进行老化和更新
老化参数¶
- 老化超时时间、
- 老化探测次数
- 老化探测模式
老化流程¶
动态ARP表项到达老化超时时间后,设备会发送老化探测报文(即ARP请求报文)
如果能收到ARP应答报文,则更新该动态ARP表项
如果若干次请求后仍没有收到ARP应答报文,则删除该动态ARP表项。
设备发送的老化探测报文可以是单播报文,也可以是广播报文。
缺省情况下,设备只在最后一次发送ARP老化探测报文是广播模式,其余均为单播模式发送。
当对端设备MAC地址不变时,可以配置接口以单播模式发送ARP老化探测报文。
当接口Down时(arp请求回复ICMP不可打消息)设备会立即删除相应的动态ARP表项。
linux ARP相关命令¶
| Bash | |
|---|---|
1 2 3 4 | |
linux下多个网口默认不能使用同网段IP¶
由于linux系统里,所有网口默认共用一张路由表
如果两个网口同网段,从一个口出去的报文会被路由到另一个网口出去
Linux内核ARP参数¶
arp_announce¶
控制系统在对外发送arp请求时,如何选择arp请求数据包的源IP地址
参数¶
- 0:(默认)本机所有IP地址都向任何一个接口发送
请求ARP报文。 - 1:尽量仅向该
网卡上的IP作为ARP报文得源IP。 - 2:只向该网卡回应与该网段匹配的ARP报文。
arp_ignore¶
定义对目标地址为本机IP的ARP请求消息的应答模式。
参数¶
- 0:响应任意网卡上接收到的对本机IP地址的arp请求(包括环回网卡上的地址),而不管该目的IP是否在接收网卡上。
- 1:只响应目的IP地址为接收网卡上的本地地址的arp请求。
- 2:只响应目的IP地址为接收网卡上的本地地址的arp请求,并且arp请求的源IP必须和接收网卡同网段。
- 3:如果ARP请求数据包所请求的IP地址对应的本地地址其作用域(scope)为主机(host),则不回应ARP响应数据包,如果作用域为全局(global)或链路(link),则回应ARP响应数据包。
- 4~7:预留。
- 8:不回应所有的arp请求。
修改方法¶
修改/proc文件系统:¶
| Bash | |
|---|---|
1 2 3 4 | |
使用sysctl -w直接写入内存¶
| Bash | |
|---|---|
1 2 3 4 | |
写入配置文件¶
| Bash | |
|---|---|
1 2 3 4 5 6 7 | |
备注¶
arp_ignore和arp_announce参数分别有all,default,lo,eth0等对应不同网卡。
当all和具体网卡的参数值不一致时,配置为较大值的生效。
一般只需修改all和某个具体网卡的参数即可。