美文网首页
TCP-IP详解卷1:协议读书笔记_9

TCP-IP详解卷1:协议读书笔记_9

作者: MR_Model | 来源:发表于2019-08-28 09:33 被阅读0次

    IP选路

    下图是IP层处理过程的简单流程,需要进行选路的数据报可以由本地主机产生,也可以由其他主机产生。在后一种情况,主机必须被配置成一个路由器,否者通过网络接口接收到的数据报,如果目的地址不是本机就要被丢弃。

    IP选路流程

    图中一个路由守护进程,一般是一个用户进程。在Unix中,大多数普通的守护进程都是路由程序和网关程序。

    图中的路由表经常被IP访问,但是它被路由守护进程更新的频率却要低的多。当接收到ICMP重定向报文时,路由表也要更新。

    选路的原理

    首先理解内核是如何维护路由表的。路由表中包含的信息决定了IP层所做的所有决策。
    IP搜索路由表的几个步骤:
    1.搜索匹配的主机地址
    2.搜索匹配的网络地址
    3.搜索默认表项
    匹配主机地址步骤始终发生在匹配网络地址步骤之前。
    IP层进行的选路实际上是一种选路机制,它搜索路由表并决定向哪个网络接口发送分组。这区别于选路策略,它只是一组决定把哪些路由放入路由表的规则。IP执行选路机制,而路由守护程序则一般提供选路策略。

    简单路由表

    简单路由表示例

    目的IP地址:如: 140.252.13.65
    网关:如:140.252.13.35
    标志项:
    对于一个给定的路由器,可以打印五种不同的标志(flag):
    U:该路由可以使用
    G:该路由是到一个网关(路由器)。如果没有设置该标志,说明目的地是直接相连的
    H:该路由是到一个主机,也就是说,目的地址是一个完整的主机地址。如果没有设置该标志,说明该路由是到一个路由,而目的地址是一个网络地址:一个网络号,或者网络号与子网号的组合
    D:该路由是由重定向报文创建的
    M:该路由已被重定向报文修改
    标记G是非常重要的,因为由它区分了间接路由和直接路由(对于直接路由来说是不设置标志G的)。其区别在于,发往直接路由的分组中不但具有指明目的端的IP地址,还具有其链路层地址。当分组被发往一个间接路由时,IP地址指明的是最终的目的地,但是链路层地址指明的是网关(即下一站路由器)。
    理解G和H标志之间的区别是很重要的。G标志区分了直接路由和间接路由,但是H标志表明,目的地址是一个完整的主机地址。没有设置H标志说明目的地址是一个网络地址(主机号部分为0)。当为某个目的IP地址搜索路由器时,主机地址项必须与目的地址完全匹配,而为某个目的IP地址搜索路由表时,主机地址项必须与目的地址完全匹配,而网络地址项只需要匹配目的地址的网络号和子网号就可以了。
    参考记数Refcnt列给出的是正在使用路由的活动进程个数。面向连接的协议如TCP在建立连接时要固定路由。如果在主机svr4和slip之间建立Telente,可以看到参考计数值变为1.建立另一个Telenet连接时,它的值将增加为2。
    下一列("use")显示的是通过该路由发送的分组数。如果我们是这个路由的唯一用户,那么运行ping程序发送5个分组后,它的值将变成5。
    最后一列(interface)是本地接口的名字。

    输出的第2行是环回接口,它的名字始终为lo0。没有置G标志,因为该路由不是一个网关。H标志说明目的地址(127.0.0.1)是一个主机地址,而不是一个网络地址。由于没有设置G标志,说明这是一个直接路由,网关列给出的是外出IP地址。
    输出的第3行是默认路由。每个主机都有一个或多个默认路由。这一项表明,如果在表中没有找到特定的路由,就把分组发送到路由器140.252.13.33(sun主机)。这说明当前主机(svr4)利用这一个路由表项就可以通过Internet经路由器sun(及其SLIP链路)访问其他的系
    统。
    输出中的最后一行是所在的以太网。H标志没有设置,说明目的地址(1 40.252.13.32)是一个网络地址,其主机地址部分设为0。事实上,是它的低 5位设为0。由于这是一个直接路由(G标志没有被设置),网关列指出的IP地址是外出地址。
    主机路由表的复杂性取决于主机所在网络的拓扑结构。
    1)最简单的情况是主机根本没有与任何网络相连。TCP/IP协议仍然能用于这样的主机,但是只能与自己本身通信!这种情况下的路由表只包含环回接口一项。
    2)接下来的情况是主机连在一个局域网中,只能访问局域网上的主机。这是路由表包含两项:一项是环回接口,另一项是局域网(如以太网)。
    3)如果主机能够通过单个路由器访问其他网络时,那么就要进行下一步。一般情况下增加一个默认表项指向该路由器。
    4)如果要新增其他的特定主机或网络路由,那么就要进行最后一步。在我们的例子中,到主机slip的路由要通过路由器bsdi就是这样的例子。

    我们根据上述IP操作的步骤使用这个路由表为主机svr4上的一些分组例子选择路由。
    1)假定目的地址是主机sun,140.252.13.33。首先进行主机地址的匹配。路由表中的两个主机地址表项均不匹配,接着进行网络地址匹配。这一次匹配成功,找出表项140.252.13.32(网络号和子网号都相同),因此使用emd0接口。这是一个直接路由,因此链路层地址将是目的端的地址。
    2)假定目的地址是主机slip,140.252.13.65。首先在路由表搜索主机地址,并找到一个匹配地址。这是一个间接路由,因此目的端的IP地址仍然是140.252.13.65,但是链路层地址必须是网关140.252.13.65的链路层地址,其接口名为emd0。
    3)这一次我们通过Internet给主机aw.com(192,207.117.2)发送一份数据报。首先在路由表中搜索主机地址,失败后进行网络地址匹配。最后成功地找到默认表项。该路由是一个间接路由,通过网关140.252.13.33,并使用接口名为emd0。
    4)在我们最后一个例子中,我们给本机发送一份数据报。有四种可以完成这件事,如用主机名、主机IP地址、环回名或者环回IP地址。
    在前两种情况下,对路由表的第2次搜索得到一个匹配的网络地址140.252.13.32,并把IP报文传送给以太网驱动程序。IP报文中的目的地址为本机IP地址,因此报文被送给环回驱动程序,然后由驱动程序把报文放入IP输出队列中。
    在后两种情况下,由于指定了环回接口的名字或IP地址,第一次搜索就找到匹配的主机地址,因此报文直接被送给环回驱动程序,然后由驱动程序把报文放入IP输出队列中。
    上述四种情况报文都要被送给环回驱动程序,但是采用的两种路由决策是不相同的。

    初始化路由表

    每当初始化一个接口时(通常是用ifconfig命令设置接口地址),就为接口自动创建一个直接路由。对于点对点链路和环回接口来说,路由是到达主机。对于广播接口来说,如以太网、路由是到达网络。

    到达主机或网络的路由如果不是直接相连的,那么就必须加入路由表。一个常用的方法是在系统引导时显式地在初始化文件中运行route命令。

    初始化路由表的其他方法是运行路由守护程序,或者使用较新的路由器发现协议。

    较复杂的路由表

    可以发现路由表中的目的地址就是点对点链路的另一端 (即路由器netb), 网关地址为外出接口的本地I P地址(140.252.1.29) (前面已经说过,netstat为直接路由打印出来的网关地址就是本地接口所用的IP地址)。
    默认的路由表项是一个到达网络的间接路由 (设置了G标志,但没有设置H标志),这正是我们所希望的。网关地址是路由器的地址 (140.252.1.183,SLIP链路的另一端), 而不是SLIP链路的本地IP地址(140.252.1.29)。其原因还是因为是间接路由,不是直接路由。还应该指出的是,netstat输出的第3和第4行(接口名为sl0)由SLIP软件在启动时创建,并在关闭时删除。

    没有到达目的地的路由

    如果路由表中没有默认项,而又没有找到匹配项,这时会发生什么情况呢?结果取决于该IP数据报是由主机产生的还是被转发的(例如,我们就充当一个路由器)。如果数据报是由本地主机产生的,那么就给发送该数据报的应用程序返回一个差错,或者是“主机不可达差错”或者是“网络不可达差错”。如果是被转发的数据报,那么就给原始发送端发送一份ICMP主机不可达的差错报文。

    ICMP主机与网络不可达差错

    当路由器收到一份I P数据报但又不能转发时,就要发送一份ICMP“主机不可达”差错报文。

    ICMP重定向差错

    当IP数据报应该被发送到另一个路由器时,收到数据报的路由器就要发送ICMP重定向差错报文给IP数据报的发送端。如下图,只有当主机可以选择路由器发送分组的情况下,我们才可能看到ICMP重定向报文

    ICMP重定向

    1)我们假定主机发送一份数据报给R1。
    2)R1收到数据报并且检查它的路由表,发现R2是发送该数据报的下一站。当它把数据报发送给R2时,R1检测到它正在发送的接口与数据报到达接口是相同的(即主机和两个路由器所在的LAN)。这样九个路由器发送重定向报文给原始发送端提供了线索。
    3)R1发送一份ICMP重定向报文给主机,告诉它以后把数据报发给R2而不是R1。

    重定向一般用来让具有很少选路信息的主机逐渐建立更完善的路由表。主机启动时路由表中可以只有一个默认表项。一旦默认路由发生差错,
    默认路由器将通知它进行重定向,并允许主机对路由表作相应的改动。ICMP重定向允许TCP/IP主机在进行选路时不需要具备智能特性,而把所有的智能特性放在路由器端。显然,在我们的例子中,R1和R2必须知道有关相连网络的更多拓扑结构的信息,但是连在LAN上的所有主机在启动时只需一个默认路由,通过接收重定向报文来逐步学习。

    ICMP重定向报文

    ICMP重定向报文的格式如图:


    ICMP重定向报文格式

    有四种不同类型的重定向报文,有不同的代码值,如下图:

    重定向类型

    ICMP重定向报文的接收者必须查看三个IP地址:(1)导致重定向的IP地址(即ICMP重定向报文的数据位于IP数据报的首部);(2)发送重定向报文的路由器的IP地址(包含重定向信息的IP数据报中的源地址;(3)应该采用的路由器IP地址(在ICMP报文中的4~7字节)。

    关于ICMP重定向报文有很多规则。首先,重定向报文只能由路由器生成,而不能由主机生成。另外,重定向报文是为主机而不是为路由器使用的。假定路由器和其他一些路由器共同参与某一种选路协议,则该协议就能消除重定向的需要。这意味着路由表应该消除或者能被选路守护程序修改,或者能被重定向报文修改,但不能同时被两者修改。

    主机收到ICMP重定向报文后,在修改路由表之前要作一些检查。这是
    为了防止路由器或主机的误操作,以及恶意用户的破坏,导致错误地修改系统路由表。

    1. 新的路由器必须直接与网络相连接。
    2. 重定向报文必须来自当前到目的地所选择的路由器。
    3. 重定向报文不能让主机本身作为路由器。
    4. 被修改的路由必须是一个间接路由。

    ICMP路由器发现报文

    前面已提到过一种初始化路由表的方法,即在配置文件中指定静态路由。这种方法经常用来设置默认路由。另一种新的方法是利用ICMP路由器通告和请求报文。


    ICMP发现报文格式

    一般认为,主机在引导以后要广播或多播传送一份路由器请求报文。一台或更多台路由器响应一份路由器通告报文。另外,路由器定期地广播或多播传送它们的路由器通告报文,允许每个正在监听的主机相应地更新它们的路由表。


    ICMP路由器通告报文格式

    路由器在一份报文中可以通告多个地址。地址数指的是报文中所含的地址数。地址项大小指的是每个路由器地址32bit字的数目,始终为2。生存期指的是通告地址有效的时间(秒数)。

    路由器操作

    当路由器启动,它定期在所有广播或多播传送接口上发送通告报文。准确来说,这些通告报文不是定期发送的,而是随机传送的,以减少与子网上其他路由器发生冲突的概率。一般每两次通告间隔450秒和600秒。一份给定的通告报文默认生命周期是30分钟。

    使用生命周期域的另一个时机是当路由器上的某个接口被关闭时。在这种情况下,路由器可以在该接口上发送最后一份通告报文,并把生命周期值设为0。

    除了定期发送主动提供的通告报文以外,路由器还要监听来自主机的请求报文,并发送路由器通告报文以响应这些请求报文。

    主机操作

    主机在引导期间一般发送三份路由器请求报文,每三秒钟发送一次。一旦接收到一个有效的通告报文,就停止发送请求报文。
    主机也监听来自相邻路由器的请求报文。这些通告报文可以改变主机的默认路由器。另外,如果没有接收到来自当前默认路由器的通告报文,那么默认路由器会超时。
    只要有一般的默认路由器,该路由器就会每隔10分钟发送通告报文,报文的生命周期是30分钟。这说明主机的默认表项是不会超时的,即使错过一份或两份通告报文。

    实现

    路由器发现报文一般是由用户进程(守护进程)创建和处理。

    相关文章

      网友评论

          本文标题:TCP-IP详解卷1:协议读书笔记_9

          本文链接:https://www.haomeiwen.com/subject/txauectx.html