ARP协议是什么:
在以太网协议中规定,同一局域网中的一台主机要和另一台主机进行直接通信,必须要知道目标主机的MAC地址。而在TCP/IP协议中,网络层和传输层只关心目标主机的IP地址。这就导致在以太网中使用IP协议时,链路层接收到上层即网络层提供的数据中,只包含目的主机的IP地址。ARP要做的就是根据网络层地址(IP地址)来找寻链路层地址(MAC地址)。
两台设备通信示意图:
对上图中的过程进行简单解释:当设备A想给设备B发送数据时,以HTTP的GET请求为例,应用层将GET请求封装发送给传输层,传输层添加TCP包头后发送给网络层,网络层添加IP包头后发送给链路层,链路层通过子网掩码获知设备B与自己不在同一个network下,需要穿过网关与B通信。那么此时链路层添加链路层包头,链路层包头的destination IP为网关左侧网卡IP即192.168.0.1,destination MAC地址为网关左侧网卡地址即0:18:e7:f3:ce:1a。到达网关右侧时,链路层包头改变,destination IP改为设备B的IP,destination MAC地址为B的MAC地址。
以上过程清晰明了,但是存在一个问题:设备A知道自身IP及MAC地址,知道网关IP,但是如何获知网关左侧网卡的MAC地址。这就是ARP要做的事情。
ARP实现过程:
以下图为例:当client需要它所在network内某一IP对应设备的MAC地址时,首先查看自己缓存的IP、MAC映射表,如果能够查询到,则直接发送到对应MAC地址,如果查询不到,则在整个network上发送广播,广播内容包含自己的IP、MAC地址以及目标IP地址,network内所有设备都会收听到广播,所有收到广播的设备都会更新自己的缓存中设备A的IP、MAC地址,同时,发现广播中目的IP与自身IP一致的设备(该例中为网关)会回复发送广播的设备A自及的MAC地址,设备A获知并更新缓存的网关IP及MAC地址。每台设备的缓存都有有效期,超过有效期将会清除缓存。
一条ARP packet内容(如下图):其中Hardware标明packet发送者链路类型,Protocol标明packet发送者网络协议类型,length标明MAC及IP地址长度,Opcode标明该packet是请求还是回复,下面则是自身IP、MAC地址及目标IP、MAC地址。所有内容以大端顺序存储。
一条请求广播示例:
一条回复示例:
ARP的优点:
要创建自身除外某台设备的IP、MAC映射的唯一方式是收到这台设备的广播或者回复,所以如果某台设备损坏或者退出了这个network群,当过一段时间network内所有设备的缓存过期(几十分钟到几小时)之后,这台设备将在这个network群中消失。这样可以更轻松的debug和寻找问题。
特别注意:
在最初的协议中,回复是单播,但是现在广播也很常见,这样可以更方便的让所有其他设备更新缓存的映射表,并且network中会有很多无端的ARP请求广播,请求不存在的映射,这样也可以方便地让其他所有设备更新映射表。