IP层进行的选路实际上是一种选路机制,搜索路由表并决定想哪个网络接口发送分组数据。在路由表中搜索可以匹配的路由,找到匹配的路由后就将数据发给该项目的下一跳。
IP搜索路由表的几个步骤:
1.搜索匹配的主机地址
2.搜索匹配的网络地址
3.搜索默认表项
应注意IP选路和ARP协议过程的区别。个人理解是首先进行IP选路,得到下一站的IP地址,然后再在ARP高速缓存中查询其硬件地址,或者使用ARP协议查询。
路由表项
路由表项的内容包括:5bit标志、目的IP地址(主机、网络或默认)、下一站路由器的IP地址(间接路由)或者本地接口的IP地址(直接路由)及指向本地接口的指针。另外每个接口都还有一个子网掩码。
主机路由表
标志位的五个标志:U/G/H/D/M.其中某几个可以连接使用,如标志位UGH等。
U表示该路由可用。
G表示该路由是一个网关(路由器)。其区分了直接路由和间接路由,设置了该标志说明是间接路由。间接路由中,链路层首部中的硬件地址与IP首部中的IP地址不对应。即硬件地址是下一站的硬件地址,IP地址是目的端的IP地址。如果没有这个标志,表示直接路由,链路层数据首部中的硬件地址与IP首部中的IP地址是对应的,都是目的端的硬件地址和IP地址。对于直接路由,分组中指明了目的端的IP地址与链路层地址,即IP地址和链路层地址是同对应的,是同一个端口的。但是对于间接路由,目的端的IP地址和链路层地址并不是想对应的,IP地址指明的是最终的目的端的IP地址,而链路层地址确实下一站路由器的地址。(个人理解:直接路由就是数据要发给下一跳的地址,而间接路由则是由下一跳转发分组)
H表示该路由是一个主机,即目的地址是一个完整的主机地址。如果没有设置该标志,说明该目的地址是一个网络地址,只需要匹配网络地址和子网地址:一个网络号或者网络号和子网号的组合。注意区别G和H标志,G标志区分了直接路由和间接路由。而 H表明目的地址是一个完整的主机地址,主机地址项必须与目的地址完全匹配;没有设置H标志说明目的地址是一个网络地址,网络地址只需要匹配目的地址的网络号和子网号就可以了。
D表示该路由是由重定向报文创建的。
M表示该路由已经被重定向报文修改。
测试网络结构
第一行中,目的地是slip主机,中间隔着一个路由器bsdi,所以是间接路由;由于需要交付到slip主机,所以需要设置标志位H。
第二行是一个环回接口。目的地就是本机,所以需要设置H。
第三行表示默认路由。所以需要设置G。
最后一行是所在以太网。图中并没有给出目的端。其中木有设置H,表示其不是一个主机号,而是一个网络地址。没有设置G,表示是一个直接路由。(网关列给出的IP地址是svr4自己的IP地址)如果下一跳是本机,但目的地址不是本机,则表示本机与目标是直接相连的。在这种情况下,路由记录的interface和gateway是同一个。关于路由表一些更详细的信息解释,可以参考http://blog.csdn.net/perddy/article/details/1722134。
ICMP主机与网络不可达差错
如果路由表中没有默认项,而查找路由表又没有找到匹配项时,如果数据时本地主机产生的,那么就给发送该数据报的应用程序返回一个主机不可达差错或网络不可达差错。如果数据时转发的,则给发送端主机发送一个ICMP主机不可达差错报文。
书中所将的ping一个与Inetenet没有连接的IP地址,那么会返回差错报文。在发现IP地址无效钱,分组已经经过了6个路由器。前边6个路由器之所以能转发分组时由于路由表中有默认项。当到达返回差错报文的那个路由器时,那个路由器应该是没有默认项的。否则会一直转发下去,知道IP首部中的TTL变为0。在XP机器下进行同样的ping实验,结果返回的是超时而不是ICMP主机不可达报文。说明这个分组一直在被转发,直至TTL为0。
ICMP重定向差错
当IP数据报应该被发送到另一个路由器时,收到数据报的路由器会给发送端发送ICMP重定向差错报文。只有在主机可以选择路由器发送分组的情况下,我们才可能会看到ICMP重定向差错报文。如主机A与路由器B和路由器C相连,A要给主机D发送报文。A的默认路由是B。则开始A会把报文发送给B,让其转发。但是B发现,若发送数据给D,B需要把报文转发给C再让C转发给D。所以,A可以直接让C转发就可以了。则B会给A发送一个ICMP重定向差错报文。重定向差错报文可以让拥有很少选路信息的主机逐渐建立完善的路由表。主机启动时,路由表中只有一个默认的表项,但是一旦发生选路错误,默认路由器会给它发送重定向差错报文来纠正。ICMP差错报文格式如下:
代码段有四种。0表示网络重定向;1表示主机重定向;2表示服务类型和网络重定向;3表示服务类型和主机重定向。
ICMP重定向报文的接收者必须查看三个IP地址:
1. 导致重定向的IP地址,即收到的ICMP重定向报文中数据部分所包含的IP首部中的目的IP地址,也就是说开始发送的目的地址。(见第6章,当发送一份ICMP差错报文时,报文始终包含IP的首部和产生ICMP差错报文的IP数据报的前八个字节。)
2. 发送重定向报文的路由器的IP地址。这个可以从接受到的ICMP重定向报文的IP数据报的首部获得。
3. 应该采用的路由器IP地址。由上图可以知道,可以在接受的ICMP重定向报文中获得。
产生重定向报文的规则:
1. 重定向报文只能由路由器产生,而不能由主机产生。
2. 重定向报文时为主机使用而不是为路由器使用。
ICMP路由器发现报文
主机路由表的初始化方法,一种是配置文件中指定的静态路由器。另外一种是利用ICMP路由器通告和请求报文。
主机在引导后,会广播或者多播一份路由器请求报文。一台或者多台的路由器相应一份路由器通告报文。另外,路由器定期的广播或者多播它们的路由器通告报文,允许每个正在监听的主机相应的更新它们的路由表。ICMP路由器请求报文格式如下:
ICMP路由器通告报文格式如下:
地址数表示报文中所包含的地址数。地址项长度大小值得是每个路由器地址32bit字的数目,始终为2.每对地址项占两个32bit:路由器地址和优先级,优先级是一个有符号的32bit整数,指出该IP地址作为默认路由器地址的优先级。当路由器的某个端口被关闭时,路由器可以在该接口上发送最后一份通告报文,把生存时间设置为0。
主机在引导期间一般发送三份路由器请求报文,三秒发送一次。一旦接受到一个有效的通告报文,就停止发送请求报文。主机也会监听来自相邻路由器的请求报文。如果主机没有接收到来自当前默认路由器的通告报文,则这个默认路由器会超时。