1、应用程序构造数据包,该示例是产生ICMP包,被提交给内核(网络驱动程序);
2、内核检查是否能够转化该IP地址为MAC地址,也就是在本地的ARP缓存中查看IP-MAC对应表;
3、如果存在该IP-MAC对应关系,那么数据包直接发出;如果不存在该IP-MAC对应关系,那么接续下面的步骤;
4、内核进行ARP广播,目的地的MAC地址是BB-BB-BB-BB-BB-BB,ARP命令类型为Request,其中包含有自己的MAC地址;(下面会讲到具体包格式)
5、当B主机接收到该ARP请求后,就发送一个ARP的Reply命令,其中包含自己的MAC地址;
6、B获得A主机的IP-MAC地址对应关系,并保存到ARP缓存中;
7、B内核将把IP转化为MAC地址,然后封装在以太网头结构中,再把数据发送出去;
使用arp -a命令就可以查看本地的ARP缓存内容,所以,执行一个本地的ping命令后,ARP缓存就会存在一个目的IP的记录了。当然,如果你的数据包是发送到不同网段的目的地,那么就一定存在一条网关的IP-MAC地址对应的记录。
知道了ARP协议的作用,就能够很清楚地知道,数据包的向外传输依靠ARP协议,当然,也就是依赖ARP缓存。要知道,ARP协议的所有操作都是内核自动完成的,同其他的应用程序没有任何关系。ARP协议并不只在发送了ARP请求才接收ARP应答。而ARP协议的固有缺陷就在这里,当计算机接收到ARP应答数据包的时候,就会对本地的ARP缓存进行更新,将应答中的IP和MAC地址存储在ARP缓存中。因此, B向A发送一个自己伪造的ARP应答,而这个应答中的数据为发送方IP地址是192.168.1.52(C的IP地址),MAC地址是BB-BB-BB-BB-BB-BB(C的MAC地址本来应该是CC-CC-CC-CC-CC-CC,这里被伪造了)。当A接收到B伪造的ARP应答,就会更新本地的ARP缓存,将本地的IP-MAC对应表更换为接收到的数据格式,由于这一切都是A的系统内核自动完成的,A可不知道被伪造了。