ARP协议实现IP地址到物理地址的映射;RARP实现物理地址到IP地址的映射。
ARP/RARP的帧格式如下(图中的数字表示各个域所占的字节数):
以太网目的地址 6 | 以太网源地址 6 | 协议类型 2 | 硬件类型 2 | 协议类型 2 | 硬件地址长度 1 | 协议地址长度 1 | op 2 | 发送端以太网地址 6 | 发送端IP地址 4 | 目的以太网地址 6 | 目的IP地址 4 |
说明:前面三个字段是以太网帧结构的必备部分,在网络接口层(http://blog.csdn.net/ericming200409/archive/2011/04/13/6321872.aspx)已经详细说明,这里不再赘述。 硬件类型说明硬件地址的类型,协议类型说明协议地址的类型,常见的情况是硬件类型指明硬件地址是以太网地址,协议类型指明协议地址是IP地址;OP字段说明数据包类型,比如arp请求,arp应答,rarp请求,rarp应答;其余各字段相信就不需要再过多解释了。
(1) ARP和RARP帧不同的是第三字段。
(2) 除去前面的三个字段,arp帧剩下的各部分加起来只有28字节,而以太网帧要求数据域最小是46字节,所以所有的arp帧都是需要填充的,rarp也是如此。IP数据包有时也会小于46字节,同样需要填充,正是因为网络接口层可能会对IP数据包进行填充,IP数据包中才需要总长度字段,这点到IP层时我仍会特别指出。
ARP高速缓冲区:
为了实现IP到物理地址的快速转换,ARP会维护一个缓冲区,缓冲区里面存放一些已知IP地址和物理地址的对应关系,这样主机就不用每次发送数据包时都先发送ARP请求。通过arp命令我们可以查看缓冲区内容,也可以往缓冲区中增加条目,删除条目等。另外一种查看ARP高速缓冲区的方式是通过/proc/net/arp文件,该文件是ARP高速缓冲区的镜像。
ARP攻击:
ARP欺骗攻击已经成了破坏网吧经营的罪魁祸首,是网吧老板和网管员的心腹大患。从影响网络连接通畅的方式来看,ARP欺骗分为二种,一种是对路由器ARP表的欺骗;另一种是对内网PC的网关欺骗。第一种ARP欺骗的原理是——截获网关数据。它通知路由器一系列错误的内网MAC地址,并按照一定的频率不断进行,使真实的地址信息无法通过更新保存在路由器中,结果路由器的所有数据只能发送给错误的MAC地址,造成正常PC无法收到信息。第二种ARP欺骗的原理是——伪造网关。它的原理是建立假网关,让被它欺骗的PC向假网关发数据,而不是通过正常的路由器途径上网。在PC看来,就是上不了网了,“网络掉线了”。一般来说,ARP欺骗攻击的后果非常严重,大多数情况下会造成大面积掉线。有些网管员对此不甚了解,出现故障时,认为PC没有问题,交换机没掉线的“本事”,电信也不承认宽带故障。而且如果第一种ARP欺骗发生时,只要重启路由器,网络就能全面恢复,那问题一定是在路由器了。为此,宽带路由器背了不少“黑锅”。作为网吧路由器的厂家,对防范ARP欺骗不得已做了不少份内、份外的工作。一、在宽带路由器中把所有PC的IP-MAC输入到一个静态表中,这叫路由器IP-MAC绑定。二、力劝网管员在内网所有PC上设置网关的静态ARP信息,这叫PC机IP-MAC绑定。一般厂家要求两个工作都要做,称其为IP-MAC双向绑定。
免费ARP:
免费ARP指的是主机询问自己的物理地址,它有两个作用:一是可以发现网络上是否有主机和自己有一样的IP地址;二是可以通知网络中别的主机对自己的物理地址进行更新,这种情况发生在当主机换掉网卡重新启动的时候,物理地址发生了改变,可以通过免费ARP通知别的主机自己的物理地址改变了,免费ARP能够发挥这个作用是基于这样一个事实---任何主机接收到ARP请求,如果发送端在自己的ARP高速缓存中,都需要根据这个ARP请求对高速缓存中的对应项进行更新。
tcpdump命令:
tcpdump命令是功能及其强大的网络抓包命令,通过它可以查看网络中的数据传输情况,其具体使用方法可参考manpage或者blog:http://blog.csdn.net/ericming200409/archive/2011/04/14/6324446.aspx
有趣的实例:
我的主机IP是:10.0.2.15(虚拟机), 默认网关是:10.0.2.2, 通过netstat -r查看路由表输出如下:
1: 内核 IP 路由表
2: Destination Gateway Genmask Flags MSS Window irtt Iface
3: 10.0.2.0 * 255.255.255.0 U 0 0 0 eth0
4: link-local * 255.255.0.0 U 0 0 0 eth0
5: default 10.0.2.2 0.0.0.0 UG 0 0 0 eth0
在我的子网上并不存在10.0.2.5,我试图ping 10.0.2.5 –c 1,tcpdump –b arp输出如下:
1: 23:36:00.085828 ARP, Request who-has 10.0.2.5 tell spring, length 28
2: 23:36:00.089777 ARP, Request who-has 10.0.2.2 tell spring, length 28
3: 23:36:00.090047 ARP, Reply 10.0.2.2 is-at 52:54:00:12:35:02 (oui Unknown), length 46
4: 23:36:01.085880 ARP, Request who-has 10.0.2.5 tell spring, length 28
5: 23:36:02.085866 ARP, Request who-has 10.0.2.5 tell spring, length 28
6: 23:39:41.414458 ARP, Request who-has 10.0.2.2 tell spring, length 28
7: 23:39:41.414858 ARP, Reply 10.0.2.2 is-at 52:54:00:12:35:02 (oui Unknown), length 46
可以看到:
开始因为10.0.2.5与本机IP10.0.2.15在同一个子网上,所以直接arp询问10.0.2.5的物理地址;但是因为该主机不存在,没有回应,所以接着就企图发给默认路由器,从而有了2-3行的结果;但是发给默认路由的ICMP还是没有得到正确回应,所以继续询问10.0.2.5的物理地址,输出了4-5行;
6-7行重复2-3行的动作。注意:不同的实现运行本实例会有不同的结果。