0 引言
IP协议之所以如此广泛地被应用于全球,一个重要的原因就是它可以运行于几乎所有链路层之上,如点对点的串行线路、环网FDDI,当然目前支撑IP协议的最普遍的链路层还是以太网。对于点对点的串行线路,只有两个节点,没有物理地址定义的必要;而对于像以太网这样的广播型网络,网络上的每一个节点都会有一个物理地址来唯一标示。
IP层生成的数据报必须通过实际的物理链路层才能变成真正的物理信号发送出去,而往哪里发送,在IP层取决于目的IP地址,但是链路层并不知道目的IP是什么东西,它是按照目的MAC地址发送物理信号的,所以在发送IP数据报之前必须要知道对应的目的MAC地址,这个根据IP找出对应MAC的功能就有ARP协议实现。
1 ARP包格式
上图为以太网上ARP数据报的完整格式,绿色区域就是ARP协议的内容。需要注意的是由于以太网的数据部分大小必须是在46-1500之间,而ARP包只有28个字节,所以需要填充18个字节才能满足要求。
其中ARP对应的以太网帧类型值为0x0806。
ARP协议里,链路层地址类型是以太网,值为1;网络层类型为IP,值为0x800;链路层地址长度为6;网络层地址长度为4;op是区分ARP请求与应答的标志,1表示请求,2表示应答;发送端以太网地址表示发出本次ARP包的主机MAC,发送端IP就是发出本次ARP包的主机的IP地址;目的MAC,目的IP同上,只是表示的是接收端的情况。
2 ARP请求与应答正常流程
下面根据op的类型讨论。
网络拓扑如下:
假设主机A不知道主机B的MAC,那么A要发出arp请求。当op=1,表示是arp请求。arp包中此时目的MAC地址是不知道的,用0x000000000000填充,目的IP是192.168.0.101。
以太网包的目的MAC必须是广播地址0xFFFFFFFFFFFF,以太网的源MAC和arp包的发送端MAC一样都是主机A的MAC,即0xAAAAAAAAAAAA。主要数据如下:
以太帧源MAC: 0xAAAAAAAAAAAA
以太帧目的MAC: 0xFFFFFFFFFFFF
ARP op = 1
ARP发起端MAC:0xAAAAAAAAAAAA
ARP发起端IP:192.168.0.100
ARP目的端MAC: 0x000000000000
ARP目的端IP:192.168.0.101
由于是以太网广播帧,所以交换机上所有的主机(除了发送的主机)(如果有Vlan功能,则必须同一Vlan)都能收到这个帧,收到帧后交予ARP模块处理