引言
设备驱动程序(链路层)从不检查IP数据报中的目的IP地址。
链路层把以太网数据帧发送到另一台主机时,是根据MAC地址来发送的。而不是根据IP地址,因为IP地址是IP层使用的,而链路层不关心IP,只关心MAC地址。设备驱动程序不检查目的IP地址,而只关心Mac地址。
网络层寻址(下一跳的地址)是根据路由表和目的IP地址;
网络层找到下一跳的IP地址后,将该地址映射到MAC地址是链路层的事情。链路层首先查ARP表,查表未找到后,再通过ARP广播来查找。
内核(如以太网驱动程序)必须知道目的端的硬件地址才能发送数据。
在实现上ARP位于IP层,即和IP协议处于同一层,因此,ARP协议的实现是在路由器/主机中,而不是在交换机中。
ARP的分组格式
以太网报头中的前两个字段是以太网的源地址和目的地址。目的地址为全 1的特殊地址是广播地址。电缆上的所有以太网接口都要接收广播的数据帧。无论何种数据包以太网帧头中的源目MAC地址,都是该数据包路由路径中相邻的两个MAC地址(目的MAC为广播地址的需要特殊处理)。
ARP头部共28字节,无数据部分。请求和应答是相同的报文结构。
硬件类型字段,用来标识网络的硬件类型,如以太网为1。
协议类型字段,表示要映射的协议地址类型。它的值为 0 x 0 8 0 0即表示 I P地址,即根据后面的目的IP地址字段查找目的MAC地址字段。
硬件地址长度,表示网卡的MAC地址长度,一般为6字节。
协议地址长度,指的是上面协议类型字段标识的后面的目的IP或MAC地址的长度。如,IP地址是4,MAC地址是6。
操作字段,标识四种操作类型,它们是 A R P请求(值为1)、 A R P应答(值为 2)、 R A R P请求(值为3)和R A R P应答(值为4)。
发送端的IP和MAC地址。
目的端的IP和MAC地址,可只填写部分。
抓包分析
对于一个 A R P请求来说,除目的端硬件地址外的所有其他的字段都有填充值。当系统收到一份目的端为本机的 A R P请求报文后,它就把硬件地址填进去,然后用两个目的端地址分别替换两个发送端地址,并把操作字段置为 2,最后把它发送回去。
对于局域网中目的主机存在(目的IP对应的主机存在)的ARP请求(广播)来说,发送端能够收到ARP应答。但广播一个不存在主机的ARP请求,发送端最终会得到一个来自本机(发送端)的ICMP差错报文(目的地址不可达)。(需要注意的是,该ICMP报文是由本机的TCP/IP协议栈产生的,并未发往网卡,而是直接投递给上层应用,因此使用wireshark抓不到)
如下:
这些ARP广播都是由ping命令触发的,但最终都超时了,因此,ping程序在收到本机产生的ICMP报文后,给出了出错信息。