网络层:IP选路和动态选路协议

IP选路

    选路是IP最重要的功能之一。需要进行选路的数据报可以由本地主机产生,也可以由其他主机产生。在后一种情况下,主机必须配置成一个路由器,否则通过网络接口接收到的数据报,如果目的地址不是本机就要被丢弃。
    IP层工作流程如图所示:
网络层:IP选路和动态选路协议_第1张图片

选路的原理

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

典型的路由表

    路由表内容一般如下:
    Destination | Gateway | Flags | Refcnt | Use | Interface
    第一项和第二项是目的地址和网关地址。
    对于一个给定的路由器,可以打印出五种不同的标志(flag):
- U:该路由可以使用。
- G:该路由是到一个网关(路由器)。如果没有设置该标志,说明目的地是直接相连的。
- H:该路由是到一个主机,也就是说,目的地址是一个完整的主机地址。如果没有设置该标志,说明该路由是到一个网络,而目的地址是一个网络地址:一个网络号,或者网络号与子网号的组合。
- D:该路由是由重定向报文创建的。
- M:该路由已被重定向报文修改。
    参考记数Refcnt(Referencecount)列给出的是正在使用路由的活动进程个数。
    use显示的是通过该路由发送的分组数。
    interface是本地接口的名字。

没有到达目的地路由

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

ICMP重定向差错

    当IP数据报应该被发送到另一个路由器时,收到数据报的路由器就要发送ICMP重定向差错报文给IP数据报的发送端。重定向一般用来让具有很少选路信息的主机逐渐建立更完善的路由表。主机启动时路由表中可以只有一个默认表项。一旦默认路由发生差错,默认路由器将通知它进行重定向,并允许主机对路由表作相应的改动。ICMP重定向允许TCP/IP主机在进行选路时不需要具备智能特性,而把所有的智能特性放在路由器端。
    ICMP重定向报文的格式如图所示。
网络层:IP选路和动态选路协议_第2张图片
    有四种不同类型的重定向报文,有不同的代码值,如图所示。
网络层:IP选路和动态选路协议_第3张图片
    ICMP重定向报文的接收者必须查看三个IP地址:
- 导致重定向的IP地址(即ICMP重定向报文的数据位于IP数据报的首部);
- 发送重定向报文的路由器的IP地址(包含重定向信息的IP数据报中的源地址);
- 应该采用的路由器IP地址(在ICMP报文中的4~7字节)。
    关于ICMP重定向报文有很多规则。首先,重定向报文只能由路由器生成,而不能由主机生成。另外,重定向报文是为主机而不是为路由器使用的。假定路由器和其他一些路由器共同参与某一种选路协议,则该协议就能消除重定向的需要。
    关于重定向最后要指出的是,路由器应该发送的只是对主机的重定向(代码1或3),而不是对网络的重定向。子网的存在使得难于准确指明何时应发送对网络的重定向而不是对主机的重定向。只当路由器发送了错误的类型时,一些主机才把收到的对网络的重定向当作对主机的重定向来处理。

ICMP路由器发现报文

    一般认为,主机在引导以后要广播或多播传送一份路由器请求报文。一台或更多台路由器响应一份路由器通告报文。另外,路由器定期地广播或多播传送它们的路由器通告报文,允许每个正在监听的主机相应地更新它们的路由表。路由器在一份报文中可以通告多个地址。地址数指的是报文中所含的地址数。地址项大小指的是每个路由器地址32bit字的数目,始终为2。生存期指的是通告地址有效的时间(秒数)。
    ICMP路由器请求报文格式如下图所示。
网络层:IP选路和动态选路协议_第4张图片
    ICMP路由器通告报文格式如下图所示。
