RIP:选路信息协议( 二 )


;;;;假如相邻路由器通告它与其他网络路由的跳数为1,那么我们与那个网络的度量就是2,这是因为为了发送报文到该网络,我们必须经过那个路由器 。在我们的例子中,R 2到N 1的度量是2,与R 1到N 3的度量一样 。
;;;;由于每个路由器都发送其路由表给邻站,因此,可以判定在同一个自治系统A S内到每个网络的路由 。假如在该A S内从一个路由器到一个网络有多条路由,那么路由器将选择跳数最小的路由,而忽略其他路由 。
;;;;跳数的最大值是1 5,这意味着RIP只能用在主机间最大跳数值为1 5的A S内 。度量为1 6表示到无路由到达该I P地址 。
10.4.4 问题
;;;;这种方法看起来很简单,但它有一些缺陷 。首先,RIP没有子网地址的概念 。例如,假如标准的B类地址中16 bit的主机号不为0,那么RIP无法区分非零部分是一个子网号,或者是一个主机地址 。有一些实现中通过接收到的RIP信息,来使用接口的网络掩码,而这有可能出错 。
;;;;其次,在路由器或链路发生故障后,需要很长的一段时间才能稳定下来 。这段时间通常需要几分钟 。在这段建立时间里,可能会发生路由环路 。在实现RIP时,必须采用很多微妙的措施来防止路由环路的出现,并使其尽快建立 。RFC 1058 [Hedrick 1988a]中指出了很多实现RIP的细节 。

;;;;采用跳数作为路由度量忽略了其他一些应该考虑的因素 。同时,度量最大值为1 5则限制了可以使用RIP的网络的大小 。
10.4.5 举例
;;;;我们将使用r i p q u e r y程序来查询一些路由器中的路由表,该程序可以从g a t e d中得到 。r i p q u e r y程序通过发送一个非正式请求(图1 0 - 3中命令字段为5的“p o l l”)给路由器,要求得到其完整的路由表 。假如在5秒内未收到响应,则发送标准的RIP请求(c o m m a n d字段为1)(前面提到过的,将地址系列字段置为0,度量字段置为1 6的请求,要求其他路由器发送其完整路由表) 。
;;;;图1 0 - 5给出了将从s u n 主机上查询其路由表的两个路由器 。假如在主机s u n 上执行r i p q u e r y程序,以得到其下一站路由器n e t b的选路信息,那么可以得到下面的结果:

(点击查看原图)
;;;;正如我们所猜想的那样,n e t b告诉我们子网的度量为1 。另外,与n e t b相连的位于机端的以太网( 1 4 0 . 2 5 2 . 1 . 0)的m e t r i c也是1(-n参数表示直接打印I P地址而不需要去查看其域名) 。在本例中,将n e t b配置成认为所有位于1 4 0 . 2 5 2 . 1 3子网的主机都与其直接相连— 即,n e t b 并不知道哪些主机真正与1 4 0 . 2 5 2 . 1 3子网相连 。由于与1 4 0 . 2 5 2 . 1 3子网只有一个连接点,因此,通告每个主机的度量实际上没有太大意义 。
;;;;图1 0 - 6给出了使用t c p d u m p交换的报文 。采用- i s 1 0选项指定S L I P接口 。
;;;;第1个请求发出一个RIP轮询命令(第1行) 。这个请求在5秒后超时,发出一个常规的RIP请求(第2行) 。第1行和第2行最后的2 4表示请求报文的长度: 4个字节的RIP首部(包括命令和版本),然后是单个2 0字节的地址和度量 。
;;;;第3行是第一个应答报文 。该行最后的2 5表示包含了2 5个地址和度量对,我们在前面已经计算过,其字节数为5 0 4 。这是上面的r i p q u e r y程序所打印出来的结果 。我们为t c p d u m p程序指定- s 6 0 0选项,以让它从网络中读取6 0 0个字节 。这样,它可以接收整个U D P数据报(而不是报文的前半部),然后打印出RIP响应的内容 。该输出结果省略了 。
;;;;第4行是来自路由器的第二个响应报文,它包含后面的1 2个地址和度量对 。可以计算出该报文的长度为1 2×204=244,这正是r i p q u e r y程序所打印出来的结果 。

推荐阅读