对于网络设计师而言,构造一个运行良好的网络要面临很多挑战。在一个大型的,层次的,可伸缩的网络中,一个精心规划的ip地址分配策略和适时的路由聚合是至关重要的。
传统的网络建立在有类别地址的基础上(A,B,C类地址)。早期的路由协议,如RIPv1,IGRP出于节省带宽的考虑,在路由更新时不传送子网掩码信息,因此在网络信息传输时需要对子网掩码做一些假设。
1.假如路由器接收端口配置的IP地址和路由更新中传送的子网信息有相同的主类别网络,则该子网使用接收端口的掩码配置。
2.假如传送的子网信息穿越不同主类别网络边界,则传送路由器自动在主类别网络边界执行路由聚合,并只传送经过聚合的路由。
图1
如图1,网络中有三台路由器:A,B,C,均运行RIPv1路由协议,RIPv1是有类路由协议,路由更新中不传递子网掩码信息。B的S0端口收到从A传送的子网信息10.1.0.0(不包括子网掩码),由于B的S0端口在10.2.0.0/16子网和10.1.0.0有相同的主类别网络10.0.0.0,所以B的路由表中会添加一条10.1.0.0/16的记录--使用的是B在S0端口的掩码/16。当B向C传递10.1.0.0子网的路由信息时,由于B,C之间为172.16.1.0/24子网,主类别网络为172.16.0.0,不同于10.1.0.0的主类别网络10.0.0.0,因此B在向C传送10.1.0.0时会自动执行路由聚合到10.0.0.0,C在路由表中添加10.1.0.0/16子网的路由信息将是10.0.0.0/8,使用的是主类别网络默认的掩码(A类地址/8位,B类地址/16位,C类地址/24位)。
图2
如图2,路由器B的S0端口在10.2.0.0/24子网,即/24位掩码,由于从A传递的10.1.0.0子网要使用接收端口的掩码配置,因此也会使用/24位掩码,从而产生了一条错误的路由记录,这将导致某些经过B去往10.1.0.0/16的流量将无法到达。为了避免上述情况,必须约定,同主类别网络的子网必须使用相同的掩码。新约定又带来了新问题,即同主网络下地址无法有效的分配。
图3
如图3,假如某局域网上使用了27位的掩码,则每个子网可以支持30台主机(2^5-2=30);而对于WAN连接而言,每个连接只需要2个地址,理想的方案是使用30位掩码(2^2-2=2),然而同主类别网络相同掩码的约束,WAN之间也必须使用27位掩码,这样就浪费28个地址。另外一个是不连续地址的问题。
图4
如图4,根据前述约定,路由在经过不同主网络边界时会自动聚合到主类别地址边界。A的10.1.0.0/16子网经过172.16.2.0/24传递到B,由于经过不同主类别地址,所以会自动聚合,实际传送的是10.0.0.0;同理,C的10.2.0.0/16子网经过172.16.1.0/24传递到B,实际传送的是10.0.0.0。这样,对于B而言,它收到两条去往10.0.0.0子网的路由记录,B会添加两条到10.0.0.0/8路由记录到路由表,它们下一跳的地址不同,一条指向A的S1,另一条指向C的S0。由于有相同的跳数,所以会自动启用负载平衡,这样经过B访问10.0.0.0的流量将无法区分是去往10.1.0.0的还是10.2.0.0的,它们都有50%的机会命中,所以就会出现间歇性的网络访问故障。而对10.1.0.0和10.2.0.0而言,它们二者是不可见的。由于有不连续地址的问题,所以,规划网络地址时必须保证一个主网络的子网必须连续存在。
上述问题随着变长子网掩码,路由聚合和无类域间路由以及无类路由协议(RIPv2,EIGRP,OSPF,IS-IS,BGPv4)等技术的引入而得到了良好的解决。
变长子网掩码(VLSM),是指在一个层次结构的网络中,可以使用多个不同的掩码,也即可以对一个经过子网划分的网络再次划分。变长子网掩码的引入,有效解决了地址分配的浪费问题。
图5
如图5,某个公司的区域网络分配了172.16.12.0/22的地址空间,公司的网络规划如下:在路由器D连接3个VLAN,其中2个VLAN有不超过200台的主机,另外一个VLAN包括3个子网,每个子网主机数量不超过30台,路由器A,B,C通过FR和D相连,保证每条PVC仅分配2个IP地址。所有路由器均采用RIPv2无类别路由协议,路由更新中可以传送子网掩码信息,支持VLSM。根据上述网络规划,使用VLSM地址分配策略,设计如下IP地址分配计划:
1.由于需要3个VLAN,其中两个VLAN有不超过200台的主机,根据公式,主机需要8位地址(2^8=256>200>2^7=128),子网需要2位(2^2=4>3),因此得到4个连续的/24位子网,分别是172.16.12.0/24,172.16.13.0/24,172.16.14.0/24,172.16.15.0/24。其中172.16.12.0/24和172.16.13.0/24分配给其中两个VLAN,每个子网最多可以支持254台主机。
2.剩下一个VLAN每个子网主机数不超过30台,需要5个主机位,对应需要/27位的掩码(32-5=27),最多可以满足8个/27位子网的需求(2^3=8)由于172.16.12.0/24,和172.16.13.0/24子网已分配,不能继续作子网划分,现在可以采用的子网是172.16.14.0/24和172.16.15.0/24作进一步的子网划分。假定这里使用172.16.14.0/24,3个LAN分配的子网是172.16.14.0/27,172.16.14.32/27,172.16.14.64/27,同时还保留了5个子网作为备用或保留作进一步的子网划分。
3.由于WAN连接仅需要两个IP地址,所以最佳的掩码应该是/30位(2^(32-30)-2=2),同样,我们挑选一个未分配的/27位子网做进一步的划分,为了方便起见,我们选用最后一个/27位子网172.16.14.224/27作为WAN连接的地址空间。经过划分得到172.16.14.224/30,172.16.14.228/30,172.16.14.232/30等子网,同时还保留了5个/30的子网备用。
至此,一个基于VLSM分配策略的,层次的IP地址分配方案就完成了,和定长子网掩码相比,变长子网掩码的地址分配方案有效的节省了IP地址。同时,由于采用新的无类路由协议RIPv2,路由更新中传递子网掩码信息,子网信息可以精确区分,消除了不连续地址的问题。
使用VLSM地址分配方案要考虑两个主要问题:
1.子网中待分配的最多主机数,根据计算公式2^n-2,得出主机需要的位数
2.子网的数量,根据计算公式:2^n,得出子网需要的位数。
随着网络规模的扩大,网络的数量日益增长,过大的路由表会带来一些问题:
1.CPU的路由计算,路由检索的负荷加剧,潜在造成数据传输的延迟。
2.大量路由信息的传输占用了有效带宽。
3.路由器需要更多的存储器存储路由信息。
4.频繁的网络变动,造成路由收敛时间延长。
因此,大型网络中,控制路由表的规模也是非常重要的。该问题可以通过路由聚合(Route Aggregation,有时也称路由摘要,路由汇聚)得到解决。在使用有类路由协议的传统网络中,路由信息经过不同主类别网络边界时,也会自动执行路由聚合。不过,此种路由聚合被限制在主类别网络的边界,灵活性比较差。新的路由协议中支持VLSM,可以手动控制,在多层次进行聚合,极大地提高了聚合的灵活性。
路由聚合通过汇聚若干条路由记录为一条路由记录,有效减少了路由信息量,降低了CPU处理路由的负荷,路由器对存储空间的需求,同时也加快了路由表收敛的速度。
路由聚合的另外一个好处是可以有效地屏蔽网络中局部的变动对网络全局的影响。随着网络规模的扩大,设备,链路故障的可能性增大,在某些路由协议中,如OSPF,某个链路的失效或端口UP,DOWN都会引起整个网络的路由计算,增加了路由器的负荷和低效的数据流动。我们可以通过划分区域和路由聚合等手段,把网络变动的影响限制在一个小的区域内,变动只对该区域产生影响,而不会影响到整个网络。
图6如图6,路由器D作为区域边界路由器连接到公司骨干区域,在未执行路由聚合前,D中包括8条路由记录(/24位路由2条,/27位路由3条,/30位路由3条),经过聚合以后,D只需向骨干区域传送一条172.16.12.0/22的记录即可。同时,由于采用了路由聚合,区域内部网络的变动引起的路由表的变化将只影响到本区域内部,其它区域不受影响。
下面以RIPv2为例,演示执行路由聚合的方法:
router rip//启动rip进程
version 2//切换到ripv2版本
no auto-summary//关闭自动聚合,切换为手动聚合
int s1//切换到s1端口
ip summary-address rip 172.16.12.0 255.255.252.0//手动配置路由聚合到172.16.12.0/22
网络聚合的计算可以归纳为3步:
1.写出待聚合地址的二进制形式。
2.从左到右找出连续相同的位,统计相同的位数。
3.写出聚合地址。
聚合地址计算示例:
表一
聚合地址 172.16.12.0/22 :有相同的前 22 位不相同的 10 位
172.16.12.0/24 10101100. 00010000.00001100.00000000
172.16.13.0/24 10101100. 00010000.00001101.00000000
172.16.14.0/27 10101100. 00010000.00001110.00000000
172.16.14.32/27 10101100. 00010000.00001110.00100000
172.16.14.64/27 10101100. 00010000.00001110.01000000