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。