jjzjj

《图解TCP/IP》阅读笔记(第七章 7.4)—— RIP 路由信息协议

Farewell弈 2023-04-06 原文

7.4 RIP

RIP(Routing Information Protocol,路由信息协议),是一种距离向量算法,广泛用于LAN。

该协议将路由控制信息定期(30秒一次)向全网广播。如果没有收到路由控制信息,连接就会被断开。考虑到有可能是因为丢包导致,所以RIP规定等待5次。如果超过6次即180秒仍未收到路由信息,就会真正的关闭连接。

RIP会根据距离向量算法决定路径,距离单位成为“跳数”,即经过的路由器的个数(IP首部中有个生存周期字段TTL,和跳数对应)。RIP希望尽可能少通过路由器将数据包转发到目标IP地址,如下图所示。最终,路由器会根据距离向量生成距离向量表,抽出较小的路由生成最终的路由控制表。


因为子网掩码的长度不固定(并非8的倍数),使用子网掩码时则需要另外注意以下两点:

  • 将借口的IP地址对应分类得出网络地址后,与根据路由控制信息流过此路由器的包中的IP地址对应的分类得出的网络地址进行比较,若二者相同,则以接口的网络地址长度为准
  • 若不同,则以IP地址的分类所确定的网络地址长度为准。

例如192.168.1.33/27,这是一个C类地址,按照IP地址分类,其网络地址为192.168.1.33/24。与192.168.1.33/24相符合的IP地址,其网络地址长度会被认为是接口的27位。除此之外,则采用各个地址的分类(例如B类、C类)所确定的网络地址长度。

因此,使用RIP需要注意以下两点:

  • 因IP地址的分类而产生不同的网络地址
  • 构造网络地址长度不同的网络环境


接下来我们会讲述一下RIP中路由发生变更时的处理

RIP的基本行为可以归纳为

  • 将自己已知的路由信息定期进行广播
  • 一旦认为网络被断开,数据将无法流过此路由器,其他路由器也就可以得知网络已经断开

但是这么做会有些问题,如下图所示:

首先路由器A将信息发送给路由器B,路由器B又将自己的信息发送给路由器A和C。假设这时网络A发生了故障。

路由器A虽然觉察到自己与网络A的连接断开,无法再将网络A的信息发送给路由器B,但是巧就巧在,路由器B这位“懂哥”会告诉A曾知悉的消息。这就使得路由器A误认为自己的信息还可以通过路由器B到达网络A。

然后就会陷入循环之中,路由器A与B仿佛卧龙凤雏一般,陷入喋喋不休的传话之中。这个问题被称为无限计数(Counting to Infinity)

为了解决这个问题,可以采取以下两种方法:

  • 最长距离不超过16(该信息会由垃圾收集计数器(Garbage collection Timer)的工具保留120秒,一旦超过改时间,信息就会被删除)。也可以从时间上进行控制。

  • 规定路由器不再把所收到的路由信息原路返还给发送端,称作为水平分割(Split Horizon)。如下图所示:

然而,对于那些有环路的网络,以上解决方法是不起作用的。如下图所示,如有回路,凡响的贿赂会成为迂回的通道,路由信息会不断地被循环往复地转发。虽然可以通过设置一个正确的迂回通道来解决这个问题,但是就像下图一样,若网络A的通信发生故障,将无法传送正确的路由信息,尤其是在环路有多余的情况下,需要很长时间才能产生正确的路由信息。

为了解决如上问题,有两种方法:

毒性逆转:指网络中发生链路被断开的时候,不是不再发送这个消息,而是将这个无法通信的消息传播出去,广而告之,即发送一个距离为16的消息。

触发更新:指当路由信息发生变化时,不等待30秒而是立刻发送出去。

这两种方法的目的都是为了迅速地传送消息以使路由信息尽快收敛。

然而,即使有了上述的方法,在一个具有众多环路的复杂的网络环境中,路由信息想要达到一个稳定的状态是需要花一段时间的。为了更好的解决这个问题,必须明确地掌握网络结构,为此可以采用OSPF。


