选路是I P最重要的功能之一。图 9 - 1是I P层处理过程的简单流程。需要进行选路的数据报可以由本地主机产生,也可以由其他主机产生。在后一种情况下,主机必须配置成一个路由器,否则通过网络接口接收到的数据报,如果目的地址不是本机就要被丢弃(例如,悄无声息地被丢弃)。
选路的原理
开始讨论 I P选路之前,首先要理解内核是如何维护路由表的。路由表中包含的信息决定了I P层所做的所有决策
I P搜索路由表的几个步骤:
1) 搜索匹配的主机地址;
2) 搜索匹配的网络地址;
3) 搜索默认表项(默认表项一般在路由表中被指定为一个网络表项,其网络号为 0)。
匹配主机地址步骤始终发生在匹配网络地址步骤之前。
I P层进行的选路实际上是一种选路机制,它搜索路由表并决定向哪个网络接口发送分组。这区别于选路策略,它只是一组决定把哪些路由放入路由表的规则。 I P执行选路机制,而路由守护程序则一般提供选路策略。
简单路由表
netstat -rn
对于一个给定的路由器,可以打印出五种不同的标志(f l a g):
U 该路由可以使用。
G 该路由是到一个网关(路由器)。如果没有设置该标志,说明目的地是直接相连的。
H 该路由是到一个主机,也就是说,目的地址是一个完整的主机地址。如果没有设置该
标志,说明该路由是到一个网络,而目的地址是一个网络地址:一个网络号,或者网
络号与子网号的组合。
D 该路由是由重定向报文创建的(9 . 5节)。
M 该路由已被重定向报文修改(9 . 5节)
标志G是非常重要的,因为由它区分了间接路由和直接路由(对于直接路由来说是不设置标志G的)。其区别在于,发往直接路由的分组中不但具有指明目的端的 I P地址,还具有其链路层地址。当分组被发往一个间接路由时, I P地址指明的是最终的目的地,但是链路层地址指明的是网关(即下一站路由器)
在这个路由表例子中,有一个间接路由(设置了标志 G),因此采用这一项路由的分组其 I P地址是最终的目的地(1 4 0 . 2 5 2 . 1 3 . 6 5),但是其链路层地址必须对应于路由器 1 4 0 . 2 5 2 . 1 3 . 3 5
主机路由表的复杂性取决于主机所在网络的拓扑结构。
1) 最简单的(也是最不令人感兴趣的)情况是主机根本没有与任何网络相连。 T C P / I P协议仍然能用于这样的主机,但是只能与自己本身通信!这种情况下的路由表只包含环回接口一项。
2) 接下来的情况是主机连在一个局域网上,只能访问局域网上的主机。这时路由表包含两项:一项是环回接口,另一项是局域网(如以太网)。
3) 如果主机能够通过单个路由器访问其他网络(如 I n t e r n e t)时,那么就要进行下一步。
4) 如果要新增其他的特定主机或网络路由,那么就要进行最后一步。
初始化路由表
每当初始化一个接口时(通常是用i f c o n f i g命令设置接口地址),就为接口自动创建一个直接路由。对于点对点链路和环回接口来说,路由是到达主机(例如,设置 H标志)。对于广播接口来说,如以太网,路由是到达网络。
到达主机或网络的路由如果不是直接相连的,那么就必须加入路由表。一个常用的方法是在系统引导时显式地在初始化文件中运行 r o u t e命令
route add default sun 1
route add slip bsdi 1
第3个参数(d e f a u l t和s l i p)代表目的端,第 4个参数代表网关(路由器),最后一个参数代表路由的度量 ( m e t r i c )。 r o u t e命令在度量值大于 0时要为该路由设置 G标志,否则,当耗费值为0时就不设置G标志。
较复杂的路由表
一个直接到达主机的路由 (没有设置G标志,但设置了H标志),对应于点对点的链路,即 S L I P接口。
默认的路由表项是一个到达网络的间接路由 (设置了G标志,但没有设置 H标志),这正是我们所希望的
没有到达目的地的路由
例子都假定对路由表的搜索能找到匹配的表项,即使匹配的是默认项。如果路由表中没有默认项,而又没有找到匹配项,这时会发生什么情况呢?
结果取决于该 I P数据报是由主机产生的还是被转发的(例如,我们就充当一个路由器)。如果数据报是由本地主机产生的,那么就给发送该数据报的应用程序返回一个差错,或者是“主机不可达差错”或者是“网络不可达差错”。如果是被转发的数据报,那么就给原始发送端发送一份 I C M P主机不可达的差错报文。
ICMP主机与网络不可达差错
当路由器收到一份 I P数据报但又不能转发时,就要发送一份 I C M P“主机不可达”差错报文。
转发或不转发
大多数伯克利派生出来的系统都有一个内核变量 i p f o r w a r d i n g,或其他类似的名字(参见附录E)。一些系统(如B S D / 3 8 6和S V R 4)只有在该变量值不为0的情况下才转发数据报。SunOS 4.1.x允许该变量可以有三个不同的值:- 1表示始终不转发并且始终不改变它的值; 0表示默认条件下不转发,但是当打开两个或更多个接口时就把该值设为 1; 1表示始终转发
ICMP重定向差错
当I P数据报应该被发送到另一个路由器时,收到数据报的路由器就要发送 I C M P重定向差错报文给I P数据报的发送端。
只有当主机可以选择路由器发送分组的情况下,我们才可能看到 I C M P重定向报文
1) 我们假定主机发送一份 I P数据报给 R 1。这种选路决策经常发生,因为 R 1是该主机的默认路由。
2) R1收到数据报并且检查它的路由表,发现 R 2是发送该数据报的下一站。当它把数据报发送给R 2时, R 1检测到它正在发送的接口与数据报到达接口是相同的(即主机和两个路由器所在的L A N)。这样就给路由器发送重定向报文给原始发送端提供了线索。
3) R1发送一份I C M P重定向报文给主机,告诉它以后把数据报发送给 R 2而不是R 1。
重定向一般用来让具有很少选路信息的主机逐渐建立更完善的路由表。主机启动时路由表中可以只有一个默认表项
一旦默认路由发生差错,默认路由器将通知它进行重定向,并允许主机对路由表作相应的改动。 I C M P重定向允许T C P / I P主机在进行选路时不需要具备智能特性,而把所有的智能特性放在路由器端。R 1和R2 必须知道有关相连网络的更多拓扑结构的信息,但是连在 L A N上的所有主机在启动时只需一个默认路由,通过接收重定向报文来逐步学习。
更多的细节
有四种不同类型的重定向报文,有不同的代码值,如图 9 - 5所示。
I C M P重定向报文的接收者必须查看三个 I P地址:
( 1 )导致重定向的 I P地址(即 I C M P重定向报文的数据位于I P数据报的首部);
( 2 )发送重定向报文的路由器的I P地址(包含重定向信息的 I P数据报中的源地址;
( 3 )应该采用的路由器I P地址(在I C M P报文中的4 ~ 7字节)。
关于I C M P重定向报文有很多规则。首先,重定向报文只能由路由器生成,而不能由主机生成。另外,重定向报文是为主机而不是为路由器使用的。路由器和其他一些路由器共同参与某一种选路协议,则该协议就能消除重定向的需要
生成 I C M P重定向报文之前这些条件:
1) 出接口必须等于入接口。
2) 用于向外传送数据报的路由不能被 I C M P重定向报文创建或修改过,而且不能是路由器的默认路由。
3) 数据报不能用源站选路来转发。
4) 内核必须配置成可以发送重定向报文。
这是为了防止路由器或主机的误操作,以及恶意用户的破坏,导致错误地修改系统路由表
1) 新的路由器必须直接与网络相连接。
2) 重定向报文必须来自当前到目的地所选择的路由器。
3) 重定向报文不能让主机本身作为路由器。
4) 被修改的路由必须是一个间接路由
路由器应该发送的只是对主机的重定向(代码 1或3,如图9 - 5所示),而不是对网络的重定向。子网的存在使得难于准确指明何时应发送对网络的重定向而不是对主机的重定向。只当路由器发送了错误的类型时,一些主机才把收到的对网络的
重定向当作对主机的重定向来处理
ICMP路由器发现报文
前面已提到过一种初始化路由表的方法,即在配置文件中指定静态路由。这种方法经常用来设置默认路由。另一种新的方法是利用 I C M P路由器通告和请求报文.
一般认为,主机在引导以后要广播或多播传送一份路由器请求报文。一台或更多台路由器响应一份路由器通告报文。另外,路由器定期地广播或多播传送它们的路由器通告报文,允许每个正在监听的主机相应地更新它们的路由表.
一对或多对 I P地址和优先级。 I P地址必须是发送路由器的某个地址。优先级是一个有符号的 32 bit整数,指出该 I P地址作为默认路由器地址的优先等级,这是与子网上的其他路由器相比较而言的。值越大说明优先级越高。优先级为 0 x 8 0 0 0 0 0 0 0说明对应的地址不能作为默认路由器地址使用,尽管它也包含中通告报文中。优先级的默认值一般为 0。
路由器操作
当路由器启动时,它定期在所有广播或多播传送接口上发送通告报文。准确地说,这些通告报文不是定期发送的,而是随机传送的,以减小与子网上其他路由器发生冲突的概率。一般每两次通告间隔 4 5 0秒和6 0 0秒。一份给定的通告报文默认生命周期是 3 0分钟。
使用生命周期域的另一个时机是当路由器上的某个接口被关闭时。在这种情况下,路由器可以在该接口上发送最后一份通告报文,并把生命周期值设为 0。
除了定期发送主动提供的通告报文以外,路由器还要监听来自主机的请求报文,并发送路由器通告报文以响应这些请求报文。
如果子网上有多台路由器,由系统管理员为每个路由器设置优先等级。例如,主默认路由器就要比备份路由器具有更高的优先级。
主机操作
主机在引导期间一般发送三份路由器请求报文,每三秒钟发送一次。一旦接收到一个有效的通告报文,就停止发送请求报文。
主机也监听来自相邻路由器的请求报文。这些通告报文可以改变主机的默认路由器。另外,如果没有接收到来自当前默认路由器的通告报文,那么默认路由器会超时。
只要有一般的默认路由器,该路由器就会每隔 1 0分钟发送通告报文,报文的生命周期是3 0分钟。这说明主机的默认表项是不会超时的,即使错过一份或两份通告报文。
实现
路由器发现报文一般由用户进程(守护程序)创建和处理。这样,在图 9 - 1中就有另一个修改路由表的程序,尽管它只增加或删除默认表项。守护程序必须把它配置成一台路由器或主机来使用。
I P路由操作对于运行 T C P/I P的系统来说是最基本的,不管是主机还是路由器。路由表项的内容很简单,包括: 5 bit标志、目的I P地址(主机、网络或默认)、下一站路由器的 I P地址(间接路由)或者本地接口的 I P地址(直接路由)及指向本地接口的指针。主机表项比网络表项具有更高的优先级,而网络表项比默认项具有更高的优先级。
系统产生的或转发的每份 I P数据报都要搜索路由表,它可以被路由守护程序或 I C M P重定向报文修改。系统在默认情况下不转发数据报,除非进行特殊的配置。用 r o u t e命令可以进入静态路由,可以利用新 I C M P路由器发现报文来初始化默认表项,并进行动态修改。主机在启动时只有一个简单的路由表,它可以被来自默认路由器的 I C M P重定向报文动态修改。