读懂路由表信息是非常重要的,能够帮助我们快速的解决路由器故障,我们从来没有说过这些路由表信息是如何被创建的。每当初始化一个接口时(通常是用ifconfig命令设置接口地址),就为接口自动创建一个直接路由。对于点对点链路和环回接口来说,路由是到达主机(例如,设置H标志)。对于广播接口来说,如以太网,路由是到达网络。
到达主机或网络的路由如果不是直接相连的,那么就必须加入路由表。一个常用的方法是在系统引导时显式地在初始化文件中运行route命令。第3个参数(default和slip)代表目的端,第4个参数代表网关(路由器),最后一个参数代表路由的度量(metric)。route命令在度量值大于0时要为该路由设置G标志,否则,当耗费值为0时就不设置G标志。不幸的是,几乎没有系统愿意在启动文件中包含route命令。在4.4BSD和 BSD/386系统中,启动文件是/etc/netstart;在SVR4系统中,启动文件是/etc/inet/rc.inet;在 Solaris2.x中,启动文件是/etc/rc2.d/S69inet;在SunOS4.1.x中,启动文件是/etc/rc.local;而 AIX3.2.2则使用文件/etc/rc。一些系统允许在某个文件中指定默认的路由器,如/etc/defaultrouter.于是在每次重新启动系统时都要在路由表信息中加入该默认项。初始化路由表信息的其他方法是运行路由守护程序或者用较新的路由器发现协议。
较复杂的路由表
在我们的子网上,主机sun是所有主机的默认路由器,因为它有拨号SLIP链路连接到Internet上前两项与主机svr4的前两项一致:通过路由器bsdi到达slip的特定主机路由,以及环回路由。第3行是新加的。这是一个直接到达主机的路由(没有设置 G标志,但设置了H标志),对应于点对点的链路,即SLIP接口。如果我们把它与ifconfig命令的输出进行比较:sun% ifconfigsl0sl0:flags=1051inet140.252.1.29——>140.252.1.183netmaskffffff00可以发现路由表信息中的目的地址就是点对点链路的另一端(即路由器netb),网关地址为外出接口的本地IP地址(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主机不可达的差错报文。