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地址作为默认路由器地址的优先等级,这事与子网上的其他路由器相比较而言的,值越大优先级越高
本章主要目的是了解单个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地址作为默认路由器地址的优先等级,这事与子网上的其他路由器相比较而言的,值越大优先级越高
相关文章推荐
- 《TCP/IP具体解释卷2:实现》笔记--选路请求和选路消息
- [TCPIP] IP路由表及选路 Note
- TCP/IP之IP选路及动态选路
- TCP/IP网络层之 IP选路的实现过程
- 配置Hercules的TCPIP
- 《TCP/IP 详解 卷一》读书笔记-----IP静态 路由
- 《聊聊Socket、TCP/IP、HTTP、FTP及网络编程》 / 《聊聊同步、异步、阻塞与非阻塞》
- TCP/IP(四):TCP 与 UDP 协议简介
- TCP/IP四层模型详细讲解
- armlinux下的网路传输(tcp/ip) 分类: arm-linux-Ubuntu 2013-08-12 15:38 416人阅读 评论(0) 收藏
- TCP/IP、Http、Socket的区别
- SSAS : XMLA over TCP/IP的实现
- TCP/IP重传超时--RTO
- TCP/IP、HTTP、Socke、UDP的区别
- Tcp/Ip与UDP之间的联系与区别
- TCP/IP 三次握手详解
- RFC 1180 - TCP/IP tutorial 学习笔记
- OSI七层模型和TCP/IP五层网络架构
- 【Java TCP/IP Socket】TCP Socket(含代码)
- TCP/IP第四层--传输层TCP数据报文详解