您的位置:首页 > 理论基础 > 计算机网络

tcp/ip --------- IP选路

2015-04-26 11:29 911 查看
选路是IP最重要的功能之一。需要进行选路的数据报可以由本地主机产生,也可以由其他主机产生。(不过,后一种情况下,主机必须配置成路由器,否则通过网络接口接收到的数据报,如果目的地址不是本机就会被悄无声息的丢弃掉)

本章主要目的是了解单个IP层如何做出路由决策。

如图是IP层处理过程的简单流程



图中的路由守护程序,通常是一个守护进程。在Unix系统中,大多数普通的守护程序都是路由程序和网关程序

选路的原理

在《网际层协议》文章中,我们提到IP搜索路由表几个步骤:

1) 搜索完全匹配的IP地址

2) 搜索匹配的网络地址

3) 搜索默认表项(一般在路由表中指定为一个网络表项,其网络号为0)

匹配主机地址步骤始终发生在匹配网络地址步骤之前

IP层进行的选路实际上是一种选路机制,它搜索路由表并决定向哪个网络接口发送分组。这区别于选路策略,它只是一组决定把哪些路由放入路由表的规则。IP执行选路机制,而路由守护程序则一般提供选路策略。

简单路由表:

以下执行的命令为:%netstat –rn (-r 是列出路由表,-n是以数字格式打印IP地址)



操作环境为:



一、第一行指出,若目的地是 slip 主机,那么网关就把分组转发给bsdi

二、对于一个给定的路由器,可以有5种不同的标识:

1、U: 该路由可用

2、G: 该路由是到一个网关(路由器)。如果没有设置该标识,说明目的地是直接相连的

3、H: 即目的地址是一个完整的主机地址。如果没有设置该标识,说明该路由是到一个网络,而目的地址是一个网络地址: 一个网络号,或者网络号和子网号的结合

4、D: 该路由是由重定向报文创建的 (关于重定向下面会讲到)

5、M: 该路由已被重定向报文修改

这里面标识G是非常重要的,因为它区分了间接路由和直接路由(对于直接路由是不设置G标识的)。其区别在于,发往直接路由的分组中不但具有指明目的端的IP地址,还具有其链路层地址。根据我个人的理解,如果有G标识,说明和destination不是直接相连的,要通过gateway,即链路层地址是gateway的地址

当分组被发往一个间接路由时,IP地址指明的是最终的目的地,但是链路层地址指明的是网关(下一跳路由器),这在《网际协议》中提到过了。

从这里,我们可以看出第一行就是用了间接路由,因此采用这一项路由的分组其IP地址是最终目的地(.13.65),但链路层地址对应于路由器.13.35。

这里的标识H表明,目的地址是一个完整的主机地址。没有设置H标识说明目的地址是一个网络地址(即主机号部分为0)。当为某个目的IP地址搜索路由表时,主机地址项必须与目的地址完全匹配,而网络地址项只需要匹配目的地址的网络号和子网号就可以了

这里还有其他几项,但是我在自己的机器上没有发现有这几项,所以这里就简略提一下:

Refcnt: 正在使用该路由的活动进程数

Use: 通过该路由发送的分组数

每个主机都有一个或多个默认路由。即如果在表中没有找到特定的路由,则把分组发送到该默认路由上(UG标识也表明了其是一个网关)。因此这里的sun是被当作路由来使用的,而不是主机功能

输出的最后一行是其所在的以太网。

主机路由表的复杂性取决于主机所在网络的拓扑结构

1) 最简单的情况是主机根本没有与任何网络连接,此时只有环回接口。

2) 主机连接在一个局域网上,只能访问局域网上的主机。这时路由表包含两项:一项是环回接口,另一项是局域网

3) 如果主机能通过单个路由器访问其他网络时,那么就要进行下一步。一般情况下增加一个默认表项指向该路由器

4) 如果要新增其他特定主机或网络路由,那么就要进行最后一步。即上面例子中通过bsdi到slip主机那样的例子

我们根据上述IP操作的步骤使用这个路由表为主机svr4上的一些分组例子选择路由。

1) 假定目的地址是主机sun,140.252.13.33。首先进行主机地址的匹配。路由表中的两个主机地址表项(slip 和 localhost都有标识H)均不匹配,接着进行网络地址匹配。这一次匹配成功,找到表项140.252.13.32 (因为网络号和子网号都相同),因此使用emd0接口,这又是一个直接路由,因此链路层地址直接就是目的端的地址

2) 假定目的地是主机 slip,140.252.13.65,首先搜索主机地址,找到一个匹配的。但这是一个间接路由,因此目的端IP地址仍然是140.252.13.65,但链路层地址却需要是140.252.13.35的链路层地址

3) 假定目的地是internet中的一个网站,在主机匹配失败后,网络匹配也失败,最后找到默认表项并使用它

4) 最后,我们给本机发送数据报。(主机名为svr4, ip为140.252.13.33)

1、 ftp ben

2、 ftp 140.252.13.33

3、 ftp localhost

4、 ftp127.0.0.1

一、 前两种情况下,会成功匹配网络号,并把IP报文传送给以太网驱动程序。(在链路层那章中提过,报文会被送到环回驱动程序,然后由驱动程序放到IP输入队列中)

二、 后两种情况,由于指定了环回接口,可以匹配到主机地址,报文直接被送到环回驱动程序,然后由驱动程序放到IP输入队列中

初始化路由表

