深入理解计算机网络-8网络层4

目录

一、最短路径算法——Dijkstra迪克斯特拉算法

二、扩散路由算法Flooding

三、距离矢量路由算法Distance Vector ,DV

四、链路状态路由算法Link State Routing

1.发现邻居结点并知道其网络地址。

2.测量到各邻居结点的延时或开销。

3.构造一个分组以告知刚知道的所有消息。

4.将这个分组发给所有其他路由器。

5.使用Dijkstra算法技术按到每个其他路由器的最短路径。


本节主要介绍常见的集中路由算法

一、最短路径算法——Dijkstra迪克斯特拉算法

用箭头来特别标识永久性工作结点,然后依次检查每一个与当前结点直接连接的相邻结点,并把它们与起始结点之间的距离重新以(n,N)的方式标识,n为与起始结点相距的长度,N为最近的工作结点。如下图的上方的A结点

B到A=2,G到A=6,选择最短的B到A,即B为永久性工作站点

C到A=CBA=7+2=9,E到A=EBA=2+2=4,选择E为工作结点

F到A=FEBA=2+2+2=6,G到A=GEBA=1+2+2=5,选择G为工作结点

注意:按照计算,此时应该把H结点标识为下一个工作结点,但事实上H经G到E的=4+1=5要长于H经F到E=2+2=4,所以经过后面的计算发现,在前面把G标识为永久性结点是错误的,这是要把F标识为工作结点,撤销G结点永久性工作结点的资格。

Dijkstra算法虽然能得出最短路径,但由于便利计算的结点很多,所有效率低。另外,有些结点还不能一次标识正确,应为还要考虑后续结点到源结点的距离,如上面G和F的选择。

二、扩散路由算法Flooding

最初原始的方法是把每一个接收到的分组从除接收端口之外的所有其他端口转发出去。

原始的扩散路由算法会产生大量的分组副本,而且还会造成分组死循环。

解决各端口重复接收相同分组的问题,有两种办法:

一是在每个分组头部中携带一个跳数计数器,分组没到一个结点就减1,减到0就丢弃。计数器的初始值可以设为相距最远的两个结点之间的跳数,这样可以减少循环转发的分组。

二是在结点上标记哪些分组已被转发过,对于重复接收的分组直接丢弃。源结点从主机收到一个分组后为其分配一个序号,同一分组的序号相同。同时每个结点对于每一个源结点维护一张序号表,记录收到来自同一源结点的所有分组序号。每当一个结点收到分组后,就用分组的序号去查找该源结点的序号表,如果存在则直接丢弃。为防止序号表过大,还应增设一个计数器K,表示序号直至K的分组都已经转发过了,从而不需要保留序号小于K的序号。

由于扩散算法的强壮性非常好,只要存在一个链路,数据仍能完整地向前传输。常用于军事网络。还如,无线网络中,一个站点发出的所有消息可以被位于无限距离范围内的所有站点接收,实际上也是一种扩散路由算法;数据库系统中,如果数据库中有多台服务器,采用扩散路由算法,则数据库系统的更新效率会大大提高。

三、距离矢量路由算法Distance Vector ,DV

也称为Bellman-Ford路由算法和Ford-Fulkerson算法,主要在RIP(Route Information Protocol)协议中使用。cisco的IGRP和EIGRP也使用DV算法。

基本思想:每个路由器维护一个距离矢量表(通常以延时作为变量),然后通过相邻路由器之间的距离矢量通告进行距离矢量表的更新。

每个距离矢量表项包括2部分:到达目的结点的最佳路径和所需要的时间或距离。

通信子网中的其他每个路由器在表中均占据一个表项并作为该表项的索引。

每个一段时间(30秒),路由器会向所有邻居结点发送它到每个目的结点的距离表,同时也接收每个邻居结点发来的距离表。这样,经过一段时间后便可将网络中各路由器所获得的距离矢量信息在各路由器上统一起来,各路由器只需要查看这个距离矢量表就可以为不同来源的分组找到一条最佳路由。

在拓扑结构发生变化时,各路由器的路由表会发生变化,重新更新。

四、链路状态路由算法Link State Routing

基本思想:网络中各个结点不必交换通往目的站点的距离,而是维护一张网络拓扑图,在网络拓扑结构发生变化时及时更新拓扑图即可。步骤如下:

1.发现邻居结点并知道其网络地址。

当一个路由器启动时,只需要在每一条点到点线路上发送一个特殊的Hello分组即可,另一端路由器返回一个应答。

2.测量到各邻居结点的延时或开销。

最直接的方法是路由器在线路上发送一个特殊的ECHO分组,收到ECHO分组的路由器必须立即发回一个应答,通过测量发送与接收之间的时间(来回时间)并除于2即可得到单向的线路延时。可多测几组 数据,求平均延时,也就是开销Cost。

3.构造一个分组以告知刚知道的所有消息。

什么时候构造链路状态分组比较合适?

一是周期性地产生链路状态分组;

二是仅在发现网络拓扑发生改变时才产生,如邻居集合发生变化或到邻居的线路延时发生了变化

4.将这个分组发给所有其他路由器。

该算法最复杂的部分是如何可靠地发送链路状态分组。当分组被发送和安装后,先得到分组的路由器就会用它来改变自己的路由表,此时不同的路由器可能会使用不同的网络拓扑版本,这可能导致不一致、路由环路、不可到达结点等问题。

  为了可靠地发送链路状态分组,采用了扩散算法。每个分组携带一个序号,每当发送一个新的分组时,分组序号就加1.每个路由器维护一张由源路由器、分组序号组成的列表,记录从每个源路由器收到的最新的分组序号。当一个链路状态分组到来时,用分组中的源路由器地址和序号检查列表,如果这是一个新的链路状态分组,就用扩散算法再将其转发出去否则将分组丢弃。

5.使用Dijkstra算法技术按到每个其他路由器的最短路径。

一旦一个路由器收集齐了一整套链路状态分组,就可以建立完整的通信子网图。在这张图中每条链路均被报告了两次(因为一条链路连接了两个结点,它们会分别进行计算),这两个值可以分开用,也可以求平均值。通信子网图建立起来后,就可以运行Dijstra算法求路由器到任何目的路由器的最短通路。各路由器上的最终路由表一样。

实际上,运行链路状态算法并非一定要采用Dijkstra算法,唯一必须遵从的要求是所有结点都应该使用完全相同的度量制式,也就是说,不论使用什么算法,只要能找到相同的最短路径即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值