问题一:如何清理“僵尸”LSA?场景:假设路由器A发出了一个LSA,然后突然断电崩溃了。它发出的这个LSA还存在于其他所有路由器的数据库中。由于A已经崩溃,它无法再发出一个新的LSA来声明“我之前发的作废了”。这个“已死”的LSA就会一直留在大家的数据库里,成为一个僵尸LSA,可能导致错误的路由。解决方案:年龄到期任何一个持有这个LSA的路由器,都会不断地在泛洪过程中增加它的 Age 值。
最终,当这个LSA的 Age 达到 MaxAge(3600秒)时,路由器会执行一次特殊的 “泛洪”。
这次泛洪不是为了传播信息,而是为了 “通知所有人,这个LSA过期了,请立即删除”。
收到 Age = MaxAge 的LSA后,所有路由器都会将它从自己的数据库中清除。
这就相当于一个自动的“垃圾回收”机制,确保了任何LSA都不会在网络中永久存在。问题二:如何让重启的路由器快速同步?场景:路由器A重启了。它不记得自己崩溃前使用的序列号是多少了。如果它从一个很低的序列号(比如0)开始发送LSA,其他路由器会因为拥有序列号更高的“旧”LSA而认为A发来的是过时信息,从而忽略它。A就被“孤立”了。解决方案:提前让旧LSA过期在A重启后,它不会立刻发出自己的LSA。它会先等待,听一下邻居的信息。
同时,在A重启的瞬间,网络中原本属于A的那些旧LSA还在,并且它们的 Age 还在不断增长。
当A的邻居发现与A的连接恢复后,它们会主动将自己数据库中属于A的、且 Age 已经很大的LSA,以 Age = MaxAge 的形式泛洪回来,目的是 “询问A,这个信息现在还有效吗?”
A收到这个“过期”的LSA后,就能意识到:“哦,这是关于我自己的旧信息,网络正在问我最新情况。” 于是,A就可以用一个全新的序列号发出最新的LSA来回应。
这样,A就顺利地重新加入了网络,而不会因为序列号混淆而被孤立
任何一个路由器,只要它的链路状态数据库里存储着一份LSA,这份LSA的 Age 字段就会随着系统时钟的滴答声而每秒自动增加1当路由器需要转发一个LSA时(即执行泛洪操作),在将LSA放入发出去的数据包之前,它会先把这个LSA的 Age 值增加一个特定的量