声明:本博客参考自《TCP/IP详解卷一:协议》
1.概述
选路是IP最重要的功能之一,需要选路的数据报可以是本机产生也可是其它主机产生,后一种情况下主机需要配置成一个路由器,否则在网口接收到其它主机发送的数据,如果目的主机不是本机的话,会直接被丢弃。
由上图可以看出路由守护程序,route命令和ICMP重定向报文都可以更新路由表,注意路由守护程序是内核的程序,在操作系统运行期间会一直执行。
2.选路的原理
IP搜索路由表分为以下几个步骤
①搜索匹配的主机地址。
②搜索匹配的网络地址。
③搜索默认表项(默认表项一般在路由表中被指定为一个网络表项,其网络号为0)
IP层进行的选路实际上是一种选路机制,它搜索路由表并决定向哪个网络发送分组。这区别于选路策略,它只是决定把哪些路由放入路由表的规则。IP执行选路机制,而路由守护程序则提供选路策略。
2.1 简单路由表
所有网络前面的网络号140.252在上图中均没表示出来。
对于一个给定的路由,Flags的选项一共有下面5种:
①U-该路由可以使用
②G-该路由是到一个网关(路由器)。如果没有设置该标志,说明目的地址是直接相连的。
③H-该路由是到一个主机,也就是说,目的地址是一个完整的主机地址。如果没有设置该标志,说明路由是一个网络,而目的地址是一个网络地址:一个网络号,或者网络号与子网号的组合。
④D-该路由是由重定向报文创建的。
⑤M-该路由已被重定向报文修改。
标志G区分了间接路由(设置G)和直接路由,发往直接路由的分组中不但具有指明目的端的IP地址,还具有其链路层地址。发往间接路由的分组,IP地址指明的是最终的目的地址,但是链路层地址指明的是网关(即下一站路由)。
H标志表明目的地址是一个完整的主机地址。没有设置H表明目的地址是一个网络地址(主机号全为0)。当为某个目的IP地址搜素路由表时,主机地址必须是与目的地址完全匹配,而网络地址项只需要匹配目的地址的网络号和子网络号就可以了。
svr4主机的路由表中的"Refcnt"列出正在使用路由的进程数目。"use"列显示通过该路由发送的分组数。"interface"列是本地接口的名字。
第一行说明,如果目的地是140.252.13.65,那么将把分组转发到140.252.13.35。
第二行输出的是环回地址,它的名字始终是lo0。没有设置标志G,说明该路由不是一个网关。设置标志H,说明目的地址是一个主机地址。
第三行是默认路由。每个主机都有一个或多个默认路由。这一项表明,如果在表中没有找到指定路由,就将分组发送到路由器140.252.13.33(sun主机)。
第四行的输出是所在的以太网。H标志没有设置,说明目的地址(140.252.13.32)是一个网络地址,其主机部分为0,也揭示出该网络的子网掩码。由于没有设置G标志,网关列指出的IP地址是外出地址。
2.2 初始化路由表
每当初始化一个接口时,就为接口自动创建一个直接路由。如果到达主机或网络的路由不是直接相连的,那么必须加入路由表。一个常用的方法是在系统引导的初始化文件中运行route命令,这是一种配置静态路由的方式。还可以使用路由守护程序和路由器发现协议初始化路由表。
3. ICMP与IP路由
3.1 ICMP主机与网络不可达差错
当路由器收到一份IP数据报但又不能转发时,就要发送一份ICMP"主机不可达"差错报文。
在上图中如果我们把左侧的SLIP断开在svr4上面ping主机gemini会出现以下情况:
采用抓包的结果:
3.2 ICMP重定向差错
IP数据报应该被发送到另一个路由器时,收到数据报的路由器要发送ICMP重定向差错报文给IP数据报的发送端。下图演示了ICMP重定向报文的工作机制。
①假定主机发送一份IP数据报给R1,其中R1是默认路由。
②R1收到数据发送给R2,发现R2的接收接口和现在它正在发送的接口相同。它就发送一份ICMP重定向报文给主机,告诉主机以后直接发送数据给R2。
③主机以后发送给R2的数据都是直接发送了。
ICMP重定向报文一般用来让路由信息很少的主机来完善路由表。
ICMP重定向报文的格式如下:
重定向报文的类型如下表:
ICMP重定向报文的接收者必须查看三个IP地址:(1)导致重定向的IP地址(即ICMP重定向报文的数据位于IP数据报的首部)(2)发送重定向报文的路由器的IP地址(包含重定向信息的IP数据报中的源地址)(3)应该采用的路由器IP地址(在ICMP报文中的4~7字节)。
关于ICMP重定向报文的注意事项:(1)重定向报文只能由路由器产生。(2)重定向报文是为主机而不是路由器使用的。
3.3 ICMP路由器发现报文
利用ICMP路由器通告和请求报文也是一种初始化路由表的方法。一般系统实现中,主机在引导以后要广播或多播传送一份路由器请求报文。一台或多台路由器响应一份路由器通告报文。另外路由器也会定期地广播或多播传送它们的路由器通告报文,允许每个正在监听的主机相应地更新它们的路由表。下图分别显示了ICMP路由器请求报文和通告报文的格式:
ICMP路由器通告报文中可以通告多个地址。地址数指的是报文中所含的地址数。地址项大小指的是每个路由器地址 32 bit字的数目,始终为 2。生存期指的是通告地址有效的时间(秒数)。接下来是一对或多对 I P地址和优先级。 I P地址必须是发送路由器的某个地址。优先级是一个有符号的32 bit整数,指出该I P地址作为默认路由器地址的优先等级,这是与子网上的其他路由器相比较而言的。值越大说明优先级越高。优先级为 0 x 8 0 0 0 0 0 0 0说明对应的地址不能作为默认路由器地址使用,尽管它也包含中通告报文中。优先级的默认值一般为 0。
路由器发现报文一般由用户进程(守护程序)创建和处理。
4. 总结
IP路由是TCP/IP的基本操作。路由表的匹配一般是从主机路由、网络路由、默认路由从大到小的优先级进行匹配的。路由可以被route指令,ICMP重定向报文,路由守护程序进行修改。