在网络的分层中,网络层最重要的协议为IP协议,与IP协议配套使用的还有四个协议:
(1)ARP(地址解析协议);
(2)RARP(逆地址解析协议);
(3)ICMP(网际控制报文协议);
(4)IGMP(网际组管理协议).
如图:
其中ICMP、IGMP在IP上部,表示它们使用IP协议,而ARP、RARP在下面表示IP经常使用这两个协议.
ARP协议介绍:
背景:我们首先要知道IP地址与物理地址区别:物理地址是数据链路层和物理层使用的地址,IP地址则是网络层和以上各层使用的地址(逻辑地址由软件实现的)。 在发送数据时,从高层到低层,使用IP地址数据报交给数据链路层,其被封装为MAC帧,MAC帧在被传送时的原地址和目的地址都为硬件地址,在MAC帧首部中,而其他接收设备在接收到MAC帧时,其根据为MAC帧首部的硬件地址,并看不见包藏在MAC帧数据中的IP地址,只有在剥去MAC帧首部尾部将数据交给上层网络层后,网络层才能在IP数据报中首部找到原IP地址与目的IP地址。
由以上可知,在实际网络链路传送数据帧时,必须知道通信双方的硬件地址,而ARP协议与RARP协议即是解决这一问题的:
ARP:知道对方的IP地址,获得对方的硬件地址;
RARP:知道对方的硬件地址,获得对方的IP地址.
为了解决IP地址与硬件地址格式不同和网络中主机、适配器等的变化,地址解析协议ARP则在ARP高速缓存中存放一个经常动态更新的从IP地址到硬件地址的映射表。
每台主机维护这个ARP缓存表,可以用arp -a命令查看。缓存映射表中的表是动态更新的,有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址。
主要过程如下:
源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播),目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中,此时采用点对点方式返回给源主机,并其也将会把源主机的IP地址与硬件地址映射存入自己缓存映射表中,以备后面需要相互通信时使用。
ARP数据报格式如下:
以上:
硬件类型指链路层网络类型,1为以太网;
协议类型指要转换的地址类型,0x0800为IP地址;
后面两个字段表示地址长度:对于以太网地址和IP地址分别为6和4(字节);
op字段为1表示ARP请求,op字段为2表示ARP应答.
注意:
1.源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,是由于在链路层会将以太网首部剥离上交给网络层,ARP请求则需要知道源MAC与目的MAC地址,所以ARP请求中也要出现一次.
2.由于以太网规定最小数据长度为46字节,ARP帧长度只有28字节,因此有18字节填充位,填充位的内容没有定义,与具体实现相关。
具体实现过程如下:
例如:
主机A的IP地址为IPA,MAC地址为MACA,其知道主机B的IP地址为IPB,现在主机A要发送ARP请求知道主机B的MACB地址。
步骤:
(1)首先填写上述ARP请求数据报:
以太网首部:
以太网目的地址:(现不知道,以广播形式发送),为:FF:FF:FF:FF:FF:FF;
以太网源地址:MACA;
帧类型:ARP(0806);
ARP请求数据报:
硬件类型:以太网(1);
协议类型:IP地址(0800);
硬件地址长度:6;
协议地址长度:4;
OP:请求为1;
发送端以太网地址:MACA;
发送端IP地址:IPA;
目的以太网地址:全0(待填写);
目的IP地址:IPB;
(2)用广播形式在同一网段发送请求,则在此网段的主机都会收到此ARP请求,其不会直接丢弃,每台主机对此数据帧进行分离上交到网络层,先查看OP字段判断是ARP请求还是应答;
(3)当是ARP请求时,其查看字段目的IP地址,判断是否与自己匹配,若不匹配,则丢弃;
(4)若匹配,则当前主机在自己ARP缓存映射表中保存发送端的IP地址与MAC地址,然后进行将自己的MAC地址发送给请求端,进行ARP应答;
(5)填写ARP应答数据报:
以太网首部:
以太网目的地址:MACA;
以太网源地址:MACB;
帧类型:ARP(0806);
ARP请求数据报:
硬件类型:以太网(1);
协议类型:IP地址(0800);
硬件地址长度:6;
协议地址长度:4;
OP:应答为2;
发送端以太网地址:MACB;
发送端IP地址:IPB;
目的以太网地址:MACA;
目的IP地址:IPA;
(6)进行点对点发送(由于此时在同一网段,并已知道网络两端主机MAC地址与IP地址);
(7)主机A最后接收到ARP应答数据报,得到主机B的MACB地址.
注意:ARP是解决同一个局域网上主机或路由器的IP地址与硬件地址的映射问题,若要跨网络传输,则是先ARP请求将路由器的硬件地址找到返回,然后将数据传输到此路由器,然后此路由器在进行查找下一个路由器或主机MAC地址,然后再次进行数据传输,直至到目标主机。
以下实现一个arp脚本:来找到当前主机连接的局域网的中所有主机的MAC地址:
#!/bin/bash
net='192.168.58.'
i=1;
count=0
while [ $i -le 254 ]
do
if [ $count -eq 20 ];then
count=0
sleep 1
fi
ping -c1 $net$i &
let i++
let count++
done
wait
echo '###############################################'
arp -a | grep -v 'incomplete'
echo '###############################################'
结果如下: