一、静态路由与动态路由 巨大的互联网是由许多小网络组成的,这些小网络使用路由器连接起来。在从源点到终点的通信过程中,数据包可能经过多个路由器,直到到达连接目的网络路由器为止。 路由器从一个网络接收数据包,并把数据包转发到另一个网络。一个路由器通常和多个网络相连。当路由器收到数据包时,它应当将数据包转发到哪一个网络取决于路由表的信息。 路由表可以是静态的也可以是动态的,静态路由拥有静态的路由表,动态路由拥有动态的路由表。静态路由表的路由信息是管理员设置的,并由管理员手动进行更新。动态路由表的路由信息是随着互联网的变化而自动更新的。现在只要互联网中有一些变化,路由器就应该尽快的更新路由表,所以现在互联网中的路由器大多使用动态路由表。例如,某条链路不能正常工作了,路由器就应该找到另一条路由,并把路由表进行更新。 由于互联网需要动态路由表的支持,因此就产生了多种路由选择协议。路由选择协议是一些规则和过程的组合。规则使得路由器之间能够共享它们所知道的互联网情况和邻站信息,而过程用来合并从其它路由器收到的信息。 二、内部和外部路由选择 今天的互联网非常庞大,仅仅使用一种路由选择协议是无法处理所有路由器的路由表更新任务的。为此,互联网划分为多个自治系统(AS)。自治系统是在单一的管理机构管辖下的一组网络和路由器。在自治系统内部的路由选择叫做域内路由选择。在自治系统之间的路由选择叫做域间路由选择。每一个自治系统使用一种域内路由选择协议(例如RIP或OSPF)处理本自治系统内部的路由选择。而对于自治系统之间的路由选择一般只能使用"域间路由选择协议(BGP)"来进行路由选择。如下图所示: 图17-1 内部和外部路由选择 三、距离向量路由 距离向量路由选择协议得到的路由是任何两个节点之间代价最小的路由。在协议中,每一个节点维护一个到其它节点的最小距离向量表。在这个表中还指出路径的下一跳地址,以便把数据包发送到目的节点。 下图给出了一个具有5个节点的网络,以及这些节点维护的最小距离向量表。 节点A的路由表指出怎样能够从这个节点到达其它节点。例如,到节点E的最小代价是6,这条路由经过节点C。 图17-2 距离向量路由表 1.初始化 在图17-2中的表是稳定的,每一个节点都知道如何到达其它节点,以及到达其它节点的代价。但是最初的情况并不是这样的,在初始状态下,每一个节点只知道到与它直接相连的节点的代价(假定每一个节点能够向其相邻节点发送一个报文,并且找出从它到这些邻节点的代价)。下图给出了每一个节点的最初的表。对于到不相邻节点的代价则标记为无穷大(不可达)。 图17-3 在距离向量路由选择中的表的初始化 2.共享 距离向量路由选择总体的思想就是在相邻节点之间共享路由信息。节点A不知道有关节点E的路由信息,但是节点C知道。如果节点C把它的路由信息与节点A共享,那么节点A也就会知道怎样到达节点E。另一方面,节点C不知道怎样到达节点D,但是节点A知道。如果节点A把它的路由信息与节点C共享,那么节点C也就会知道怎样到达节点D。这就是路由信息的共享,作为相邻节点的节点A和节点C,如果它们彼此互助,就可以改进其路由表。 3.更新 当一个节点从邻站收到路由表信息时,它就需要更新其路由表。更新的方法如下图所示: 图17-4 路由表更新 在这里,假设收到的路由信息包含两列内容:目的节点和到达目的节点的代价。如下图所示: 图17-5 只包含两列的路由表 下图表示节点A在收到从节点C传来的部分路由表后怎样更新它的路由表。 图17-6 在距离向量路由选择中的更新 这里应该注意几点。第一,把一个数与无穷大相加,结果还是无穷大。第二,修正的表指出怎样从节点A经过节点C到达节点A。如果节点A需要经过节点C到达它自己,它必须先到节点C再返回,因此代价是4。第三,节点A经过路由表更新后,路由表的最后一项改变了。以前,节点A不知道如何到达节点E(代价是无穷大);现在它知道到达节点E的代价是6,要经过节点C。 每一个节点都从其相邻节点接收路由表信息,并用这个信息来更新自己的路由表。在短时间内,如果网络本身没有变化(如链路出了故障),所有节点的路由表就会达到稳定状态,表中的内容保持不变。 4.什么时候共享 一个节点周期性地向其所有相邻节点发送它的路由表信息。这个周期通常为30秒,具体的时间取决于使用的距离向量路由选择协议。 四、RIP协议简介 RIP(路由信息协议)是应用较早、使用较普遍的内部网关协议,适用于小型同类网络,是典型的距离向量路由协议。 RIP通过广播UDP协议520端口封装成的报文来交换路由信息,默认每30秒发送一次路由信息更新报文。RIP提供跳跃计数(hop count)作为尺度来衡量路由距离,跳跃计数是一个数据报到达目标设备所必须经过的路由器数目。RIP最多支持的跳数为15,即在源和目的网络之间所要经过的最多路由器的数目为15,跳数16表示不可达。 RIP协议的特点: ● 仅和相邻路由器交换信息。 ● 交换的信息是当前本路由器所知道的全部信息,即自己的路由表。 ● 按固定的时间间隔交换路由信息,例如:每隔30秒交换路由信息。五、RIP报文格式 RIP报文的格式如下图所示: 图17-7 RIP报文的格式 ● 命令:这个8位字段指明报文的类型,1表示请求报文,2表示响应报文。 ● 版本:这个8位字段定义版本,1表示RIPv1,2表示RIPv2。 ● 地址族ID:这个16位字段定义所使用的协议系列。值为2时表示TCP/IP协议族。 ● 网络地址:这个字段定义目的网络的地址。RIP给这个字段已分配了14字节,可用于任何协议。但是,现在IP只使用4字节。地址的其余部分应填入0。 ● 距离:这个32位字段定义从发送报文的路由器到目的网络的跳数。 六、IP运行过程(动画演示) 初始化:在启动一个路由守护程序时,它先判断启动了哪些接口,并在每个接口上发送一个请求报文,要求其它路由器发送完整路由表。在点对点链路中,该请求是发送给其它终点的。如果网络支持广播的话,这种请求是以广播形式发送的。目的UDP端口号是520。这种请求报文的命令字段为1,但网络地址字段设置为0,而度量字段设置为16。这是一种要求另一端完整路由表的特殊请求报文。 接收到请求:如果这个请求是刚才提到的特殊请求,那么路由器就将完整的路由表发送给请求者。否则,就处理请求中的每一个表项。如果有连接到指明地址的路由,则将距离设置成值,否则将距离置为16(一种称为"无穷大"的特殊值),然后发回响应。 接收到响应:为使响应生效,可能会更新路由表。更新路由表包括增加新表项、对已有的表项进行修改以及将已有表项删除。 定期选路更新:每过30秒,所有或部分路由器会将其完整路由表发送给相邻路由器。发送路由表可以是广播形式的(如在以太网上),或是发送给点对点链路的其它终点的。 在RIP运行过程中,有三个非常重要的计时器:定期计时器、截止期计时器和无用信息收集计时器。 定期计时器:定期计时器用于更新报文的定期通告。虽然协议指明了这个计时器应该设置为30秒,但是在实际应用中,这个计时器的值是25秒到35秒之间的一个随机数。这是为了防止在互联网上由于路由器都同时更新而引起的过载。 每一个路由器有定期计时器,设置为25秒到35秒之间的一个随机数。它向下计数,当到达零时就发送更新报文,然后把计时器再随机的进行设置一次。 定期计时器不受其它计时器的影响,当定期计时器到期时,更新报文就会发送出去,而不管从其它计时系统发出的其它更新报文。 截止期计时器:截止期计时器用于路由的有效性。当路由器收到路由的更新信息时,截止期计时器就对这个路由设置到180秒。每当收到这个路由新的更新信息时,截止期计时器就要复位。在正常情况下,每隔30秒发生一次复位。但是,若在互联网中出现了问题,并且在180秒内没有收到更新报文,那么就认为这个路由过期了,路由的跳数将被设置为16,这表示目的端不可达。每一条路由有它自己的截止期计时器。 无用信息收集计时器:当一条路由变为无效时,路由器将这条路由的跳数设置为16(而不是立即在路由表中清除这条路由),并启动无用信息收集计时器,设置计时器为120秒。当计时器到期时,路由器就从路由表中清除掉。这个计时器使得邻站知道这条路由是无效的。 七、IP的缺点及改进 1.RIP协议的缺点 (1)缓慢收敛 缓慢收敛是RIP的缺点之一,它是指在互联网上某处发生的变化要传播到互联网的其它部分是很慢的。例如,在下图中,网络1有了变化,路由器R1立即更新了自己的路由表。但是,由于每一个路由器每隔30秒才发送其定期更新,因此这表示这个变化要到达R2平均需要经过15秒(0到30秒之间)。R3要收到这个变化又要经过另一个平均15秒,等等。当这个信息最后到达路由器Rn时,已经经过了15×n秒。若n是20,则要经过300秒。在300秒内,ATM网络能够发送超过10亿位。若这样的变化影响这些位,则10亿位就丢失了。 图17-8 缓慢收敛 解决RIP缓慢收敛的方法是限制跳数为15。这样可防止数据包无休止地在网络中兜圈子而阻塞了互联网。因此,数值16被认为是无穷大,并表示不可达的网络。如下图所示: 图17-9 跳数 (2)不稳定性 RIP的另一个缺点是不稳定性,不稳定性表示运行RIP的互联网中数据包可能在一个回路中从一个路由器到另一个路由器兜圈子。把跳数限制为15能够改进稳定性,但不能解决所有的问题。 下图是一个不稳定性的例子,路由器A在它的路由表中对Net1写上的代价是0。路由器B只能通过路由器A才能接入到Net1,因此它的代价是1。现在假定Net1的连接断了,无法接入到Net1,这时路由器A立即响应,并把到Net1这列的代价改变为16(无穷大)。但是,它要等到30秒以后才能把这个新信息放在它的更新报文中发送出。在这时,路由器B可能把更新报文发送给A。路由器A现在有两列到Net1的项目:从它自己的路由表中得到的是代价为16,而从路由器B得到的代价是1。于是A被愚弄了,它想会有另一个路径可经过B再到Net1。路由器A就把他到Net1这列的代价改变为2(1+1),并把这个更新发送给B。路由器B到Net1的代价现在是2(从A)和1(从它自己的路由表)。路由器B知道只有通过路由器A才能到达Net1,因此,它不考虑它自己的较低的代价而是把它代价改变为3(2+1)。这样来回的更新不断继续下去,直到两个路由器都到达代价为16。到这个时候,这两个路由器才知道没有法子接入到网络Net1。 图17-10 不稳定性 2.RIP协议的改进 (1)触发更新 触发更新可提高稳定性。若网络中没有变化,路由器按30秒的间隔发送更新信息。但若网络有变化,路由器就立即发送它的更新信息。这个过程叫做触发更新。 每一个路由器在收到有变化的更新信息时就立即发出新的信息,这比平均的15秒快了很多。虽然触发更新可大大地改进路由选择,但它不能解决所有的路由选择问题。例如,用这种方法不能处理路由器出故障的问题。 (2)水平分割 水平分割也可以提高稳定性,在发送路由选择报文时增加了选择性,路由器必须区分不同的接口。如果路由器从某个接口已经收到了路由更新信息,那么这个同样的更新信息就不能再通过这个接口回送过去。如果某个接口通过了给某个路由器更新的信息,那么这个更新信息就不能再发送回去,这是已经知道了的信息,因而是不需要的。 (3)毒性反转 路由中毒是指路由信息在路由表中失效时,先将度量值变为无穷大,而不是马上从路由表中删掉这条路由信息。 毒性反转与路由中毒概念是不一样的,它是指收到路由中毒消息的路由器,不遵守水平分割原则,而是将中毒消息转发给所有的相邻路由器,也包括发送中毒信息的源路由器,也就是通告相邻路由器这条路由信息己失效了。毒性反转的主要目的是加快收敛。八、IP的限制 虽然RIP有很长的历史,但它还是有自身的限制。它非常适合于为早期的网络互联计算路由。然而,现代技术进步已极大地改变了互联网络建造和使用的方式。因此,RIP越来越不适应今天互联网的需求。 RIP的一些限制是: ● 不能支持大于15跳的路径:RIP设计用于相对较小的自治系统。这样一来,它强制规定了一个严格的跳数限制为15跳。当报文由路由设备转发时,它们的跳数计数器会加上其要被转发的链路的耗费。如果跳数计值到15之后,报文仍没到达它寻址的目的地,那个目的地就被认为是不可达的,并且报文被丢弃。 ● 依赖于固定的度量来计算路由:对跳数的讨论为考察RIP的下一个基本限制作了很好的铺垫,这个限制就是固定耗费度量。虽然耗费度量能由管理员配置,但它们本质上是静态的。RIP不能实时地更新它们以适应网络中遇到的变化。由管理员定义的耗费度量保持不变,直到手动更新。这意味着RIP尤其不适合于高度动态的网络,在这种环境中,路由必须实时计算以反映网络条件的变化。 ● 路由更新耗费的资源过多:RIP节点会每隔30秒钟广播其路由表。在具有许多节点的大型网络中,这会消耗掉相当数量的带宽。 ● 相对缓慢的收敛:从人的角度来看,等待30秒进行一次更新不会感到不方便。然而,路由器和计算机以比人快得多的速度运行。不得不等上30秒进行一次更新会有很明显的不利结果。比仅仅等上30秒进行一次更新更具破坏性的是不得不等上180秒来作废一条路由。而这只是一台路由器开始进行收敛所需的时间。依赖于互联的路由器个数及它们的拓扑结构,可能需要重复更新才能完全收敛于新拓扑。RIP路由器收敛速度慢会创造许多机会使得无效路由仍被错误地作为有效路由进行广播。显然,这样会降低网络性能。 ● 缺乏动态负载均衡支持:由于RIP本身的特点,它缺乏对动态负载均衡的支持,如下图所示: 图17-11 RIP缺乏动态负载均衡支持 【实验步骤】 练习1 静态路由与路由表 各主机打开工具区的"拓扑验证工具",选择相应的网络结构,配置网卡后,进行拓扑验证,如果通过拓扑验证,关闭工具继续进行实验,如果没有通过,请检查网络连接。 本练习将主机A、B、C、D、E、F作为一组进行实验。1.主机A、B、C、D、E、F在命令行下运行"route print"命令,察看路由表,并 回答以下问题: ● 路由表由哪几项组成?2.从主机A依次ping 主机B(192.168.0.2)、主机C、主机E(192.168.0.1)、主机E(172.16.1.1),观察现象,记录结果。通过在命令行下运行route print命令,察看主机B和主机E路由表,结合路由信息回答问题: ● 主机A的默认网关在本次练习中起到什么作用? ● 记录并分析实验结果,简述为什么会产生这样的结果? 表17-1 实验结果 3.主机B和主机E启动静态路由。 (1)主机B与主机E在命令行下使用"staticroute_config"命令来启动静态路由。 (2)在主机B上,通过在命令行下运行route add命令手工添加静态路由("route add 172.16.1.0 mask 255.255.255.0 192.168.0.1 metric 2")。 (3)在主机E上,也添加一条静态路由("route add 172.16.0.0 mask 255.255.255.0 192.168.0.2 metric 2")。 (4)从主机A依次ping主机B(192.168.0.2)、主机E(192.168.0.1)、主机E(172.16.1.1),观察现象,记录结果。 (5)通过在命令行下运行route print命令,察看主机B和主机E路由表,结合路由信息回答问题: ● 记录并分析实验结果,简述手工添加静态路由在此次通信中所起的作用。 表17-2 实验结果 4.在主机B上,通过在命令行下运行route delete命令("route delete 172.16.1.0");在主机E上,运行route delete命令("route delete 172.16.0.0")删除手工添加的静态路由条目。 ● 简述静态路由的特点以及路由表在路由期间所起到的作用。 练习2 领略动态路由协议RIPv2 本练习将主机A、B、C、D、E、F作为一组进行实验。 1.在主机A、B、C、D、E、F上启动协议分析器,设置过滤条件(提取RIP和IGMP),开始捕获数据。 2.主机B和主机E启动RIP协议并添加新接口: (1)在主机B上启动RIP协议:在命令行方式下输入"rip_config"。 (2)在主机E上启动RIP协议:在命令行方式下输入"rip_config"。 (3)添加主机B的接口: ① 添加IP为172.16.0.1的接口:在命令行方式下输入"rip_config "b1" enable"。 ② 添加IP为192.168.0.2的接口:在命令行方式下输入"rip_config "b2" enable"。 (4)添加主机E的接口: ① 添加IP为192.168.0.1的接口:在命令行方式下输入"rip_config "e2" enable"。 ② 添加IP为172.16.1.1的接口:在命令行方式下输入"rip_config "e1" enable"。3.主机B在命令行方式下,输入"rip_config showneighbor"察看其邻居信息。 主机E在命令行方式下,输入"rip_config showneighbor"察看其邻居信息。4.所有主机人员通过协议分析器观察报文交互,直到两台主机的路由表达到稳定态。 ● 如何判定路由表达到稳定态? ● 在主机B、E上使用"netsh routing ip show rtmroutes"察看路由表,记录稳定状态下主机B和主机E的路由表条目。5.主机B和主机E在命令行下输入命令"recover_config",停止RIP协议。观察协议分析器报文交互,并回答问题: ● IGMP报文在RIP交互中所起的作用是什么? ● 通过以上5步,绘制主机B和主机E的RIP交互图(包括IGMP报文)。 练习3 RIP的计时器 本练习将主机A、B、C、D、E、F作为一组进行实验。1.在主机A、B、C、D、E、F上重新启动协议分析器,设置过滤条件(提取RIP),开始捕获数据。2.主机B和主机E重启RIP协议并添加新接口(同练习二的步骤2),同时设置"周期公告间隔"为20秒。 (1)在主机B命令行方式下,输入"rip_config "b1" updatetime 20"、"rip_config "b2" updatetime 20"。 (2)在主机E命令行方式下,输入"rip_config "e2" updatetime 20"、"rip_config "e1" updatetime 20"。 (3)所有主机人员用协议分析器察看报文序列,并回答问题: ● 将"周期公告间隔"设置为0秒可以吗?为什么操作系统对"周期公告间隔"有时间上限和时间下限?上限和下限的作用是什么? ● 通过协议分析器,比较两个相邻通告报文之间的时间差,是20秒吗?如果不全是,为什么?3.将"路由过期前的时间"设置为30秒。 (1)在主机B命令行方式下,输入"rip_config "b1" expiretime 30"、"rip_config "b2" expiretime 30"。 (2)在主机E命令行方式下,输入"rip_config "e2" expiretime 30"、"rip_config "e1" expiretime 30"。 (3)禁用主机E的e2的网络连接。在30秒内观察主机B的路由条目变化,并回答问题: ● 简述"路由过期计时器"的作用是什么?4.恢复主机E的e2的网络连接。5.主机B和主机E在命令行下输入命令"recover_config",停止RIP协议。 练习4 RIP的稳定性 本练习将主机A、B、C、D、E、F作为一组进行实验。1.在主机A、B、C、D、E、F上重新启动协议分析器捕获数据,并设置过滤条件(提取RIP)。2.主机B和主机E重启RIP协议并添加新接口(同练习二的步骤2),同时去掉"启用水平分割处理"和"启用毒性反转"选项。 (1)主机B在命令行方式下输入"rip_config "b1" splithorizon disable"、"rip_config "b2" splithorizon disable"。 (2)主机E在命令行方式下输入"rip_config "e2" splithorizon disable"、"rip_config "e1" splithorizon disable"。 (3)等待一段时间,直到主机B和主机E的路由表达到稳定态。3.主机B和主机E在命令行下使用"netsh routing ip show rtmroutes"查看路由表,结合协议分析器上捕获的RIP报文内容,回答问题: ● 记录此时主机B和主机E的路由表条目。 ● 同练习二中记录的路由表条目作比较,简述发生变化的原因。4.查看未启用毒性反转的效果。 (1)拔掉主机E与主机F相连的网线 (2)主机A,主机C查看协议分析器捕获的数据 ● 主机A收到度量为16的RIP报文了吗? ● 主机C收到度量为16的RIP报文了吗?5.主机B和主机E在命令行下输入"recover_config"停止RIP协议。 【思考问题】 1.RIP使用UDP,这样做有何优点?2.跳数限制如何缓解RIP的问题?3.试列举RIP的缺点及其相应的补救办法。 1