距离矢量路由协议和链路状态路由协议相比,前者是依照“传闻”来进行路由选择,而后者是每台路由器独立地计算最优路径。
详细地说,每台运行了链路状态路由协议的路由器会和它的邻居建立邻接关系并且互相给自己的每个邻居发送一些数据(在此我们用OSPF中的术语“LSA”称呼),LSA中包含了本地链路、链路状态、路由接口到链路的代价、链路连接的所有邻居等信息。当一台路由器收到了另一台路由器发送的LSA后,它会将其中信息复制一份放在自己的数据库中并继续将此信息发送给其他路由器。如果一切顺利的话,所有路由器的数据库都会一致。此时,路由器使用Dijkstra算法对网络图进行计算得出到每台路由器的最优路径,再从数据库中查找每台路由器所连接的子网并写进路由表。
较为常见的链路状态路由协议有OSPF(开放式最短路径优先)、IS-IS(中间系统到中间系统)等。
邻居
建立链路状态环境的第一步是使用Hello Protocol发现邻居。
Hello数据包中一定包含路由器ID、发送数据包的网络地址等信息。路由器ID用于将路由器与路由器区分开来。Hello数据包的其他字段还可以有子网掩码、Hello间隔、线路类型描述符等信息。
当两台路由器使用Hello数据包建立了邻接关系后,链路状态路由协议就可以开始在受控的方式下交换信息了。与距离矢量路由协议不同,链路状态协议只需要在配置了路由协议的接口上广播更新信息。
Hello数据包还可以用来监视邻接关系。某台路由器如果在特定的时间内没有从邻居收到Hello包的话,就会认为该邻居不可达并解除理解关系。CISCO默认的Hello数据包发送间隔为10秒,死亡周期是间隔时间的4倍。
链路状态泛洪扩散
当邻接关系建立之后,路由器就会开始向邻居发送LSA。路由器会保存收到的LSA并且依次向自己的每个邻居扩散。由于LSA是几乎立刻被转发,而距离矢量路由协议则是在发送路由更新(无论是刚刚建立还是触发更新)之前先更新自身的路由表,因而当网络拓扑发生变化时,链路状态协议的收敛速度要快于距离矢量协议。
使用单播和组播地址、校验和以及主动确认能够使泛洪扩散更加高效可靠。
由于链路状态路由协议必须保证所有路由器都收到LSA,那么就出现了一个问题:当所有路由器都收到LSA后,泛洪扩散如何中止呢?即使数据包中的TTL过期后会中止,但是在过期之前,这些数据包还是会无可避免地占用链路资源。解决这个问题的办法是在LSA中加入序列号,路由器如果收到一个与之前收到过的拥有相同序列号的LSA数据包的话,它会自动将该数据包丢弃;只有在收到了一个比自己接收的上个序列号数值更高的LSA数据包时,他才会更新数据库。那么这时又有一个新的问题:如果序列号到达了上限,这可如何是好?这个问题解决起来方法多样且较为复杂,详情见下篇笔记。
链路状态数据库
发现邻居并且进行链路状态泛洪扩散后,路由器就会建立链路状态数据库。数据库根据LSA中的信息建立。需要注意的是,LSA中包含有一个被称为代价的,即某条链路到邻居的信息。代价与出接口有关,因此会存在链路两端代价不相同的情况。
原文地址:http://blog.51cto.com/13505345/2073886