|
前面已经谈到链路状态路由协议在共享路由信息之前必须先建立逻辑连接--邻居关系。
当邻居关系建立完成后,路由器之间开始发送LSA,术语“泛洪”可以看出这些LSA将会被通告给整个网络中所有的邻居路由器,路由器保存接收到的LSA, 并将其拷贝发给其他路由器,但是除了发送该LSA的路由器外(水平分割)。
在网络拓扑发生改变时,LSA几乎是立即被转发,而距离矢量路由协议在发送路由更新之前先运行算法并更新自身路由表,连触发更新也是如此,所以这里就是链 路状态路由协议鱿于距离矢量的原因之一
泛洪扩散是链路状态路由协议中比较复杂的一部分。我们采用了很多种方法来使泛洪扩散更加可靠,单播和组播地址,校验和以及主动确认机制等等,有两个过程对 泛洪扩散是极其重要的:排序和老化
大家想象一下,当一个运行链路状态协议的网络中所有路由器都收到了所有的LSA,这个时候,LSA的泛洪扩散必须停止下来!如果不那样的话,LSA将继续 在网络中扩散下去,会对网络造成拥塞甚至是无法通信。LSA报文是被封装在IP包内的,那么大家都知道TTL值,假设泛洪扩散仅仅依赖于TTL值的话,那 么只能依赖到TTL超时,但是直到LSA超时为止,TTL几乎不能有效的允许LSA继续在网络中扩散。
假设在网络中,某路由器A后的网络状态发生改变,那么路由器A将会第一时间发现这一状况,并构建LSA发送出去,它会向所有的邻居发送相同内容的LSA ——完全一样的内容,LSA拷贝。在每个拷贝中都有一个序列号字段,它们的序列号都是一致的!这个序列号会连同LSA的其他部分一同被保存在拓扑数据库 中。
每台收到该LSA的路由器都会拿自己的拓扑数据库中的信息与该LSA的序列号进行比较,如果发现自己已有的序列号和刚收到的LSA的序列号相同,那么路由 器将丢弃这些信息,注意,这里是丢弃,而不是转发。但是如果其他内容相同,但是自己数据库中的相应条目序列号要比刚收到的LSA的小,那么路由器将接收新 的LSA信息,并更新自己的序列号,而且还会泛洪该LSA。按照这种方式,当所有的路由器都收到LSA的拷贝时候,泛洪将停止。
因为序列号是存放LSA的一个固定字段内的,所以它的长度有一定的上限,如果当序列号达到了上界会发生什么情况呢?
1、第一种解决办法,就是给出一个非常长的序列号空间,而且是假定无法到达该上界。例如,我们采用32位长的字段。如果从0开始计算的话,将会有 4294967296个可用的序列号。非常的长。但是,这个世界无奇不有!虽然这个序列号空间非常的长,如果路由器10秒发一次新的LSA,也需要用 1361年才能用完,但是,在这种情况下故障依然会发生!如果一台路由器的序列号即将被用完,那么新的序列号将从哪一位开始编号呢?如果从0开始的话,那 么其他的路由器的序列号都已经到达了顶点,相比0来说,它们会做出一个选择——丢弃0序列号的LSA,因为它们会认为0比本身的序列号更老!那怎么办呢? 如果我们路由器在序列号到达顶点时全部停止,并且等待LSA在所有的数据库中老化死亡。然后全部重新开始采用0序列号。但是如果老化时间很长,比如在一个 小时或者更长,那么这种办法将毫无吸引力!
那么对于此,有一个更好的解决办法:当一台新启动的路由器加入网络后,如果它想其他路由器发送的LSA序列号比邻居保存的序列号要小,那么邻居将把自己拓 扑数据库的LSA和序列号发给它,这个路由器就由此可知自己启动前的序列号,并做出相应调整。
但是又有问题:如果该路由器发现自己启动前的序列号已经接近序列号空间上界,这时,该路由器的协议进程将重新启动……这样的话就会再次进入一个恶性循环 中。
2、循环序列号空间
第一种办法是线性的序列号空间,它的弱点是当序列号到达上界时候会发生问题,那么我们看一下循环序列号空间能否解决此问题。
顾名思义,循环,那么该空间是一个循环空间,即是一个封闭的圆。假如是一个32位的序列号空间,并从0开始,那么到达4294967295之后又回到了 0,从感觉上来说,似乎该序列号空间的序号用不完,但是,故障因此而生……
循环序列号空间建立了一个很奇特,很不符合逻辑的位。假设一个序列号为X,那么X是介于0-4294967295(再加1就回到了0)之间的数,那么 0<X<0。非常的奇怪。
我们来想一下,假设现在有一个6位的序列号空间。2的六次方=64
有两个序列号,5和49,它们两个号,哪个是最新的呢?
我们无法得知!
这里有公式可以计算——在网络工作正常的情况下,假设序列号空间为N,两个序列号分别为A和B,如果满足下列任何一个条件,则认为A更新(数量更大)
*A>B且(A-B)小于或等于N/2
*A<B且(B-A)大于N/2
那么这时候,我们再来看一下刚才的两个序列号,5和49。
A=5,B=49;
套公式,相信大家都会!
A是小于B的,B-A=44
序列号空间的一般:即N/2=32
B-A>32
由公式二可知,A更新!
刚才不知道大家有没有注意到,在讲公式时,提及到了在网络正常的时候,如果网络异常呢?
我们还是举例来说明:
序列号空间为6。该网络其中一台路由器准备离线,在它离线前,它发送了三个相同的LSA,其序列号为44(101100),无奇不有,正好它的一台邻居路 由器因为链路有问题,接收LSA时丢失了其中的几位,恰好,丢失的位正好是LSA2和LSA3中的一位。然后它像平时一样向其他邻居转发了三个LSA
LSA1 44 (101100)
LSA2 40 (101000)
LSA3 8 (001000)
真的是巧哦!
我们把三个序列号套用刚才说的公式来看看,
结果是44>40>8>44,44比40新,40比8新,8又比44新……这时候3个LSA将无休止的在网络中扩散下去,数据库将不停 的更新替换着……一直到缓冲区满,CPU满负荷为止,最终的结果很显然,会导致整个网络的瘫痪。
这些事情看起来匪夷所思,很牵强,但是它却是真实存在的:ARPANET在早期曾使用过六位的序列号空间,在1980年10月27日,两台路由器发生了上 面所说的故障,从而造成ARPANET的停顿 |
|
|
|
|
|
|