路由汇总
此文章源自 Cisco Press,经过了我的工地英语翻译,并且添加了很多个人私货,不一定准确。请注意甄别并酌情观看。如有错误还请斧正。
为什么需要路由汇总
有人曾说,如果没有路由汇总,互联网的骨干网早就会在1997年因为路由表太大炸掉了。那么作为一位精致的网工壬,要时刻记住你每宣告一条路由,要更新的路由表就会变大。那么,为了减少向邻居宣告(advertise)的路由数量,就要做路由汇总(route summarization),或者叫“超网化(supernetting)”。
无论你用的是哪种路由协议,不管它是距离向量(distance-vector)协议还是链路状态(link-state)协议,路由信息都会随着你宣告的路由数量的增长而增长。简单来说,你宣告了10条路由,路由器就要多宣告10行数据,你宣告得越多,这个数据包就会越大,传输所需的带宽就会越多,这样实际用来传输数据的带宽就会变少了。而如果用了路由汇总,就可以在更新包中用一行来取代原来的10行数据,这样就能节省带宽了。
路由汇总除了能节省更新路由表所花费带宽外,还能够节省路由器的CPU算例。因为路由器将一个包转发出去的时候,要根据路由表来决定这个包应该从哪个接口(interface)出去。那么问题就来了,路由器查路由表要消耗算力,路由表越大,消耗的算力就越多。如果做了路由汇总,路由器就不用浪费这么多的资源来查表了。
路由汇总如何实现
举个栗子
现在这里有一个拓扑
在上面这个网络中,Winnipeg、Calgay和Edmonton(以下简称W城、C城和E城)都各自宣告了自己的内部网路给Vancouver(以下简称V城)的主路由。如果没有路由汇总,V城就会直接宣告16个网路给隔壁Seattle(以下简称S城)。
现在来表演一个魔术,看看路由汇总是怎么样来减少路由器们的负担的。
第一步:汇总W城的路由
首先,将W城的路由都转成二进制,看看有没有什么可以用来搞事的共同点。
W城都是/24
,主要观察前24位。
172.16.64.0 => 10101100.00010000.01000000.00000000
172.16.65.0 => 10101100.00010000.01000001.00000000
172.16.66.0 => 10101100.00010000.01000010.00000000
172.16.67.0 => 10101100.00010000.01000011.00000000
发现了吗?它们的前22位都是一样的
172.16.64.0 => 10101100.00010000.01000000.00000000
172.16.65.0 => 10101100.00010000.01000001.00000000
172.16.66.0 => 10101100.00010000.01000010.00000000
172.16.67.0 => 10101100.00010000.01000011.00000000
因此我们可以找一个 代表前22位是一样的 的掩码(mask)来把这四个网络搞成一个。
用/22
或者255.255.252.0
汇总成
172.16.64.0/22
这一个地址会告诉V城的上游路由器,如果有看见有目的地的前22位是10101100.00010000.010000xx.xxxxxxxx
的包,就把他们丢去W城。
将172.16.64.0/22
这一条汇总后的路由宣告给V城,比原来宣告4条效率高多了。
第二步:汇总C城的路由
如法炮制,转成二进制,看看C城的内网有没有什么共同点:
172.16.68.0 => 10101100.00010000.01000100.00000000
172.16.69.0 => 10101100.00010000.01000101.00000000
172.16.70.0 => 10101100.00010000.01000110.00000000
172.16.71.0 => 10101100.00010000.01000111.00000000
共同点还是前22位:10101100.00010000.010001xx
所以汇总后的路由就是172.16.68.0/22
.
第三步:汇总E城的路由
虽然E城内部网路有点多,但是不要怕,做法都一样,转成二进制后看看他们有没有什么共同点:
172.16.72.0 => 10101100.00010000.01001000.00000000
172.16.73.0 => 10101100.00010000.01001001.00000000
172.16.74.0 => 10101100.00010000 01001010.00000000
172.16.75.0 => 10101100.00010000 01001011.00000000
172.16.76.0 => 10101100.00010000.01001100.00000000
172.16.77.0 => 10101100.00010000.01001101.00000000
172.16.78.0 => 10101100.00010000.01001110.00000000
172.16.79.0 => 10101100.00010000.01001111.00000000
共同点是前21位:10101100.00010000.01001xxx
所以汇总后的路由是172.16.72.0/21
.
第四步:汇总在V城上的路由
我们可以看见V城的路由器连着隔壁S城的路由器。
同样地我们也可以把V城路由器上的路由汇总再通报给隔壁S城。
做法也一样,将在V城路由器上的都转成二进制,找共同点。
现在V城路由器上的路由有三条,他们分别是,
172.16.64.0 => 10101100.00010000.01000000.00000000
172.16.68.0 => 10101100.00010000.01000100.00000000
172.16.72.0 => 10101100.00010000.01001000.00000000
共同点是前20位:10101100.00010000.0100xxxx
所以可以汇总成172.16.64.0/20
.
这时候,V城只需要用一行就能代替原来的16行的更新了。这样路由器处理起来的效率就高很多了。
路由汇总和 Route Flapping
路由汇总的另外一个好处与 route flapping 有关。
一个路由器因为某些原因,比如接口硬件上的故障或者误配置,导致路由器上的网络又up又down又up又down,造成路由器不停地向外通告那个网路的状况,就叫做 route flapping。路由汇总能隔离上游的邻居,使上游的邻居免受 route flapping 的侵扰。
试想一下,上图E城的路由器中的 172.16.74.0/24
down 了,如果没有路由汇总,E城就会通告V城删除那个网络,V城又会向C城、W城和S城通报这一状况。然后又过了几秒172.16.74.0/24
又好了,E城又向V城通报,V城作为上游又去通报给C城、W城和S城,然后突然这个网又down了,E城再通报…………这样的耍猴行为会消耗大量的带宽和算力。在像OSPF这种CPU密集型(CPU-intensive)的协议中,在这种情况下,网路流量去到目的地的速度会受到显著的影响。
而开启路由汇总就能避免这种情况。在上面的案例中,尽管E城自己还在使劲处理那个反复横跳的网路,但是没有任何人会因此受到伤害,因为E城只会send172.16.72.0/21
出街。172.16.74.0/24
的反复横跳不会使172.16.72.0/21
这一汇总后的路由失效,V城不会知道E城后宫失火。路由汇总就是这样来保护和隔离其他路由器免受 route flapping 伤害的。
做路由汇总的要求
做路由汇总有一些要求:
- 路由器要正在运行一个无类别的路由协议(classless routing protocol),比如 RIPv2、OSPF、EIGRP、IS-IS和BGP,因为路由汇总要在更新中携带classless的 subnet mask.
- IP地址需要一层一层地来分配,使汇总的地址能在高位上包含它们,不然汇总了等于没汇总。比如W城有
172.16.64.0
和172.16.67.0
,C城有172.16.65.0
,而E城又被分配到172.16.66.0
,这时候路由汇总就没用了。因为这时候在V城上不可能有路由汇总发生。
W => 10101100.00010000.01000000.00000000
W => 10101100.00010000.01000011.00000000
C => 10101100.00010000.01000001.00000000
E => 10101100.00010000.01000010.00000000