一,ARP协议(Address Resolution Protocol)
ARP协议是解决它同一个局域网上主机或路由器IP地址和硬件地址映射问题的
协议。而与之对应的有RARP协议,是逆地址解析协议。
网络层使用的是IP地址,但在数据链路层上传输数据帧必须使用网卡地址。所以
ARP协议是必须使用的。
网络层标识一个主机或路由器是使用ip地址,而在数据链路层表示一个主机或
路由器是使用网卡地址,又称物理地址,或硬件地址,或Mac地址。
![](http://blog.chinaunix.net/attachment/201209/1/27033491_134646265374pQ.png)
-----------------------------------------------------------------------------------------------
二,ARP Cache------>ARP 缓存表。
每个主机或路由器上具有一个ARP Cache缓存一张映射表,可以使用arp -a命令查看
该映射表,linux和windows都是该命令。
缓存表示意图如下:
当使用ping命令ping一个主机的时候往往第一个时间要长,而以后的时间都差不多,
这就是因为第一次缓存中没有该主机的ip地址和mac地址映射的表项,需要使用ARP
请求和应答才能把该选项添加到缓存中,这需要话费一些时间,而以后缓存中有了该
选项,就不需要使用ARP请求和应答了。
- linux@linux:~$ ping 192.168.1.105
- PING 192.168.1.105 (192.168.1.105) 56(84) bytes of data.
- 64 bytes from 192.168.1.105: icmp_req=1 ttl=64 time=0.597 ms
- 64 bytes from 192.168.1.105: icmp_req=2 ttl=64 time=0.199 ms
- 64 bytes from 192.168.1.105: icmp_req=3 ttl=64 time=0.223 ms
- 64 bytes from 192.168.1.105: icmp_req=4 ttl=64 time=0.292 ms
第一次发送ICMP报文话费了0.597ms,而以后均只有0.2ms左右。
在arp缓存表中的表项始终在更新中的,每个表项都设置了一个定时器,到一定的时间点后
就将该表项在缓存中删除,这样可以避免因网卡地址失效带来的问题。
------------------------------------------------------------------------------------------
三,ARP请求和应答。
当缓存中没有某个主机或路由器的表项时就要使用ARP请求和应答。
ARP请求是在局域网内广播一个ARP request packet.
ARP应答是单播,dest向src发出一个ARP reply packet.
ARP request/reply packet format:
![](http://blog.chinaunix.net/attachment/201209/1/27033491_1346474551Ih59.png)
ARP请求应答报文长度是固定的28字节,其中包括了源和目的主机的IP地址和Mac地址。
前面的14字节是帧的首部。
ARP广播请求分组示意图:
![](http://blog.chinaunix.net/attachment/201209/1/27033491_1346474751Q7uF.png)
ARP应答示意图:(单播)
![](http://blog.chinaunix.net/attachment/201209/1/27033491_1346474782J3cj.png)
-------------------------------------------------------------------------------------------
四,实例分析。
现在使用ping局域网上的一个主机。首先保证ARP Cache中没有该IP选项。
使用的是ping 192.168.1.111,然后使用tcpdump抓取相关的信息,注意
使用-e选项。
- 19:11:54.414783 00:24:1d:9c:de:85 (oui Unknown) > Broadcast, ethertype ARP (0x0806),
- length 42: Request who-has zk-G31M-ES2C.local tell linux, length 28
- 0x0000: 0001 0800 0604 0001 0024 1d9c de85 c0a8 .........$......
- 0x0010: 0165 0000 0000 0000 c0a8 016f .e.........o
- 19:11:54.414948 00:24:1d:b2:31:e2 (oui Unknown) > 00:24:1d:9c:de:85 (oui Unknown),
- ethertype ARP (0x0806), length 60: Reply zk-G31M-ES2C.local is-at 00:24:1d:b2:31:
- e2 (oui Unknown), length 46
- 0x0000: 0001 0800 0604 0002 0024 1db2 31e2 c0a8 .........$..1...
- 0x0010: 016f 0024 1d9c de85 c0a8 0165 0000 0000 .o.$.......e....
- 0x0020: 0000 0000 0000 0000 0000 0000 0000 ..............
可以看出第一条信息是我的主机(Mac地址:00:24:1d:9c:de:85 )广播出了一个
ARP request 分组。分组长度为42,其中ARP的长度28字节。可以依照ARP
Message Format分析如下:
0024 1d9c de85 c0a8 0165 hw_addr:00:24:1d:9c:de:85
ip_addr:192.168.1.101
0000 0000 0000 c0a8 016f hw_addr:empty ip_addr:192.168.1.111
由此看出该请求是请求IP地址为192.168.1.111主机的Mac地址。
第二条信息是IP地址为192.168.1.111的主机作出的应答。
解析前面28字节的应答信息如下:
0024 1d9c de85 c0a8 0165 hw_addr:00:24:1d:9c:de:85 ip_addr:192.168.1.101
0024 1db2 31e2 c0a8 016f hw_addr:00:24:1d:b2:31:e2 ip_addr:192.168.1.111
可以看出应答中就包含了IP地址为192.168.1.111的Mac地址。
------------------------------------------------------------------------------------------
阅读(1526) | 评论(0) | 转发(1) |