在IPV4网络中,一台设备访问另外一台设备时需要知道目的设备的IP地址,并且IP数据报必须封装成帧才能通过物理网络,因此需要一种机制使IP地址与物理地址之间形成映射关系,ARP协议就是提供这种映射关系的存在。

在实际工作中,经常见到的ARP分为动态ARP、静态ARP和免费ARP。

动态ARP:

由ARP协议通过ARP报文动态学习和维护的,动态ARP表项可以被新的ARP表项更新,可以被静态ARP表项覆盖。且此表项有老化时间,当到达老化时间或者接口被down或者设备重启的情况下会清除此表项,可以通过命令display arp dynamic查看动态学习到的arp表项。




android 手机mac 地址变了 安卓mac地址变化_IP

动态ARP表项



通过ARP表项可以看到某个IP地址对应的MAC地址是多少,该MAC地址是通过哪种方式学习到,是从哪个接口学习到的等信息。

静态ARP:

静态ARP是由管理员手工配置,此表项不会被老化,不会被动态ARP表项覆盖,接口down或者设备重启不会影响此表项,因此静态arp可以增加网络接入的安全性,华为设备通过命令arp static x.x.x.x H-H-H和命令arp static x.x.x.x H-H-H vid x interface GigabitEthernet 0/0/x来配置静态arp表项,前者只是提供ip地址与mac地址的映射,后者可以用于转发,比如当有设备访问静态绑定的设备地址时,如果是静态短绑定,因为只有IP和MAC地址表,设备并不知道该从哪个接口发送出去,于是设备会通过arp请求此地址的出接口等信息,而对于静态长绑定而言,由于绑定信息精确到接口,因此此表项可用于指导转发。对于配置了静态ARP表项的设备,可以通过display arp static 命令来查看设备静态arp表项。

配置方式如下:

arp static 10.0.1.1 5489-980a-1ebc
arp static 10.0.1.2 5489-98fb-605f
arp static 10.0.1.3 5489-98bd-624b
arp static 10.0.1.4 5489-9815-3ab1
arp static 10.0.1.247 5489-98e7-5f6f vid 1 interface GigabitEthernet0/0/3




android 手机mac 地址变了 安卓mac地址变化_封装_02

静态ARP表项



免费ARP:

免费ARP是一种特殊的ARP,它发送端地址与目标地址都是本机IP,此ARP的发送可以检测网络中是否有设备与自己地址冲突,在有vrrp组网的环境中,vrrp网关会定时发送免费arp报文,用于刷新终端的arp表项,还可以防止伪貌网关攻击。




android 手机mac 地址变了 安卓mac地址变化_刷新mac地址命令_03

免费ARP报文



ARP工作原理:

arp主要是在网络中找到目的IP地址对应的MAC地址以完成二层帧的封装,而ARP的工作方式对于同网段和不同网段的场景解析时的操作略有区别。以下图进行ARP解析过程的讲解。




android 手机mac 地址变了 安卓mac地址变化_IP_04

ARP工作原理



①同网段的ARP工作原理

PC1:192.168.1.1访问PC2:192.168.1.2,属于同网段访问,这种场景下的访问流程是:首先PC1用目标地址192.168.1.2与自己的掩码与计算得出目标地址与自己处于同一物理网络,然后查看自己的arp缓存表中是否存在192.168.1.2的表项,如果有相关表项,直接用此表项的MAC地址进行二层帧的封装,如果没有此表项,会在本网段内发送ARP请求报文来获取192.168.1.2对应的MAC地址。报文如下




android 手机mac 地址变了 安卓mac地址变化_缓存_05

ARP请求广播




android 手机mac 地址变了 安卓mac地址变化_缓存_06

ARP请求报文详情



之后,与PC1处于同一物理网络中的设备都会收到此ARP请求报文,但是其它设备用目的地址与自己的地址对比发现不是自己,于是记录下发送者的arp缓存,不回复arp请求,PC2收到了请求后发现是请求自己的MAC地址,于是记录下发送者的ARP缓存,并单播回复PC1 arp应答报文。




android 手机mac 地址变了 安卓mac地址变化_android 手机mac 地址变了_07

ARP应答报文详情



至此,PC1获取到了PC2的MAC地址,可以完成二层帧的封装,通信时就使用该地址进行封装




