路由表的更新操作主要来自于:
1)使用netstat,route进行手动添加或者从interface(我的机子是ubuntu)配置文件中添加静态路由。
2)路由守护程序通过RIP或OSPF协议和其他路由器进行信息交换,从而获得网络拓扑图,并使用最短路算法,bellman-ford或者dijstra算法进行最短路计算。
3)由ICMP协议的路由发现报文和重定向差错报文实现。
以上,1是进行静态路由。静态路由是在路由器中设置的固定的路由表。除非网络管理员干预,否则静态路由 不会发生变化。由于静态路由不能对网络的改变作出反映,一般用于网络规模不大、拓 扑结构固定的网络中。静态路由的优点是简单、高效、可靠。在所有的路由中,静态路 由优先级最高。当动态路由与静态路由发生冲突时,以静态路由为准。
2是动态路由动态。路由是网络中的路由器之间相互通信,传递路由信息,利用收到的路由信息更 新路由器表的过程。它能实时地适应网络结构的变化。如果路由更新信息表明发生了网 络变化,路由选择软件就会重新计算路由,并发出新的路由更新信息。这些信息通过各 个网络,引起各路由器重新启动其路由算法,并更新各自的路由表以动态地反映网络拓 扑变化。动态路由适用于网络规模大、网络拓扑复杂的网络。当然,各种动态路由协议 会不同程度地占用网络带宽和CPU资源。
3是对静态路由进行差错更正(ICMP重定向差错报文),或者在引导期间,利用ICMP路由发现协议进行路由表生成。
以下是IP层的工作流程:
下面我们主要讨论动态路由选路:
1)首先路由算法必须是简单的,因为复杂的算法会增加网络通信量。
2)其次算法应该是具有自适应能力的,能适应网络拓扑的变化,而且是具有稳定性的,就是说,算法在某个路由故障或者修好以后能及时改变其他路由的路由表进行正确的选路,那么其收敛应该是快速的,而且在相同的网络拓扑不改变的情况下,统一目的地的选路结果总是相同的。
3)最后,算法应该是最佳的,公平的。这就意味着算法应该是利用最短路算法,而且每个RIP报文使用广播的形式无差别的对局域网内的各个路由或主机进行通知。
RIP:是分布式距离向量,每一个路由器都要不断的和其他一些路由器交换路由信息。
为了满足以上的路由算法条件,
1)RIP只和相邻的路由器交换信息,降低复杂度
2)按固定时间或者当网络拓扑发生变化时更新路由信息,从而提高其自适应能力,能尽快适应当前网络拓扑。
3)利用bellman-ford算法进行最短路计算。
但是在第二点上还有一个问题,就是RIP在网络出现故障的时候总是要经过比较长的时间才能把这个信息传送到多有的路由器,原因是,bellman-ford的最短路计算是通过它旁边的路由器提供的路由表进行更新的,可是往往我的路由表中的信息要依赖于你,你的信息又要依赖于我,所以在发生变化时总要经过数次RIP交换才能收敛。
命令(command):8比特,总共有6个选项,1表示请求,2表示应答,3、4弃用,5轮询,6轮询表项。
版本(version):8比特,1或2,表示RIP的版本。
地址系列:连续20个字节的制定地址系列,包括其地址类型认证(address family identifier)(对于IP而言是2)、IP地址(IP address)、还有度量(metric)。
度量就是RIP中的距离(跳数),RIP更新时认为好的路由就是它通过的路由器数目少(距离短)。RIP允许一条路径上最多含15个路由,就是说当跳数大于等于16,就是不可达。
RIP报文最多可以通告25条路由,因为它使用的UDP作为运输层的传输协议,并且规定了要小于512字节,所以25×20+4=504,刚好满足。
最后让我们看看,RIP是如何进行路由选路的(RIP常用的UDP端口是520):
启动routed(路由守护程序,linux中的守护程序都以d结束),在每个启动的接口上发送一个请求报文(Command为1),请求和它直接相连的路由器发送完整路由表。一般是对当前网络其他设备的520端口进行广播。
请求完整路由表是一种特殊的请求报文,其命令字是1,但地址为0,度量设为16。
接受到请求时,如果这个请求是请求完整路由表,那么路由器把完整的路由表发送给请求者。否则,处理请求中的每一个表项:如果指明地址的路由,就把度量设为当前接收方的值,否则设为16。然后发回响应。
接受到响应时,可能更新路由表。
选路更新是定期进行的,所有或部分路由器把他的完整路由表发送给相邻的路由器。发送路由表以广播形式发送给其他设备。
或者当有一条路由的度量发生变化,就对它进行更新。
OSPF:使用分布式的链路状态协议。
它和RIP不同的地方在于:
1)向本自治系统中所有路由器发送信息。使用方法是洪泛法,这就是路由器通过所有的输出端口向所有相邻路由器发送信息。而每一个相邻路由器又再将此信息发往所有的相邻路由器。最终整个区域所有的路由器都得到这个信息的一个副本。而RIP只向自己相邻的路由器发送信息。
2)发送信息就是与本路由器相邻的所有路由器的链路状态。但这只是路由器所知道的部分信息。链路信息就是说明本路由器和那些路由器相邻,以及该链路的度量(代价,费用,距离,或者时延)。
3)只有当链路状态发生变化时,路由器才用洪泛法发送次信息。而不想RIP,不管网络拓扑有没变化都定期交换路由信息。
每个路由器之间都频繁的交换路由信息,因此所有的路由器都最终能建立一个链路状态数据库,这就是全网的拓扑结构图。RIP协议的每一个路由都知道所有网络的距离和下一跳的路由器,却不知道全网的拓扑结构。所以OSPF总是能及时更新其路由表,能够很快的收敛。
4)OSPF不用UDP,而是使用IP数据报进行传送,与RIP使用UDP不同,这样做可以简短OSPF的数据报。
5)OSPF是使用无分类编址CIDR和可变长的子网划分,以此可以把同类相邻的目的地址进行合并,缩小路由表的大小。
版本号:当前版本号为2
类型:五种类型之一,见下文。
分组长度:包括OSPF首部在内的分组长度,以字节为单位。
路由ID:标志发送该分组的路由器的接口的IP地址。
区域标识符:分组属于的区域标识符。
检验和:检测分组中的差错。
鉴别类型:目前只有0(不用)和1(口令)。
鉴别:类型为1时有效,填入8个字符的口令。
1)类型1,问候分组,用于发现和维持邻站的可达性。
2)类型2,数据描述分组,向邻站给出自己的链路状态数据库中所有的链路状态的摘要信息。
3)类型3,链路状态请求分组,向对方发送某些链路状态项目的详细信息。
4)类型4,链路状态更新分组,用洪泛法对全网更新链路状态。这种分组最复杂,也是OSPF最核心的部分,用于把分组的链路状态通知给邻站。
5)类型5,链路状态确认分组,对链路更新分组的确认。
如果连续40s都没有收到某个路由器发来的问候分组,那么认为该相邻路由器是不可达到,应该重新计算路由表。
OSPF并不是简单的让所有路由器把自己的本地链路状态进行全网广播,而是让每一个路由器用数据库描述分组和相邻路由器交换本数据库中已有的链路摘要信息(指出有那些路由器的链路状态信息已经写入了数据库)。避免周围相邻数据库发送本地数据库已经有的链路状态。
而当某个路由器状态发生变化时,该路由器使用链路状态更新分组,向全网用可靠的洪泛法更新链路状态(可靠的原因:有ACK进行回应)。
为什么OSPF收敛快呢?
因为OSPF使用可靠洪泛法,并且每个路由中都有本网的网络拓扑结构,所以每次发生变化,当前路由总是可以快速更新自己的数据库,并使用可靠洪泛法更新其他的路由器。不像RIP我的路由表中的信息要依赖于你,你的信息又要依赖于我,所以要进行数次更新才可。
其实,OSPF和RIP的实现(行为)很大程度上取决于他们的算法实现,下一篇博客将会对dijstra和bellman-ford进行阐述。