TCP/IP详解卷1 读书笔记:第八章 Traceroute程序

来源:互联网 发布:新西兰生活 知乎 编辑:程序博客网 时间:2024/05/14 15:30

 Tracerote程序的操作

Tr a c e r o u t e程序只需要目的端运行一个U D P模块,其他不需要任何特殊的服务器应用程序。(实际实现中,服务端只要运行TCP/IP协议栈即可,并不需要任何其他的附加程序。而发送端,只是运行Traceroute的客户端)

Tr a c e r o u t e程序使用I C M P报文和I P首部中的T T L字段(生存周期)。 T T L字段是由发送端初始设置一个 8 bit字段。T T L字段的目的是防止数据报在选路时无休止地在网络中流动。

当路由器收到一份I P数据报,如果其T T L字段是0或1,路由器将该数据报丢弃,并给信源机发一份I C M P“超时”信息。 Tr a c e r o u t e程序的关键在于包含这份 I C M P信息的I P报文的信源地址是该路由器的I P地址。

 原理

(1)      Tr a c e r o u t e程序发送一份 T T L字段为1的I P数据报给目的主机。处理这份数据报的第一个路由器将 T T L值减1,丢弃该数据报,并发回一份超时I C M P报文。这样就得到了该路径中的第一个路由器的地址。

(2)      Tr a c e r o u t e程序发送一份T T L值为2的数据报,这样我们就可以得到第二个路由器的地址。

(3)      继续这个过程直至该数据报到达目的主机。但是目的主机哪怕接收到 T T L值为1的I P数据报,也不会丢弃该数据报并产生一份超时I C M P报文,这是因为数据报已经到达其最终目的地。那么我们该如何判断是否已经到达目的主机了呢?

(4)      Tr a c e r o u t e程序发送一份 U D P数据报给目的主机,但它选择一个不可能的值作为 U D P端口号(大于 30 000),使目的主机的任何一个应用程序都不可能使用该端口。因为,当该数据报到达时,将使目的主机的 U D P模块产生一份“端口不可达”错误(见 6 . 5节)的 I C M P报文。这样, Tr a c e r o u t e程序所要做的就是区分接收到的 I C M P报文是超时还是端口不可达,以判断什么时候结束。

 示例:

Traceroute在Linux是该命令,在Windows上叫tracert。(Ping也可以通过选项来记录报文的路由,但最多只能记录9个地址。)

实现原理是依次发送UDP数据包来试探,每次数据包的TTL值递增1.由1开始。

如网络路由为: A àBàCàD

现要打印由A到D的路径,Trace route的实现原理为:

1.      A发送第一个UDP试探包,其中设置IP头部中的TTL值为1,(即只能转发一次),这样B收到数据包后,发现目的地址不是自己的IP,但TTL值递减为0了,不再继续转发。于是这时B向A发送了一个ICMP差错报文,告诉A地址不可达,因为TTL为0了。ICMP报文的组装包手是由收到数据包的IP首部和IP数据部分的前8个字节(即TCP或UDP的源目端口号),这样数据的发送方A(即发送第一个UDP报文的一方)在收到了ICMP差错报文后,提交给上层应用(通过端口号),然后将发送该ICMP差错报文的地址打印出来,这就得到了第一跳的路由节点。

2.      A收到B节点发来的ICMP差错报文(地址不可达,TTL值为0了),应用程序会发送第2个UDP试探包,同时设置该包的IP头部中的TTL值为2. 该包路由到B节点后,B发现该包的目的地址不是自己的IP,于是B递减了IP包头中的TTL值后,发现TTL值为1,还可以继续转发,于是B将该包转给了C。C节点收到该包后,比较了目的IP地址,发现该目的IP不是自己,于是递减了IP包头中的TTL,准备将该包继续转发,但这时发现TTL值已经为0,不能再转发了,于是C也组装一个ICMP差错报文给该数据的源地址A(数据内容的组装同1中所述)。A收到C节点的ICMP报文后,处理也同1中所述。

3.      A继续递增TTL值,并发UDP试探包。

4.      当转发到目的节点D后,D收到该包发现目的地址就是自己,于是解包并根据UDP包头中的端口号将数据提交给上层应用,但由于该端口对应的进程并不存在,因此,D最终发送给A一个端口不可达的ICMP差错报文。A收到该端口不可达报文文,得知数据报已到达目的地。

 

打印输出 


对于每个T T L值,发送3份数据报。每接收到一份IC M P报文,就计算并打印出往返时间。如果在 5秒种内仍未收到3份数据报的任意一份的响应,则打印一个星号,并发送下一份数据报。同时,输出该数据报的往返时间(该往返时间是由traceroute程序计算出来的)。

 

其它事项

首先,并不能保证现在的路由也是将来所要采用的路由,甚至两份连续的 I P数据报都可能采用不同的路由。如果在运行程序时,路由发生改变,就会观察到这种变化,这是因为对于一个给定的 T T L,如果其路由发生变化,t r a c e r o u t e程序将打印出新的I P地址。

第二,不能保证 I C MP报文的路由与 t r a c e r o u t e程序发送的U D P数据报采用同一路由。这表明所打印出来的往返时间可能并不能真正体现数据报发出和返回的时间差(如果 U D P数据报从信源到路由器的时间是 1秒,而I C M P报文用另一条路由返回信源用了 3秒时间,则打印出来的往返时间是4秒)。

第三,返回的 I C MP报文中的信源 I P地址是U D P数据报到达的路由器接口的 I P地址。

 

左侧(网络1)主机运行traceroute(到右侧网络主机)打印出的路径是:if1、if3

右侧(网络3)主机运行traceroute(到左侧网络主机)打印出的路径是:if4、if2

 

抓包

如图1中(tracertwww.baidu.com)中的路径,这里我们tracert到221.131.253.81,进行抓包。


0 0
原创粉丝点击