1)线性序列号空间
一种办法是使用一个非常大的线性序列号以至于根本不可能到达上限,如使用32位长字段(IS-IS就是这样);如果一个链路状态路由选择进程用完了所有序列号,那么它在重新使用最低序列号之前必须停止(重新启动),并等待它所发出的LSA在所有数据库中都不再使用。假如最大的时间是1个小时或者更长,那么这种方法是不可行的。
在路由器启动期间会出现一种更常见的困难。如果路由器A重启之后,它无法记得上次使用的序列号,必须重新使用1.但是如果路由器A的邻居仍然在数据库中保留了路由器A上次的序列号,那么越小的序列号也就是越旧的序列号,因而会被忽略。
更好的解决办法是在泛洪扩散行为中添加新的规则:如果一台重新启动的路由器向邻居发送LSA的序列号比邻居保存的序列号还要老,那么邻居会发回自己保存的LSA和序列号,这样就台路由器将知道启动前自己使用的序列号并作出相应的调整。
然而仍需要小心,最近使用过的序列号不能接近上限,否则,重新启动的路由器将不得不再次重新启动。必须设定规则限制路由器“跳跃”地使用序列号。例如,规则指明一次序列号增加不能超过整个序列号空间的二分之一(实际公式要复杂,因为要考虑年龄的限制)。
2)循环序列号空间
这种方法数字是循环使用的,在32位空间内紧跟在4 294 967 295后面的是0;它在重新启动路由器后也可能会遇到同线性序列号一样的问题!其结构如下:
循环序列号建立了一个不合逻辑的奇特位。如果X是1到4 294 967 295之间的一个数,那么0<x<0!在运行正常的网络中通过声明两条规则可以维持这种条件,其中声明的规则来确定什么时候一个序列号大于或小于另一个序列号。假设序列号空间为n,则两个序列号a和b,如果满足以下任意一种条件,则认为a更新(数量更大):< p="">
a<b且(a-b)<=n p="" 2
an/2
假设这样一种情况:在一个网络中使用6位序列号空间。现在其中的一台路由器决定离线,当它在离线之间,突然发送了3个相同且序列号为44(101100)的LSA。不幸的是,一个邻居也发生了故障,丢掉了几位数据,丢失的数据位是第2个LSA和第3个LSA序列号中的1位,随即该邻居路由器向外泛洪了这3个LSA,结果造成3个LSA序列号各不相同:
应用循环规则可得:44比40更新,40比8更新,8又比40更新!这个结论使3个LSA都持续扩散下去,数据库也不断地被最新的LSA更新,直到数据库缓存被塞满,CPU超载为止,最终整个网络崩溃!
相关推荐