RIP2,即RIP第二版,在原版的基础上进行了改良,有了如下这个新的特点:

  • 使用多播

    RIP中路由器之间交换路由信息使用广播,第二版中则使用多播,减少了网络的流量,缩小了对无关主机的影响。

  • 支持子网掩码

    与OSPF类似,RIP2支持在其交换的路由信息中加入子网掩码信息。

  • 路由域选择

    在同一个网络中可以使用逻辑上独立的多个RIP。

  • 外部路由标志

    通常用于把从BGP等获得的路由控制信息通过RIP传送到自治系统中。

  • 身份验证密钥

    携带密码,只有在自己能够识别这个密码时才接收数据,否则忽略这个RIP包。

本篇小结

本篇介绍了重要的路由信息协议RIP。

其通过广播,每隔30秒,将自己已知的路由信息交换给其他路由。

其根据距离向量确定路由,距离单位为“跳数”。

需要注意的一点时,使用子网掩码时有不同的处理。若IP包网络地址与接口的网络地址相同,就使用接口的网络地址,不相同就使用IP分类(例如C类)的那种网络地址。

当网络信息发生变化时,容易因为RIP的回传消息机制,导致在两个路由器之间反复的告知对方某已经断开连接的网络信息。

基本方案一是限制路由器跳数不超过16,二是规定路由器不再把收到路由信息原路返回给发送端(称作为水平分割)。

然而在有环路的网络中,基本方案不起作用,于是人们提出了两种新的解决方案,一是“毒性逆转”:链路断开后,将这个无法通信的消息传播出去,二是“触发更新”:路由信息发生变化时,不等待30秒而是立刻发送。这两种机制可以使得路由信息尽快收敛。

最后介绍了RIP2中的一些新特性。

有关《图解TCP/IP》阅读笔记(第七章 7.4)—— RIP 路由信息协议的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  4. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  5. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  6. ruby - what is - gets is a directory - 错误信息 - 2

    我遇到了这个奇怪的错误.../Users/gideon/Documents/ca_ruby/rubytactoe/lib/player.rb:13:in`gets':Isadirectory-spec(Errno::EISDIR)player_spec.rb:require_relative'../spec_helper'#theuniverseisvastandinfinite...itcontainsagame....butnoplayersdescribe"tictactoegame"docontext"theplayerclass"doit"musthaveahumanplay

  7. ruby - 尝试比较两个文本文件,并根据信息创建第三个 - 2

    我有两个文本文件,master.txt和926.txt。如果926.txt中有一行不在master.txt中,我想写入一个新文件notinbook.txt。我写了我能想到的最好的东西,但考虑到我是一个糟糕的/新手程序员,它失败了。这是我的东西g=File.new("notinbook.txt","w")File.open("926.txt","r")do|f|while(line=f.gets)x=line.chompifFile.open("master.txt","w")do|h|endwhile(line=h.gets)ifline.chomp!=xputslineendende

  8. ruby - 在 TCPServer (Ruby) 中,我如何从客户端获取 IP/MAC? - 2

    我想在Ruby的TCPServer中获取客户端的IP地址。以及(如果可能的话)MAC地址。例如,Ruby中的时间服务器,请参阅评论。tcpserver=TCPServer.new("",80)iftcpserverputs"Listening"loopdosocket=tcpserver.acceptifsocketThread.newdoputs"Connectedfrom"+#HERE!HowcanigettheIPAddressfromtheclient?socket.write(Time.now.to_s)socket.closeendendendend非常感谢!

  9. ruby - rspec: raise_error 用法来匹配错误信息 - 2

    我使用raise(ConfigurationError.new(msg))引发错误我试着用rspec测试一下:expect{Base.configuration.username}.toraise_error(ConfigurationError,message)但这行不通。我该如何测试呢?目标是匹配message。 最佳答案 您可以使用正则表达式匹配错误消息:it{expect{Foo.bar}.toraise_error(NoMethodError,/private/)}这将检查NoMethodError是否由privateme

  10. ruby - 为什么要使用嵌套的 Ruby 模块来获取版本信息? - 2

    我最近一直在查看一些gem的源代码。我经常看到的一个习惯用法是使用嵌套模块,其中包含连接到版本字符串中的版本常量,即围绕此类事物的变体:moduleChunkyBaconmoduleVersionMAJOR=0MINOR=6TINY=2endVERSION=[Version::MAJOR,Version::MINOR,Version::TINY].compact*'.'end以这种方式存储库版本信息有什么好处(如果有的话)?为什么不这样做:moduleChunkyBaconVERSION='0.6.2'.freezeend 最佳答案

随机推荐