9.1、引言
9.2、选路的原理
9.2.1、简单路由器
svr4 % netstat -rn
Routing tables
Destination Gateway Flags Refcnt Use Interface
140.252.13.65 140.252.13.35 UGH 0 0 emd0
127.0.0.1 127.0.0.1 UH 1 0 lo0
default 140.252.13.33 UG 0 0 emd0
140.252.13.32 140.252.13.34 U 4 25043 emd0
对于一个给定的路由器,可以打印出五种不同的标志(flag):
U 该路由开始使用
G 该路由是到一个网关(路由器)。如果没有设置该标志,说明目的地址是直接相连的。
H 该路由是到一个主机,也就是说,目的地址是一个完整的主机地址。如果没有设置该标志,说明该路由是到一个网络,而目的地址是一个网络地址:一个网络号,或者网络地址与子网号的组合。
D 该路由是由重定向报文创建的。
M 该路由已被重定向报文修改。
参考记数Refcnt列给出的是正在使用路由的活动进程个数。
Use显示的是通过该路由发送的分组数。
Interface是本地接口的名字。
第1行说明,如果目的地是140.252.13.65,那么网关(路由器)将把分组转发给140.252.13.35。
输出的第2行是环回接口,它的名字始终为lo0。没有设置G标志,因为该路由不是一个网关。H标志说明目的地址(127.0.0.1)是一个主机地址,而不是一个网络地址。由于没有设置G标志,说明这是一个字节路由,网关列出的是外出接口的IP地址。
输出的第3行是默认路由。每个主机都有一个或多个默认路由。这一项表明,如果在表中没有找到特定的路由,就把分组发送到路由器140.252.13.33。
输出中的最后一行是所在的以太网。H标志没有设置,说明目的地址(140.252.13.32)是一个网络地址,其主机地址部分设为0。
对于一个到直接相连的网络的网络路由项,路由表的掩码默认使用接口的子网掩码。
1)假定目的地址是主机sun,140.252.13.33。首先进行主机地址的匹配。路由器中的两个主机地址表项(slip和localhost)均不匹配,接着进行网络地址匹配。这一次匹配成功,找到表项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地址,环回名,或者环回地址
ftp svr4
ftp 140.252.13.34
ftp localhost
ftp 127.0.0.1
在前两种情况下,对路由表的第2次搜索得到一个匹配的网络地址140.252.13.32,并把IP报文传送给以太网驱动程序。IP报文中目的地址为本机IP地址,因此报文被送给环回驱动程序,然后由驱动程序把报文放入IP输出队列中。
在后两种情况下,由于制定了环回接口的名字或IP地址,第一次搜索就找到匹配的主机地址,因此报文直接被送给环回驱动程序,然后由驱动程序把报文放入IP输出队列。
9.2.2、初始化路由表
没当初始化一个接口时(通常是用ifconfig命令设置接口地址),就为接口自动创建一个直接路由。对于点对点链路和环回接口来说,路由是达到主机。对于广播接口来说,如以太网,路由是达到网络。
到达不直接相连的主机或网络的路由必须以某种方式添加到路由表中。一个常用的方法是在系统引导时显式地在初始化文件中运行route命令。
9.2.4、没有到达目的地的路由
如果数据报是由本地主机产生的,那么就给发送该数据的应用程序返回一个差错,或者是“主机不可达差错”或者是“网络不可达差错”。
如果是被转发的数据报,那么就给原始发送端发送一份ICMP主机不可达的差错报文。
9.5、ICMP重定向差错
当IP数据报应该被发送到另一个路由器时,收到数据报的路由器就要发送ICMP重定向差错报文给IP数据报的发送端。
1)我们假定主机发送一份IP数据报给R1。这种选路决策经常发生,因为R1是该主机的默认路由。
2)R1收到数据报标签检查它的路由表,发现R2是发送该数据报的下一站。当它吧数据报发送给R2时,R1检测到它正在发送的接口与数据报到达接口是相同的(即主机和两个路由器所在的LAN)。这样就给路由器发送重定向报文给原始发送端提供了线索。
3)R1发送一份ICMP重定向报文给主机,告诉它以后把数据报发送给R2而不是R1。
9.5.2、更多细节
ICMP重定向报文的接受者必须查看三个IP地址:
(1)导致重定向的IP地址(在作为ICMP重定向报文数据部分返回的IP首部中);
(2)发送重定向报文的路由器的IP地址(包含重定向信息的IP数据报中的源地址)
(3)应该采用的路由器IP地址(在ICMP报文中的4~7字节)
其他规则:
首先,重定向报文只能由路由器生成,而不能由主机生成。
另外,重定向报文时为主机而不是为路由器使用的。假定路由器和其他一些路由器共同参与某一种选路协议,则该协议就能取消重定向的需求。
9.6、ICMP路由器发现报文
一般认为,主机在引导以后要广播或多播发送一份路由器请求报文。一台或更多台路由器响应一份路由器通告报文。另外,路由器定期地广播或多播传送它们的路由器通知报文,允许每个正在监听的主机相应地更新它们的路由表。
RFC确定了这两种ICMP报文的格式。
路由器在一份报文中可以通知多个地址。地址数指的是报文中所含的地址数。地址项大小指的是每个路由器地址32bit字的数目,始终为2.生存期是指通告地址的有效时间。
接下来是一对或多对IP地址和优先级。优先级是一个有符号的32bit整数,指出该IP地址作为默认路由器地址的优先等级,这是与子网上的其他路由器想比较而言的。值越大说明优先级越高。优先级为0x80000000说明对应的地址不能作为默认路由器地址使用,尽管它也包含在通告报文中。优先级默认值一般为0。
9.6.1、路由器操作
当路由器启动时,它定期在所有广播或多播传送接口上发送通告报文。这些报文不是定期发送的,而是随机传送的,以减少与子网上其他路由器发生冲突的概率。一份给定的通告报文默认生命周期是30分钟。
使用生命周期的另一个时机是当路由器上的某个接口被关闭时。在这种情况下,路由器可以在该接口上发送最后一份通告报文,并将生命周期值设为0。
9.6.2、主机操作
主机在引导期间一般发送三份路由器请求报文,每三秒钟发送一次。一旦接收到一个有效的通告报文,就停止发送请求报文。
主机也监听来自相邻路由器的请求报文。这些通告报文可以改变主机的默认路由器。另外,如果没有接收到来自当前默认路由器的通告报文,那么默认路由器会超时。
只要有一般的默认路由器,该路由器就会每个10分钟发送通告报文,报文的生命周期是30分钟。这说明主机的默认表项是不会超时的,即使错过了一份或两份通告报文。