0X00 什么是 ARP
首先纠正一种说法,ARP
就是“地址解析协议”,所以严格来说不应该说“ARP 协议”,因为ARP Address Resolution Protocol
就已经包含了Procotol
了,说“ARP 协议”就相当于是“地址解析协议协议”,很鬼畜。
我们知道网络中寻找其他机器需要用到对方的 ip 地址,但是在局域网内两台机器之间通信是不用 ip 地址直接通信的,而是要用到 mac 地址。而且我们一般说的交换机也是二层交换机,现在假设两台电脑插到一个交换机上去,通过 ip 能找到对方吗?显然不能。因为交换机只支持到链路层,然而对于链路层来说它并不知道 ip 是个什么,ip 需要到再上一层的“网络层”才能发挥作用,所以在这种情况下就需要用到 mac 地址来通信了。
当一个数据包需要被发送到某一 ip 地址的机器上去时,最后一步就需要找到 ip 地址对应机器(严格来说是网口)的 mac 地址,从而进行通信。那么在这一步里“通过 ip 地址找到 mac 地址”的解析协议就被称之为:地址解析协议,也就是ARP: Address Resolution Protocol
了。
0X01 ARP 的工作
我们知道 arp 是将 ip 和 mac 地址进行转换映射的,那肯定不是每次都要去转换的,要留个缓存的嘛。我们可以使用 arp -a
来检查当前机器上的 arp 高速缓存表,命令在 Linux 和 macOS 上可用,Windows 上不确定各位可以试试看。我这里是防止隐私问题把一部分数据给人工打码了,正常输出的就是缓存表里每个 ip 对应的 mac 地址。
1 | ? (192.xxx.xxx.1) at 4:xx:xx:xx:xx:0 on en0 ifscope [ethernet] |
ARP 的工作流程也是很简单的,当机器 A 想给 10.0.0.4
发一条数据的时候的时候:
- 检查自己的高速缓存表,发现没找到(有点类似与 DNS 先找
/etc/hosts
的操作) - 机器 A 发出广播“你们谁是
10.0.0.4
, 告诉我你的 mac 地址” - 因为是广播,所以 BCD 都会收到此条数据
- CD 因为不是
10.0.0.4
所以忽略 - B 发现是在找自己,回消息“我是
10.0.0.4
,我的 mac 地址是1:0:2:7f:af:fa
” - A 收到了回馈,并将
10.0.0.4 -> 1:0:2:7f:af:fa
记入自己的缓存表
所以 ARP 概括成一句话就是“广播一条消息:如果你是这个 ip 地址的拥有者,那么请回答你的 mac 地址”。