在IP选路过程中,路由表的作用是非常重要的,路由表项的内容包括:5bit标志、目的IP地址(主机、网络或默认)、下一站路由器的IP地址(间接路由)或者本地接口的IP地址(直接路由)及指向本地接口库的指针。主机表项比网络表项具有更高的优先级,而网络表项比默认项具有更高的优先级。
系统产生的或转发的每份IP数据报都要搜索路由表,路由表可以被路由守护程序或ICMP重定向报文修改。系统在默认情况下不转发数据报,除非进行特殊配置。主机在启动时只有一个简单的路由表,它可以被来自默认路由器的ICMP重定向报文动态修改。
路由表的内容、格式以及搜寻步骤已经在《IP路由选择》一文中讲过,这里就不再重复。
每初始化一个网络接口时,就为接口自动创建一个直接路由。对于点对点链路和环回接口,路由直接到达主机;对于广播接口,路由是到达网络。
到达主机或网络的路由如果不是直接相连的,那就需要加入路由表。一种方法是在系统引导时显式地在初始化文件中运行route命令。如:
route add default [主机名/IP地址] 1
第三个参数代表目的端,第四个参数代表网关(路由器),最后一个参数代表路由的度量(metric)。
但是一般操作系统不会把route命令加入到启动文件中。一些系统允许在某个文件中指定默认的路由器,如/etc/defaultrouter。在每次重启操作系统时都要在路由表中加入该默认项。
初始化路由表的其他方法是运行路由守护程序或用较新的路由器发现协议。后面有章节会涉及到这些内容。
正常情况下,路由表中如果有默认项的话,我们对路由表的搜索都能找到匹配项,因为主机和网络项都匹配不上的话,就会自动匹配到默认项上。但是如果路由表中没有默认项,而又没有找到主机或网络匹配项,这时就产生报错信息。
具体报错信息取决于该IP数据报是由主机产生的还是被转发的。如果数据报是由本地主机产生的,那么就给发送该数据报的应用程序返回一个差错,“主机不可达差错”或者是“网络不可达差错”。如果是被转发的数据报,那么就给原始发送端发送一份ICMP主机不可达的差错报文。
当IP数据报应该被发送到另一个路由器时,收到数据报的路由器就要发送ICMP重定向差错报文给IP数据报的发送端。举个栗子:
重定向一般用来让具有很少选路信息的主机逐渐建立更完善的路由表。主机启动时路由表中可以只有一个默认表项。一旦默认路由发生差错,默认路由器将通知它进行重定向,并允许主机对路由表作相应的改动。
一般来说,主机在引导以后要广播或多播传送一份路由器请求报文。一台或更多台路由器响应一份路由器通告报文。另外,路由器定期地广播或多播传送它们的路由器通告报文,允许每个正在监听的主机相应地更新它们的路由表。
ICMP路由器请求报文格式
ICMP路由器通告报文格式
路由器在一份报文中可以通告多个地址。地址数指的是报文中所含的地址数。地址项大小指的是每个路由器地址32bit字的数目,始终为2。生存期指的是通告地址有效的时间。下面是地址和优先级字段。IP地址是发送路由器的某个地址。优先级是一个有符号的32bit整数,指出该IP地址作为默认路由器地址的优先等级,这是与子网上的其他路由器相比较而言的。值越大说明优先级越高。
当路由器启动时,将随机在所有广播或多播传送接口上发送通告报文。随机发送是为了减少与子网上其他路由器发生冲突的概率。一般两次通告报文间隔450s和600s。通告报文的默认生命周期是30min。
涉及到生命周期的另一个情况是当路由器上的某个接口被关闭时,路由器可以在该接口上发送最后一份通告报文,并把生命周期值设为0。
除了定期发送主动提供的通告报文以外,路由器还要监听来自主机的请求报文,并发送路由器通告报文以响应这些请求报文。
如果子网上有多台路由器,由管理员为每个路由器设置优先等级。例如,主默认路由器就要比备份路由器具有更高的优先级。
主机在引导期间一般发送三份路由器请求报文,每3s发送一次。当接收到一个有效的通告报文,就停止发送请求报文。
主机同时也监听来自相邻路由器的请求报文。这些通告报文可以改变主机的默认路由器。如果没有接收到来自当前默认路由器的通告报文,默认路由器就会超时。
主机同时也监听来自相邻路由器的请求报文。这些通告报文可以改变主机的默认路由器。如果没有接收到来自当前默认路由器的通告报文,默认路由器就会超时。
一般的默认路由器每隔10min发送通告报文,报文的生命周期是30min。即使主机在一段时间内,没有收到一份或者两份通告报文,主机的默认表项也不会超时。