一般初始化接口是用ifconfig 命令设置接口地址。 在初始化接口时,会为接口自动创建一个直接路由。对于点对点和环回接口来说,路由有H标识;对于广播接口,路由是到达网络。

我们还能观察一下稍复杂的sun主机的路由表:



我们发现第三行,这里是一个直接到达主机的标识(无G有H),对应于点对点的链路(SLIP)。其目的地址为点对点链路的另一端,网关地址为外出接口的本地IP地址(因为netstat为直接路由打印出来的网关地址就是本地接口所用的IP地址)

根据之前对标识的描述,可以较清晰看出这其中的拓扑结构。

这里可能产生的一个问题是,如果我们没有在路由表中找到对应的表项(没有发现默认网关存在),那么会发生什么情况呢?

结果就要取决于数据报是由本机产生的还是被转发的。

如果数据报是由本地主机产生的,那么就给发送给数据报的应用程序返回一个差错,或是主机不可达差错,或是网络不可达差错

如果是被转发的数据,那么就给原始发送端发送一份ICMP主机不可达差错报文,接下来就谈一下这种差错

ICMP主机与网络不可达差错

当路由器收到一份IP数据包但又不能转发时,就要发送一份ICMP主机不可达差错报文。报文格式之前也提到过:



这里我们可以做一个实验,将路由器sun上的拨号SLIP链路断开,然后试图使默认路由为sun的主机发送要通过该SLIP链路的数据,如下:



通过tcpdump可以观察到:



当路由器发现找不到能到达主机gemini的表项时,它就响应一个主机不可达的报文。

ICMP重定向差错

当IP数据报应该被发送到另一个路由器时,收到数据包的路由器就要发送ICMP重定向差错报文给IP数据报的发送端。

只有当主机可以选择路由器发送分组的情况下,我们才可能看到ICMP重定向报文



1、 我们假定主机发送一份IP数据报给R1。(R1是该主机的默认路由,这种选路决策经常发生。)

2、 R1收到数据报并检查它的路由表,发现R2是发送该数据报的下一站。当它把数据报发送给R2时,R1检测到它正发送的接口和数据报的到达接口是相同的(即主机和两个路由器在一个LAN)。这样路由器发送重定向报文给原始发送端

3、 R1发送一份ICMP重定向报文给主机,告诉它以后把数据发送给R2而不是R1

由此可见,重定向一般让具有很少选路信息的主机逐渐建立更完善的路由表,即主机通过ICMP重定向报文逐步学习拓扑结构。

而且,主机在启动时就可以只有一个默认表项,一旦默认路由发生差错,默认路由将通知它重定向,并允许主机对路由表进行相应改动

这里接着给出一个ICMP重定向的例子:



在上半部分的网络中,大多数主机把gateway指定为默认路由,因为它提供internet的入口。

子网140.252.1上的主机如何访问下半部分的主机的呢?

1、 首先,如果在SLIP链路的另一端只有一台主机,那么ARP代理就可以解决问题了(在关于ARP文章中有提到这种情形)

2、 但是,SLIP的另一端是一个网络,就要涉及选路了。一个解决办法是让所有主机和路由器知道netb是网络140.252.13的网关,比如可以在路由表中添加静态路由,或者主机上运行守护程序实现;另一个解决办法就是利用ICMP重定向报文

这里我们在solaris主机上ping 主机 bsdi,先查看solaris主机的路由表:



第三行是IP广播地址,这里先不管。之后我们ping主机,使用 -v选项可以看到主机接收到的任何ICMP报文

这里我们发现收到了默认路由器的重定向报文,此时再次查看路由表:



发现果然多了一项,且标识中的D表明是由ICMP重定向产生的,此刻如果我们还ping下半部分的其他主机,还是会增加到某主机的表项。



继续深入的看一下,以下是ICMP重定向报文的结构:



一些规则:

1、 重定向报文只能由路由器生成,而不能由主机生成

2、 重定向报文是为主机而不是为路由器使用的

当主机作为路由器使用时,要进行下列检查,在生成ICMP重定向报文之前必须满足这些条件:

1、 出接口必须等于入接口

2、 用于向外传输数据包的路由不能被ICMP重定向报文创建或修改,而且不能是路由器的默认路由

3、 数据报不能用源站选路来转发

4、 内核必须配置成可以发送重定向报文

另外,在接收到ICMP重定向报文后,修改路由表之前,要做检查:

1、 新的路由器必须直接与网络相连接

2、 重定向报文必须来自当前到目的地所选择的路由器

3、 重定向报文不能让主机本身作为路由器

4、 被修改的路由器必须是一个间接路由

最后,路由器应该发送的只是对主机的重定向,而不是对网络的重定向。

ICMP路由发现报文

初始化路由表的方法,处理在配置文件中指定静态路由,另一种方法是利用ICMP路由器通告和请求报文

一般情况下,主机在引导后要广播或多播传送路由器请求报文,一台或更多台路由器响应路由器通过报文。另外,路由器定期的广播或多播他们的路由器通告报文,允许每个正在监听的主机相应的更新路由表。

当路由器某个接口关闭时,路由器可以在该接口上发送最后一份通告报文,生命周期为0;路由器不仅定时发送通告报文,还监听来自主机的请求报文,并发送通告报文响应

请求报文如下:



通告报文如下:



其中的优先级是指出该IP地址作为默认路由器地址的优先等级,这事与子网上的其他路由器相比较而言的,值越大优先级越高
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: