数据包在网络上寻址时,需要靠OSI七层模型中的第二层数据链路层地址和第三层网络层地址来完成,只要完成这两个地址的封装,数据包便能够发往目的地,也必须完成这两个地址的封装,数据包才能发往目的地。
在当前的网络中,第三层网络层地址就是IP地址,主机之间要通信,必须封装好双方的IP地址,这是无可争议的;IP地址在主机通信的过程中,不会因为网络设备或物理介质的改变而改变。而第二层数据链路层地址则会因为链路介质的不同而发生变化,并且在主机通信中,链路层地址会不断发生变化,因为链路层地址只在同一段介质中才有效,如果介质是多路访问类型,如以太网,则只在同一IP网段有效。在这里需要讨论的是代理ARP,故介质默认为以太网。
如果通信的主机在同一网段,源主机则直接请求目标主机的二层链路地址(以太网为MAC地址),其它介质的网络同样也是直接请求目标主机的二层链路地址,只不过不叫MAC地址;如果得不到二层链路地址的回复,数据包就不能完成封装,就不能发送。如果通信的主机不在同一网段,必须经过路由后才能到达目标的话,那么源主机就无法直接请求目标主机的二层链路地址,因为请求是用广播发送的,所以,此时源主机就直接请求网关的二层链路地址,将数据包的目标地址封装为网关的二层链路地址,从而将数据包交给网关处理,如果是路由器需要发送数据包到远程网络,同样的道理,路由器将数据包的二层目标地址封装为下一跳的二层链路地址,从而交给下一跳路由器来处理。
当向网络中发送广播请求目标的二层链路地址时,如果收到的路由器有去往目标网络的路由,那么路由器将会使用自己接口的二层链路地址来回复数据源,声称自己的二层链路地址就是目标的二层链路地址,这就是路由器的代理ARP功能。主机收到路由器的回复后,便将数据包的目标二层链路地址封装为路由器的二层链路地址,从而将数据包发到路由器,因为路由器是有到目标网络的路由的,所以通信不会有问题。
不难发现,当主机需要将数据包发到远程网络时,因为开启了代理ARP的路由器会以自己的二层链路地址充当目标的二层链路地址,所以主机不需要配置网关,就能够将去往远程网络的数据包发到路由器,最终完成通信。
配置代理ARP
说明:代理ARP在路由器接口上默认是开启的,并且是基于接口打开或关闭的。
 
说明:以上图为例,测试代理ARP,其中R3R4的接口F0/110.1.2.0/24网段,而R1R2R3的接口F0/010.1.1.0/24网段,但由于R1的接口F0/0的掩码为16位,所以R1会认为整个10.1.0.0/16都是接口F0/0的直连网段,其中包含10.1.2.0/24;但是R2的接口F0/0的掩码为24位,所以R2会认为10.1.2.0/24是在远程网络。
1.配置基础网络环境
(1)配置R1:
r1(config)#int f0/0
r1(config-if)#ip add 10.1.1.1 255.255.0.0
r1(config-if)#no sh
说明:R1配置网段10.1.0.0/16,其中包含网段10.1.1.0/2410.1.2.0/24
(2)配置R2:
r2(config)#int f0/0
r2(config-if)#ip add 10.1.1.2 255.255.255.0
r2(config-if)#no sh
r2(config-if)#exit
r2(config)#ip route 10.1.2.0 255.255.255.0 f0/0
说明:R2直连网段10.1.1.0/24,并且通过配置静态路由将去往远程网段10.1.2.0/24定义为直连网段。
(3)配置R3:
r3(config)#int f0/0
r3(config-if)#ip add 10.1.1.3 255.255.255.0
r3(config-if)#no sh
r3(config-if)#exit
r3(config)#int f0/1
r3(config-if)#ip add 10.1.2.3 255.255.255.0
r3(config-if)#no sh
r3(config-if)#exit
说明:R3同时与10.1.1.0/2410.1.2.0/24直连。
(4)配置R4:
r4(config)#int f0/1
r4(config-if)#ip add 10.1.2.4 255.255.255.0
r4(config-if)#no sh
r4(config-if)#exit
r4(config)#ip route 0.0.0.0 0.0.0.0 10.1.2.3
说明:R410.1.2.0/24
2.测试开启代理ARP的情况
说明:路由器接口默认已经开启代理ARP,无需再开。
(1)查看R1的路由情况:
r1#sh ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route
Gateway of last resort is not set
10.0.0.0/16 is subnetted, 1 subnets
C 10.1.0.0 is directly connected, FastEthernet0/0
r1#
说明:可以看见,R110.1.0.0/16直连,R1会认为10.1.2.0/24也是自己的直连网段,所以我们不用写到10.1.2.0/24的静态路由。
(2)测试R110.1.2.0/24的连通性:
r1#ping 10.1.2.4
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.1.2.4, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 48/79/180 ms
r1#
说明:因为R1认为自己直连10.1.0.0/16网段,所以在向10.1.2.0/24发送数据包时,直接在本网段广播请求目标二层链路地址,这个广播被R3收到,又因为R3能够到达10.1.2.0/24,并且开启代理ARP功能,所以R3将自己接口的二层链路地址回复给R1,最终R1将去往10.1.2.0/24的数据包封装为R3的二层链路地址,从而将数据包交给R3处理,最后网络通信成功。
(3)查看R410.1.2.4)的F0/1MAC地址与R310.1.1.3)的F0/0MAC地址,并且查看R1去往10.1.2.4ARP表:
R4
r4#sh interfaces f0/1
FastEthernet0/1 is up, line protocol is up
Hardware is Gt96k FE, address is c000.1370.0001 (bia c000.1370.0001)
Internet address is 10.1.2.4/24
R3
r3#sh int f0/0
FastEthernet0/0 is up, line protocol is up
Hardware is Gt96k FE, address is c000.1124.0000 (bia c000.1124.0000)
Internet address is 10.1.1.3/24
R1
r1#sh arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 10.1.1.3 8 c000.1124.0000 ARPA FastEthernet0/0
Internet 10.1.1.1 - c000.141c.0000 ARPA FastEthernet0/0
Internet 10.1.2.4 4 c000.1124.0000 ARPA FastEthernet0/0
r1#
说明:从结果中可以看出,R1获得的10.1.2.4MAC地址并非目标R4MAC地址,而是R3的接口F0/0MAC地址,这就是由于R3的代理ARP功能,使得R3会代替目标R4回复源主机的二层链路地址请求。
(4)查看R2的路由表并测试到10.1.2.0/24的连通性:
r2#sh ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route
Gateway of last resort is not set
10.0.0.0/24 is subnetted, 2 subnets
S 10.1.2.0 is directly connected, FastEthernet0/0
C 10.1.1.0 is directly connected, FastEthernet0/0
r2#r2#ping 10.1.2.4
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.1.2.4, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 12/80/156 ms
r2#
说明:因为R2路由表中的静态路由指示去往10.1.2.0/24为直连网段,所以同上原因,因为R3代理ARP的功能,最后与10.1.2.0/24的网络通信正常。
3.测试关闭代理ARP的情况
(1)关闭R3接口F0/0的代理ARP功能:
r3(config)#int f0/0
r3(config-if)#no ip proxy-arp
说明:关闭了R3接口F0/0的代理ARP功能,要开启,输入命令ip proxy-arp
(2)查看R110.1.2.0/24的连通性和ARP情况:
r1#ping 10.1.2.4
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.1.2.4, timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)
r1#
r1#sh arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 10.1.1.3 0 c000.1124.0000 ARPA FastEthernet0/0
Internet 10.1.1.1 - c000.141c.0000 ARPA FastEthernet0/0
Internet 10.1.2.4 0 Incomplete ARPA
r1#
说明:可以看见,当R3关闭了代理ARP功能后,R1不能与10.1.2.0/24通信,因为R1认为目标与自己直连,所以会在直连网段直接请求目标的二层链路地址,但R3关闭了代理ARP功能,即使自己与目标可达,但也不会使用自己的MAC地址去回复R1,最后R1也无法获得任何目标的MAC地址,ARP表中显示10.1.2.4的记录为Incomplete,最终与10.1.2.0/24的通信以失败告结。
(3)查看R210.1.2.0/24的连通性:
r2#ping 10.1.2.4
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.1.2.4, timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)
r2#
r2#sh arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 10.1.1.2 - c000.13e8.0000 ARPA FastEthernet0/0
Internet 10.1.1.3 4 c000.1124.0000 ARPA FastEthernet0/0
Internet 10.1.2.4 0 Incomplete ARPA
r2#
说明:虽然R2拥有到10.1.2.0/24的静态路由,但因为静态路由指定去往目标为直连接口,所以R2会认为10.1.2.0/24与接口F0/0直连,由于R3关闭了代理ARPR2R1一样,不能与10.1.2.0/24通信。
(4)更改R2的静态路由方式,并查看路由表:
r2(config)#no ip route 10.1.2.0 255.255.255.0 f0/0
r2(config)#ip route 10.1.2.0 255.255.255.0 10.1.1.3
r2(config)#exi
r2#sh ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route
Gateway of last resort is not set
10.0.0.0/24 is subnetted, 2 subnets
S 10.1.2.0 [1/0] via 10.1.1.3
C 10.1.1.0 is directly connected, FastEthernet0/0
r2#
说明:R2将去往目标10.1.2.0/24的静态路由改为下一跳指向10.1.1.3R3),所以R2并不会再认为10.1.2.0/24是自己的直连网段,因此在需要与10.1.2.0/24通信时,会请求下一跳地址10.1.1.3的二层链路地址,最终将数据包交给10.1.1.3R3)处理。
(5)查看更改静态路由后R210.1.2.0/24的通信情况:
r2#ping 10.1.2.4
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.1.2.4, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 12/68/192 ms
r2#
说明:更改静态路由到达目标网络为下一跳地址后,R2不再直接请求目标10.1.2.4的二层链路地址,而是改为请求下一跳地址的二层链路地址,因为请求的地址10.1.1.3,所以R3作出了回应,最后R2与目标通信成功。
说明:由以上情况可以看出,当配置静态路由时,如果指定远程目标为直连,则可能因为下一跳路由器关闭了代理ARP而造成通信失败,但静态路由指定为下一跳地址时,通信不会受到任何影响。
代理ARP在没有配置默认网关或不使用路由的网络中,比较有优势。