网络层:IP选路和动态选路协议_第5张图片
    当路由器启动时,它定期在所有广播或多播传送接口上发送通告报文。除了定期发送主动提供的通告报文以外,路由器还要监听来自主机的请求报文,并发送路由器通告报文以响应这些请求报文。
    主机在引导期间一般发送三份路由器请求报文,每三秒钟发送一次。一旦接收到一个有效的通告报文,就停止发送请求报文。主机也监听来自相邻路由器的请求报文。这些通告报文可以改变主机的默认路由器。另外,如果没有接收到来自当前默认路由器的通告报文,那么默认路由器会超时。

动态选路协议

    当相邻路由器之间进行通信,以告知对方每个路由器当前所连接的网络,这时就出现了动态选路。路由器之间必须采用选路协议进行通信,这样的选路协议有很多种。路由器上有一个进程称为路由守护程序(routing daemon),它运行选路协议,并与其相邻的一些路由器进行通信。

RIP:选路信息协议

    RIP报文格式如下图所示。
网络层:IP选路和动态选路协议_第6张图片
    命令字段为1表示请求,2表示应答。还有两个舍弃不用的命令(3和4),两个非正式的命令:轮询(5)和轮询表项(6)。请求表示要求其他系统发送其全部或部分路由表。应答则包含发送者全部或部分路由表。
    版本字段通常为1,而第2版RIP将此字段设置为2。紧跟在后面的20字节指定地址系列(address family)(对于IP地址来说,其值是2)、IP地址以及相应的度量,RIP的度量是以跳计数的。采用这种20字节格式的RIP报文可以通告多达25条路由。上限25是用来保证RIP报文的总长度为20×25+4=504,小于512字节。由于每个报文最多携带25个路由,因此为了发送整个路由表,经常需要多个报文。
    采用RIP协议的路由器运行的过程如下:
- 初始化:在启动一个路由守护程序时,它先判断启动了哪些接口,并在每个接口上发送一个请求报文,要求其他路由器发送完整路由表。在点对点链路中,该请求是发送给其他终点的。如果网络支持广播的话,这种请求是以广播形式发送的。这种请求报文的命令字段为1,但地址系列字段设置为0,而度量字段设置为16。这是一种要求另一端完整路由表的特殊请求报文。
- 接收到请求。如果这个请求是刚才提到的特殊请求,那么路由器就将完整的路由表发送给请求者。否则,就处理请求中的每一个表项:如果有连接到指明地址的路由,则将度量设置成我们的值,否则将度量置为16(度量为16是一种称为“无穷大”的特殊值,它意味着没有到达目的的路由)。然后发回响应。
- 接收到响应。使响应生效,可能会更新路由表。可能会增加新表项,对已有的表项进行修改,或是将已有表项删除。
- 定期选路更新。每过30秒,所有或部分路由器会将其完整路由表发送给相邻路由器。发送路由表可以是广播形式的,或是发送给点对点链路的其他终点的。
- 触发更新。每当一条路由的度量发生变化时,就对它进行更新。不需要发送完整路由表,而只需要发送那些发生变化的表项。

RIP版本2

    RIP-2的报文格式如下图所示,对于RIP-2来说,其版本字段为2。
网络层:IP选路和动态选路协议_第7张图片
    选路域(routingdomain)是一个选路守护程序的标识符,它指出了这个数据报的所有者。该域允许管理者在单个路由器上运行多个RIP实例,每个实例在一个选路域内运行。
    选路标记(routingtag)是为了支持外部网关协议而存在的。它携带着一个EGP和BGP的自治系统号。
    每个表项的子网掩码应用于相应的IP地址上。下一站IP地址指明发往目的IP地址的报文该发往哪里。该字段为0意味着发往目的地址的报文应该发给发送RIP报文的系统。
    RIP-2提供了一种简单的鉴别机制。可以指定RIP报文的前20字节表项地址系列为0xffff,路由标记为2。表项中的其余16字节包含一个明文口令。
    最后,RIP-2除了广播外,还支持多播。这可以减少不收听RIP-2报文的主机的负载。

你可能感兴趣的:(TCP-IP)