路由原理的发明应该算宋朝人才对。宋朝陈元靓《事林广记·卷九·警世格言》作“自家扫取门前雪,莫管他人瓦上霜”。路由器正是严格遵守了这个原则。
普遍认为,路由器在收到一个数据包时,会查看路由表,然后做出路由决策。路由器只关心路由的下一跳是否可达,如果还有下一跳,那么下一跳的下一跳是否可达它是不管的。这里的潜台词是两个问题:1、下一跳在哪儿?2、下一跳是否可达?只有在两个问题的答案都是肯定的时候,路由表才有效。
由动态路由协议生成的路由表项都会将下一跳指向直连路由器,这回答了第一个问题;由于直连路由器要么可达要么不可达,不可能出现一定不可达的情况(除非你把路由器跟微波炉接在一起了),因此它能够回答了第二个问题。很多复杂路由问题都可把它简化成对这个两个问题的解答。例如某条路由突然莫名其妙地消失了,多数是这条路由所在的路由器与邻近路由器的直连链路down掉了,然后邻近路由器通过其它直连链路一个接一个地通知到所有路由器。
但我们还有一些时候是需要手工配置静态路由的。这为我们控制路由提供了较大的灵活性(同时也带来额外的管理开销)。
静态路由同样需要回答上面的两个问题。不过这一次思路可能不太一样。一般情况下照着动态路由协议的思路是没有问题的。但人脑毕竟比机器聪明。递归路由就是人脑干的杰作。
假如我们有三台一个接一个串在一起的路由器R1---R2---R3。R3上有一条链路r3。假定需求要求我们在R1上写一条到达r3的静态路由,一般人可能会毫不犹豫地这么写:ip route r3 R2(为方便描述使用伪代码)。这当然是可以的。还有别的写法吗?如果我这么写:ip route r3 R3,你可能以为我疯了。真的吗?让我们来分析一下。
首先,ip route r3 R3能回答第一个问题吗?可以:它的下一跳是R3。能回答第二个问题吗?可以:下一跳要么可达,要么不可达。因此这条路由完全可能出现在路由表里。为了确定路由的有效性,接下来我们还要明确这两个问题是不是可以得到肯定的答案。对于第一个问题,我们已经给出了肯定的回答;第二个问题似乎有点犹豫。R1到底能不能到达R3呢?已知R1可以到达R2,R2可以到达R3,如此推算,R1必定可以到达R3。我们终于看到曙光了。可是且慢,还有一些工作要做。R1要到达R3,同样要先查路由表,因此我们必须保证R1有到达R3的路由。这就是我们要先做的准备工作。假定R1在路由表上查到到达R3的路由是直连路由器R2,它会基于这样一种逻辑:我知道r3在R3家里,我还知道通过R2可以去到R3家,我一定能找到r3;我不能直接去R3,但是我可以直接去R2。于是数据包被转发给R2。这就是传说中的路由递归查找,或递归路由。
递归路由最终还是要归于直连路由的。说白了,路由器转发数据包不会凭空跳到远端路由器,任何时候都是一跳一跳地传。但在配置静态路由的时候,我们可以打破常规让它从空中“飞”过去到达远端。这么做的意义在哪儿呢?大师们设计这个东西自有它的道理。在我看来:首先,如果R1上有N个接口,很多很多,多到你搞不清或者不想搞清哪一个接到R2了,你这么写就比较省事;而且其实你不一定非要指定R3(ip route r3 R3)作下一跳,任何路由器(写成ip route r3 Rn)都可以,只要这台路由器对R1可达并能找到去r3的路就行(路由优化的任务就顾不了了);还有,如果R1有N条出口可以到达R3,为什么一定只能写ip route r3 R2呢?比如还有ip route r3 R4、ip route r3 R5...等,如果每条路径都写,会不会太累了?但如果写成递归路由,只写一条就行了(这种情况最好写ip route r3 R3),还可以自动地在多条路径上实现负载或冗余。
回到篇头的那句话,我们似乎对路由器要求得太高了,它的工作是这么地忠于职守。正是每台路由器都把自家门口收拾利落了,才带来了整个系统的正常运行。现实也未尝不是如此,每个人都能做好自己份内的事对整个事业就是最大的贡献。
扯远了。







发表评论 评论 (3 个评论)