tcp/ip ---------- traceroute

来源:互联网 发布:淘宝描述图片尺寸 编辑:程序博客网 时间:2024/05/20 14:27

Ping通过发送ICMP回显请求和应答报文来完成,traceroute通过发送UDP报文的TTL和判断对方回复的ICMP报文来完成

 

Traceroute程序可以让我们看到IP数据报从一台主机传到另一台主机所经过的路由,还可以使用IP路由选项

 

 

在Ping程序中,我们描述了IP记录路由选项(RR)。为什么我们不使用这个选项,仍然要开发一个这个应用程序呢?

1、  首先,原先并不是所有路由器支持记录路由选项,因此该选项在某些路由上不能使用(然而traceroute程序不需要中间路由器具备任何特殊的或可选的功能)

2、  其次,记录路由一般是单项的选项,发送端设置了该选项,那么接收端不得不从收到的IP首部中提取出所有信息,然后全部返回给发送端(traceroute程序只需要目的端运行一个UDP模块---其他不需要任何特殊的服务器应用程序

3、  最后,IP首部中留给选项的空间有限,不能存放当前大多数的路径。(我们知道,只能放9个,这是远远不够的)

 

 

ICMP报文和TTL

Traceroute程序使用ICMP报文和IP首部中的TTL字段(生存周期),常为255.

每个处理数据报的路由器都需要把TTL减1或减去数据报在路由器中停留的秒数。由于大多停留小于1秒,所以TTL最终成为计数器,每经过一个路由器即减1(即使停留时间大于1秒,许多实现依旧是减1)

TTL字段是为了防止数据在选路时无休止的在网络中流动。例如路由器瘫痪或者两个路由器之间的连接丢失时,选路协议回去检测丢失的路由并一直进行下去。

当路由器收到一份IP数据报的TTL字段是0或1时,则路由器不转发该数据报,将该数据包丢弃并给IP源地址发一份ICMP”超时“信息。

Traceroute的关键在于收到的包含这份ICMP信息的IP报文的信息源地址是该路由器的IP地址

 

 

因此,大致的traceroute的执行过程

1、  它发送一份TTL字段为1的IP数据报给目的主机。

2、  处理这份数据报的第一个路由器将TTL减1,丢弃该数据报,并发回一份超时ICMP报文。这样一来,就得到了该路径中第一个路由器的地址。

3、  接着我们发送TTL为2的IP数据报,直到数据报达到目的主机。

4、  目的主机如果接收到TTL为1 IP数据报,是不会丢弃的也不会产生ICMP数据报,这是因为已经到达了最终的目的地。

 

那我们如何判断是否已经到达了主机了呢?

Traceroute发送一份UDP数据报给目的主机,但它选择一个不可能的值作为UDP端口号(即目的主机不可能使用这个端口号),这样一来,数据报到达目的主机时,目的主机的UDP模块产生一份”端口不可达”错误的ICMP报文。

这样,traceroute要做的就是区分接收到的ICMP报文是超时还是端口不可达,以判断什么时候结束

 

 

现在来贴出在局域网中的实例:

 

                                                            

操作环境如下:

                                                            

这是书上的,下面是现在我的电脑上的:

 

                         

 

可以看出,这里设置的TTL=30。书上的traceroute发送40个字节数据,而我这里发送了60个字节。

         书上的40字节包括20字节IP首部, 8字节UDP首部,12字节用户数据(12字节包括每发一个字节增加的数据序列号,TTL副本,发送数据报的时间)

         我通过tcpdump观察了一下我的主机上的数据:

 

                       

 

     我这里发送了包含32字节的用户数据,所以总长为60字节。(不过我并不清楚这32字节里有什么…网上搜到的也都是抄书的依旧是40字节…)

 

         输出的以后每行都是以TTL为首。对于每个TTL值,发送3份数据报,这个可以从每行最后三列看出来,每份时间不同。

         每次接收到一份ICMP报文就计算打印往返时间,如果5秒内仍未收到3份数据报的任意一份的响应,则打印一个星号,并发送下一份数据报。

        

         下面我们给出在svr4上运行tcpdump的结果:

                                                              

         我们发现,目的主机的端口号每发送一个数据就加一,我们也可以通过命令行选项来改变端口号。

         可以看出,在数据报的ttl为1或0时,tcpdump会打印出来提醒我们报文的异常。

         因为在bsdi收到数据报后ttl变为0,那么它就会返回一个ICMP超时报文

 

既然这里提到了超时报文,索性将两种超时报文贴出来:

            

他们的code字段不同。

         我们这里讨论的ICMP是在TTL为0的时候产生的,code为0

         还有一种,主机在组装分片时可能发生超时,这时主机就会发送一份组装报文超时的ICMP报文,code字段为1。

 

         这里我们计算一下在SLIP链路下,各数据报的大小。

         发送出的UDP数据报按书上看是42字节(12字节的数据,8字节UDP首部,20字节IP首部以及2字节的SLIP帧)。

与ping不同的地方在于返回的数据报大小是变化的。返回的ICMP报文包含发生差错的数据包的IP首部和紧随IP首部的8个字节数据(这里是UDP首部),这样一来就是58个字节(20+8+20+8+2 自带IP首部加上ICMP首部加上数据加上2字节SLIP帧)

 

关于traceroute书上还提几点要注意的地方:

1、  首先,并不能保证现在的路由也是将来其他数据包会经过的路由,甚至两份连续的IP数据报都可能采用不同的路由。(对于一个给定的TTL,若其路由发生变化,traceroute将会打印出新的IP地址,因此我们很容易发现路由的变化)

2、  其次,不能保证ICMP报文的路由与traceroute发送出去的UDP数据报采用同一路由,这样的话往返时间就不能真正体现数据包发出和返回的时差了

3、  最后,返回的ICMP报文的信源IP地址是UDP数据报到达的路由器接口的IP地址。这与IP记录路由选项不同(因为路由选项记录的是发送接口地址),这样的话,从A主机到B主机运行traceroute得到的结果可能就是不同的

也就是说,从slip到svr4会是这样的:

 

 

 

IP源站路由选项:

         通常IP路由是动态的,即每个路由器都要判断数据报下面该转发到哪个路由器。

源站路由(source routing)的思想是由发送者指定路由。可采用以下两种方式:

1、  严格的源路由选择。发送端指明IP数据报所必须采用的确切路由。如果一个路由器发现源路由所指定的下一个路由器不在其直接连接的网络上,那么就会返回一个“源站路由失败”的ICMP差错报文

2、  宽松的源站路由。发送端指明了IP数据包经过的IP地址清单,但是数据报在清单上指明的任意两个地址之间可以通过其他路由器

 

 

源站路由选项的格式:


这个格式与ping使用的记录路由选项格式基本一致,不同之处在于对于源站选路,我们必须在发送IP数据报之前填充IP地址清单,而且只需要为所需要的IP地址数分配空间并进行初始化,并让路由器填充各项,数量通常小于9。

而对于记录选项来说,必须尽可能的分配空间。

 

对于宽松源站选路:code=0x83   ;        严格选站则为 code=0x89

 

源站路由选项实际称呼为:源站及记录路由,这是因为数据报沿路由发送过程中,对IP地址清单进行了更新。下面为步骤:

1、  发送主机从应用程序接收源站路由清单,将第一个表项去掉(它是数据报的最终目的地址(注:这里的最终目的地址并非数据报最后一个地址,而是数据报下一个地址)),将剩余的项移到第一项中,并将原来的目的地址(这才是最后一个地址)作为清单的最后一项。而指针仍然指向清单第一项(即指针值为4)(结合下图,第一步指针已经指向R2了)

2、  每个处理数据报的路由器检查其是否为数据报的最终地址(注:…)。如果不是,则正常转发数据报(在这种情况下,必须制明宽松路由选站,否则不能接收到该数据报,因为宽松路由选站允许两站之间经过其他路由)

3、  如果该路由为最终目的(注:…),且指针不大于路径的长度,那么(1)由ptr所指定的清单中下一个地址就是数据报的最终目的地址(2)由外出接口相对应的IP地址取代刚才使用的源地址(3)指针加4

 

下面用实例解释上述过程:

 

 

我们假定主机S上的发送应用程)序发送一份数据报给D,指定源路由为R1, R2和R3,在传递过程中,长度字段恒为15(三个IP字段加上3个首部字节):

1、根据第一步,R1被去掉,R2取代其位置,指针指向R2,即值为4

2、到达R1,即最终路由,R2现在成了目的地址,路由外出接口相对应的IP地址R1取代刚才的源地址R2,指针指向R3,即加4

 

         当一个应用程序接收到由信源指定路由的数据时,在发送应答时,应当读出接收到的路由,并提供反向路由

        

宽松的路由选站实例:

         使用traceroute的-g选项,可以为宽松路由选站指明一些中间路由(可指定8个,最后一个规定为目的主机)

         这里给出书上的例子:

         先是用traceroute测试到达某目的主机的过程:

        

         然后是使用宽松路由得到的结果:

 

 

两者对比,我们发现其中的一些路由器丢失了。

 

书上还有部分关于路由选站,因为我好像看不懂,决定以后再看。。。

0 0
原创粉丝点击