android 手机mac 地址变了 安卓mac地址变化_封装_08

二层帧的封装



②不同网段的ARP工作原理

PC1与PC3处于不同的物理网络中,首先PC1用目标地址172.0.0.3 与自己的掩码与计算得出目标地址与自己处于不同物理网络中,于是PC1需要通过自己的网关来转发此数据,因此需要知道自己网关的MAC地址,同样也是查找自己的缓存表,如果缓存表里有网关的缓存,则直接使用,否则发送ARP请求网关的MAC地址。

Sep 26 2019 09:40:08.660.1-08:00 AR1 ARP/7/arp_rcv:Receive an ARP Packet(网关收到ARP包), operation : 256, sender_eth_addr : 5489-9800-6f59(发送者的MAC地址是PC1的MAC地址), sender_ip_addr : 1.1.168.192(发送者的IP地址是PC1的IP地址), target_eth_addr : ffff-ffff-ffff(目标广播), target_ip_addr : 254.1.168.192(目标地址是网关)

Sep 26 2019 09:40:08.660.2-08:00 AR1 ARP/7/arp_send(网关回复的ARP报文):Send an ARP Packet, operation : 512, sender_eth_addr : 00e0-fc4f-3431(网关的MAC地址),sender_ip_addr : 254.1.168.192(网关的IP地址), target_eth_addr : 5489-9800-6f59(PC1的MAC地址), target_ip_addr : 1.1.168.192(PC1的IP地址)

PC1获取到了网关的MAC地址便可以完成二层帧的封装,封装的内容如下




android 手机mac 地址变了 安卓mac地址变化_android 手机mac 地址变了_09

使用网关的MAC地址进行二层封装



目标的MAC地址用网关的MAC地址,目标IP地址保持不变,源是自己,当网关收到此数据时,发现二层的目的地址是自己的地址,但是IP地址切不是自己的地址,于是查看自己的路由表发现要到达目的地址,可以通过下一跳10.0.12.2进行转发,而要把数据发送给10.0.12.2还需要10.0.12.2对应的MAC地址用于封装,此时AR1会查看自己的ARP缓存表有没有10.0.12.2对应的表项,如果有,直接使用转发,否则ARP请求10.0.12.2的MAC地址。

Sep 26 2019 09:40:08.824.1-08:00 AR2 ARP/7/arp_rcv:Receive an ARP Packet, operation : 256, sender_eth_addr : 00e0-fc4f-3431, sender_ip_addr : 1.12.0.10, target_eth_addr : 0000-0000-0000, target_ip_addr : 2.12.0.10

Sep 26 2019 09:40:08.824.2-08:00 AR2 ARP/7/arp_send:Send an ARP Packet, operation : 512, sender_eth_addr : 00e0-fc2c-7a73,sender_ip_addr : 2.12.0.10, target_eth_addr : 00e0-fc4f-3431, target_ip_addr : 1.12.0.10

获取到下一跳的地址后,目标MAC地址用下一跳的MAC地址封装,目标IP地址保持不变,当AR2收到数据时,发现目标MAC地址是自己而目标IP地址不是自己,于是查找自己的路由表发现目标地址是自己的直连网段,而要把数据发送给目的地址还需要目的地址的MAC地址,于是查看自己的ARP表项看是否有目标地址的缓存,如果有就直接使用,否则向该网段广播发送ARP请求报文以请求目标地址对应的MAC地址。

Sep 26 2019 09:40:10.764.1-08:00 AR2 ARP/7/arp_send:Send an ARP Packet, operation : 256, sender_eth_addr : 00e0-fc2c-7a74,sender_ip_addr : 254.0.0.172, target_eth_addr : 0000-0000-0000, target_ip_addr : 3.0.0.172

Sep 26 2019 09:40:10.784.1-08:00 AR2 ARP/7/arp_rcv:Receive an ARP Packet, operation : 512, sender_eth_addr : 5489-9805-0dad, sender_ip_addr : 3.0.0.172, target_eth_addr : 00e0-fc2c-7a74, target_ip_addr : 254.0.0.172

获取到目标地址的MAC地址后,用于二层帧的封装,此时源IP地址是PC1的地址,源MAC地址为网关的MAC地址,目的IP地址是PC2的地址,目的MAC地址为PC2的MAC地址,如此ARP工作完成。