ARP、Proxy ARP、Gratuitous ARP
Proxy ARP
什么是Proxy ARP?
一个主机A(通常是路由器)有意应答另一个主机B的ARP请求(ARP requests)。主机A通过伪装其身份,承担起将分组路由到真实目的地的责任。代理ARP可以帮助一个子网上的计算机到达远程子网,而无需配置路由或者默认网关。
Proxy ARP是如何工作的?
如图所示,子网A上的主机A(172.16.10.100)要给子网B上的主机D(172.16.20.200)发送数据包。主机具有/16掩码,这意味着Host A认为他直连网络172.16.0.0中的主机。当主机A想要与他认为是直连的任何主机通信时,它便向目的地发送ARP Request。因此,当主机A需要向主机D发送数据包时,主机A认为主机D和自己直连,因此向主机D发送ARP请求。
为了到达主机D (172.16.20.200),主机A(172.16.10.100)需要主机D的MAC地址。因此主机A在子网A上百个广播ARP Request,如下图所示:
ARP Request封装在以Host A的MAC地址作为源MAC,以广播(FFFF.FFFF.FFFF)作为目的MAC地址的以太网帧中。由于ARP请求时广播,他会到达子网A中的所有节点,包括Router的E0口。但是不会到达主机D,因为路由器是不转发广播的。
由于Router知道目标地址 (172.16.20.200)在另一个只晚上并非切可以到达主机D,他用自己的MAC地址回答主机A。
这是Router发送到主机A的代理ARP回复。代理ARP回复数据包被封装在以Router的MAC地址作为源MAC,以主机A的MAC作为目的MAC的以太网帧中。ARP应答始终是单播到原始请求者。在收到此ARP应答后,主机A更新其ARP缓存,如图所示:
从现在起,主机A将其想要到达172.16.20.200(主机D)的所有分组转发到MAC地址00-00-0c-94-36-ab(路由器)。 由于路由器知道如何到达主机D,路由器将数据包转发到主机D。子网A中的主机上的ARP缓存,凡是到子网B上的主机,都用路由器的MAC地址填充。因此,所有数据包目的地到子网B发送到路由器。 路由器将这些数据包转发到子网B中的主机。主机A的ARP缓存如下表所示:
多个IP地址映射到单个MAC地址,即此路由器的MAC地址,表明Proxy ARP正在使用。
当子网A上的主机B(172.16.10.200/24)尝试向子网B上的目的地主机D(172.16.20.200)发送数据包时,它查找其IP路由表并相应地路由该数据包。 主机B(172.16.10.200/24)不对主机D IP地址172.16.20.200进行ARP,因为它属于与在主机B以太网接口172.16.20.200/24上配置的子网不同的子网。
proxy ARP有哪些优点?
最主要的一个优点就是能 够在不影响其他router的路由表的情况下在网络上添加一个新的router,这样使得子网的变化对主机是透明的 中国网管联盟www.bitscn.com
proxy ARP应该使用在主机没有配置默认网关或没有任何路由策略的网络上
proxy ARP带来的哪些负面影响?
1.增加了某一网段上ARP流量
2.主机需要更大的ARP table来处理IP地址到MAC地址的映射
3.安全问题,比 如ARP欺骗(spoofing)
4.不会为不使用ARP来解析地址的网络工作
5.不能够概括和推广网络拓扑
Gratuitous ARP(免费ARP)
问题引入:
我们很多系统都是使用双机热备份系统(即一个主用,另一个备用,如果主用没有问题,备用一直处于空闲状态;如果主用出现问题,备用立刻接管)。假设主用服务器的MAC地址为:1111-1111-1111,备用服务器的MAC地址为:2222-2222-2222,通过某种软件,两台服务器共同对外共同使用一个IP,例如10.10.10.1,这样客户机在需要同服务器进行通信的时候(第一次通信的例子,在这时候ARP的缓存是空的,或至少没有10.10.10.1的MAC地址),先向局域网发送广播ARP请求报文请求10.10.10.1这个IP地址的MAC地址,得到主用服务器响应后,将10.10.10.1和对应的MAC地址放入自己的ARP缓存中,然后向这个IP发送请求就可以进行通信了。如果在通信的过程中,主用服务器突然发生故障,down机了,这时备用服务器立刻接管10.10.10.1这个IP进行服务,可是刚才那台客户机的ARP缓存表中10.10.10.1这个IP对应的MAC地址是1111-1111-1111,再往这个MAC地址发送数据包肯定是石沉大海的,怎样才能让备用接管了服务之后立刻能起作用呢?
我们能想到的方法有两种,一种就是在使用双机热备份系统,接管那个IP的时候,生成一个不依赖于任何一个主机的虚拟MAC地址,接管IP的同时也接管那个虚拟的MAC地址,这样客户机不需要做任何更改动作,ARP缓存表不变。另外一种就是在接管的同时,接管的服务器对外广播一个ARP报文给所有主机,例如在刚才的例子中,ARP广播报文的数据字段中源IP地址是10.10.10.1,源MAC地址是2222-2222-2222,目的IP地址也是10.10.10.1,目的MAC地址也是2222-2222-2222,IP报文的目的地址是:FFFF-FFFF-FFFF,这样让所有的广播网络上的主机接收该报文,并更新自己的ARP缓存表,已告知10.10.10.1这个IP的对应MAC地址已经变为2222-2222-2222,这样,刚才的那个客户机就能正确地同服务器进行通信了。
第一种方法在大多数系统中已经被采用,例如Cisco的HSRP技术中,虚拟出来的MAC地址是以0000.0c07.ac+HSRP的group ID组成,并且限制局域网上不会存在不同应用的相同Group ID,以确保局域网上不会重复MAC地址生成。在VRRP中也是如此,原理和HSRP同。这样无论主备用如何切换,客户机不需要做任何动作。
第二种方法就是免费ARP技术(gratuitous ARP),目前应用也很广泛。
免费ARP目前的作用有两种:
第一种就是刚才上面所说的宣告广播的作用,以告诉整个广播域,目前这个IP所对应的MAC地址是什么。
第二种是看看广播域内有没有别的主机使用自己的IP,如果使用了,则在界面上弹出“IP冲突”字样。普通ARP请求报文广播发送出去,广播域内所有主机都接收到,计算机系统判断ARP请求报文中的目的IP地址字段,如果发现和本机的IP地址相同,则将自己的MAC地址填写到该报文的目的MAC地址字段,并将该报文发回给源主机。所以只要发送ARP请求的主机接收到报文,则证明广播域内有别的主机使用和自己相同的IP地址(这里不考虑路由器的ARP代理问题)。免费ARP的报文发出去是不希望收到回应的,只希望是起宣告作用;如果收到回应,则证明对方也使用自己目前使用的IP地址。在所有网络设备(包括计算机网卡)up的时候,都会发送这样的免费ARP广播,以宣告并确认有没有冲突。
一个关于局域网分配IP的问题
如上图所示,假设交换机上连接了200台计算机。单位刚接好电脑,这时候彼此都不知道对方IP地址,更谈不上MAC地址(ARP这时候都是扯淡)。电脑接到交换机上,即使不上外网(eg:百度),那彼此之间也要通信,别忘了交换机作用就是这个。交换机作为二层设备,适用MAC地址通信,MAC地址再网卡NIC出厂的时候就唯一了。那每台计算机的IP地址是咋获取的呢?可以手动给添加,太麻烦了(200台不嫌烦,2000台估计疯了)。这时候DHCP就出现了。
为了获取IP地址,各台主机发送DHCP Discover消息,在第2层和第3层都发广播,指出“帮帮我,我不知道自己的IP地址”
DHCP是无连接的,意味着其传输层适用UDP协议。
客户端向DHCP 服务器请求IP 地址的4 个步骤如下:
(1) DHCP 客户端广播一条DHCP 发现消息,旨在寻找DHCP 服务器(端口67 );
(2) 收到DHCP 发现消息的DHCP 服务器向主机发回一条单播DHCP 提议消息;
(3) 客户端向服务器广播一条DHCP 请求消息,请求提议的IP 地址和其他信息:
(4) 服务器以单播方式发回一条DHCP 确认消息,完成交互。
DHCP冲突
两台主机使用相同的IP 地址时,就发生了DHCP 地址冲突。这昕起来很糟糕,不是吗?当然糟糕!在介绍IPv6 的那章,根本不需要讨论这个问题。在分配IP 地址的过程中, DHCP 服务器在分配地址池中的地址前,将使用ping 程序来测试其可用性。如果没有主机应答, DHCP 服务器将认为该E 地址未分配出去。这有助于服务器知道它要分配的地址未被占用,但主机呢?为进一步避免如此糟糕的E 地址冲突问题,主机可广播自己的地址。主机使用免费ARP (gratuitous ARP )来帮助避免地址重复。为此, DHCP 客户端在本地LAN 或VLAN 中发送A盯广播,并要求解析分配新给它的地址,从而将冲突消灭在萌芽状态。如果检测到IP 地址冲突,相应的IP 地址将从DHCP 地址池中删除;且在管理员手工解决冲突前,该地址不全被分配给任何主机,牢记这一点很重要。