ARP协议

#ARP 协议

ARP 协议的全称是 Address Resolution Protocol(地址解析协议),它是一个通过解析网络层地址来找寻数据链路层地址的网络传输协议,它在 IPv4 中极其重要。是 IPv4 能够正常工作的基础。

ARP 协议与 IP 协议一样,位于网络层,ARP 报文在以太网帧结构中的帧类型字段为0x0806

在 IPv6 中邻居发现协议(NDP)用于代替地址解析协议(ARP)。

#ARP 报文格式

以太网首部:

1
2
3
4
5
struct ether_hdr {
uint8_t target_mac[6];
uint8_t sender_mac[6];
uint16_t ptype; /* equal to 0x0806 */
}

ARP 报文:

1
2
3
4
5
6
7
8
9
10
11
struct arp_hdr {
uint16_t htype;
uint16_t ptype;
uint8_t hlen;
uint8_t plen;
uint16_t opcode;
uint8_t sender_mac[6];
uint8_t sender_ip[4];
uint8_t target_mac[6];
uint8_t target_ip[4];
};

#ARP 表

在每台安装有 TCP/IP 协议的电脑或路由器里都有一个 ARP 缓存表,表里的 IP 地址与 MAC 地址是一对应的,表中的每一行表示在当前局域网中,拥有IP地址的设备的 MAC 地址是MAC地址,如下表所示。

主机名称IP 地址MAC 地址
A192.168.38.1000-AA-00-62-D2-02
B192.168.38.1100-BB-00-62-C2-02
C192.168.38.1200-CC-00-62-C2-02
D192.168.38.1300-DD-00-62-C2-02
E192.168.38.1400-EE-00-62-C2-02

ARP 缓存表采用老化机制,在一段时间内如果表中的某一行没有使用,就会被删除,这样可减少缓存表的长度,加快查询速度。

#ARP 流程

  1. 当发送数据时,主机 A 会在自己的 ARP 缓存表中寻找是否有目标 IP 地址。如果找到就知道目标 MAC 地址为(00-BB-00-62-C2-02),直接把目标 MAC 地址写入帧里面发送就可。

  2. 如果在 ARP 缓存表中没有找到相对应的 IP 地址,主机 A 就会在网络上发送一个广播(ARP request),目标 MAC 地址是“FF.FF.FF.FF.FF.FF”,这表示向同一网段内的所有主机发出这样的询问:“192.168.38.11 的 MAC 地址是什么?”

  3. 网络上其他主机并不响应 ARP 询问,只有主机 B 接收到这个帧时,才向主机 A 做出这样的回应(ARP response):“192.168.38.11 的 MAC 地址是 00-BB-00-62-C2-02”,此回应以单播方式。这样,主机 A 就知道主机 B 的 MAC 地址,它就可以向主机 B 发送信息。同时它还更新自己的 ARP 高速缓存(ARP cache),下次再向主机 B 发送信息时,直接从 ARP 缓存表里查找就可。

#免费 ARP

免费 ARP(gratuitous ARP)是指主机发送 ARP 查询(广播)自己的 IP 地址,当 ARP 功能被开启或者是端口初始配置完成,主机向网络发送免费 ARP 来查询自己的 IP 地址确认地址唯一可用。

作用:

  1. 确定网络中是否有其他主机使用了 IP 地址,如果有应答则产生错误消息。

  2. 免费 ARP 可以做更新 ARP 缓存用,网络中的其他主机收到该广播则在缓存中更新条目,收到该广播的主机无论是否存在与 IP 地址相关的条目都会强制更新,如果存在旧条目则会将 MAC 更新为广播包中的 MAC。