Skip to content

ARP ​


简介 ​

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

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

免费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地址
arp
2.192.168.1.2收到请求后,回复应答
arp 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相关命令 ​

shell
#管理arp缓存
arp
#发送arp请求
arping

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文件系统: ​

shell
echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore
echo "1">/proc/sys/net/ipv4/conf/eth0/arp_ignore
echo "2">/proc/sys/net/ipv4/conf/all/arp_announce
echo "2">/proc/sys/net/ipv4/conf/eth0/arp_announce

使用sysctl -w直接写入内存 ​

shell
sysctl -w net.ipv4.conf.all.arp_ignore=1
sysctl -w net.ipv4.conf.eth0.arp_ignore=1
sysctl -w net.ipv4.conf.all.arp_announce=2
sysctl -w net.ipv4.conf.eth0.arp_announce=2

写入配置文件 ​

shell
#修改/etc/sysctl.conf,
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.eth0.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.eth0.arp_announce=2
#刷新到内存
sysctl -p

备注 ​

arp_ignore和arp_announce参数分别有all,default,lo,eth0等对应不同网卡。
当all和具体网卡的参数值不一致时,配置为较大值的生效。
一般只需修改all和某个具体网卡的参数即可。