引言:选路是IP最重要的功能之一。

需要进行选路的数据报可以由本地主机产生;也可以由其他主机产生,这时候主机必须配置为路由器,否则通过网口接收到的数据报发现目的地址不是本机则会被丢弃。

路由守护程序,这通常是一个用户进程。Unix系统中,大多数的守护程序都是路由程序和网关程序。这里主要了解单个IP层如何作出路由决策

地址选择组件 Android 地址选择器的原理_linux

一. 选路的原理

内核如何维护路由表,路由表中包含的信息决定了IP层所做的所有决策。
IP搜索路由表的步骤:
1)搜索匹配的主机地址;(注:匹配主机地址始终在匹配网络地址之前
2)搜索匹配的网络地址;
3)搜索默认表项(注:默认表项一般在路由表中被指定为一个网络表项,其网络号为0)
IP层进行的选路实际是一种选路机制,其搜索路由表并决定向哪个网络接口发送分组。
注:选路机制区别于选路策略,选路策略只是一组决定把哪些路由放入路由表的规则。
IP执行选路机制,路由守护程序一般提供选路策略。

1.1 简单路由表

地址选择组件 Android 地址选择器的原理_tcp/ip_02


说明如下:

1、主机svr4, netstat命令参数,[-r]表示显示路由信息、路由表[-n]表示拒绝显示别名、能显示数字的全部转换为数字。

netstat -rn //netstat命令列出路由表,并以数字格式打印IP地址(注:路由表中的一些表项是网络地址,而不是主机地址,不用-n参数,netstat命令会将搜索文件列出其中的网络名,与网络名加主机名相混淆)

2、对于一个给定的路由器,可以打印5种不同的标志(flags):

U 该路由可以使用。
G 该路由是到一个网关 (Gateway 路由器)。无该标志,说明目的地直接相连。
这样区分了间接路由与直接路由
区别:
发往直接路由的分组,含目的端IP地址和其链路层地址;
发往间接路由的分组,含目的端IP地址和链路层地址指明的网关(即下一站路由器)。
H 该路由是到一个主机(Host),目的地址是一个完整的主机地址。无该标志,说明该路由是到一个网络,目的地址是一个网络地址(主机号部分为0):一个网络号或者网络号与子网号的组合。当为某个目的IP地址搜索路由表时,主机地址项必须与目的地址完全匹配,而网络地址项只需要匹配目的地址的网络号和子网号。
注:大多数版本的netstat命令首先打印所有的主机路由表项,其次才是网络路由表项。
D 该路由是由重定向报文创建的。
M 该路由已被重定向报文修改。

2、参考记数Refcnt(Reference count)列出的是正在使用路由的活动进程个数。
面向连接的协议,如TCP在建立时要固定路由。如果在主机svr4和slip之间建立Telnet连接,可以看到参考记数值变为1,建立另一个Telnet连接时,值增加为2,以此类推。

3、Use显示的是通过该路由发送的分组数。
如果我们是这个路由的唯一用户,那么运行Ping程序发送5个分组之后,它的值将为5。

4、Interface 是本地接口的名字。
这里有接口emd0,接口lo0.

5、输出的第2行是环回接口,如下:

地址选择组件 Android 地址选择器的原理_地址选择组件 Android_03


它的名字始终为lo0。没有设置G标志,因为该路由不是一个网关,且是一个直接路由,网关列Gateway给出的是外出IP地址。H标志说明目的地址(127.0.0.1)是一个主机地址,而不是一个网络地址。6、输出的第3行是默认路由。每个主机都有一个或多个默认路由。如下:

地址选择组件 Android 地址选择器的原理_路由表_04


表明如果在表中没有找到特定的路由,就把分组发送到路由器140.252.13.33(sun主机,这里发挥的是IP转发功能).说明当前主机(sur4)利用这一个路由表就可以通过Internet经路由器sun(及其SLIP链路)访问其他系统。UG表明这是一个可使用的网关。7、输出的最后一行是所在的以太网。如下

地址选择组件 Android 地址选择器的原理_tcp/ip_05


没有设置H标志,说明目的地址(140.252.13.32)是一个网络地址,其主机地址部分设为0(低5位)。没有设置G标志,说明这是一个直接路由,网关列Gateway指出的是外出地址。这里还隐含了目的地址(140.252.13.32)的子网掩码。因为内核知道每个路由表项对应的接口,每个接口都有一个对应的子网掩码,因此每个路由表项都有一个隐含的子网掩码。

主机路由表的复杂性取决于主机所在网络的拓扑结构。
1)主机根本没有与任何网络连接。路由表只包含环回接口一项,TCP/IP协议仍然能用于这样的主机,但只能与自己本身通信。
2)主机连接在一个局域网上,只能访问局域网上的主机。路由表包含两项:一是环回接口,另一项是局域网(如以太网)。
3)主机能通过单个路由器访问其他网络,则需进行下一步,一般情况下增加一个默认表项指向该路由器。
4)新增其他的特定主机或网络路由,那么进行最后一步。
举例如下:
根据上述IP操作的步骤使用路由表为主机svr4上的一些分组例子选择路由:

  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. 通过Internet给本机发送一份数据报。如下4种方法可以完成:
    ftp svr4 //主机名
    ftp 140.252.13.34 //主机IP地址
    --------------前两种,对路由表的第2次搜索得到一个匹配的网络地址140.252.13.32.,并把IP报文传送给以太网驱动程序。IP报文的目的地址为本机地址,因此报文被送给环回驱动程序,然后由驱动程序把报文放入IP输出队列。
    ftp localhost //环回名
    ftp 127.0.0.1 //环回IP地址
    -------------因指定了环回接口的名字或IP地址,第一次搜索就找到匹配的主机地址,因此报文直接被送给环回驱动程序,然后驱动程序把报文放入IP输出队列中。

1.2 初始化路由表

每当初始化一个接口时(通常是用ifconfig命令设置接口地址),就为接口自动创建一个直接路由。

1.3 较复杂的路由表

二、 ICMP主机与网络不可达差错

三、转发或不转发

四、ICMP重定向差错

4.1 一个例子

4.2 更多细节

五、ICMP路由器发现报文

5.1 路由器操作

5.2 主机操作

六、小结