现在已经做好运行Traceroute程序并观察其输出的预备了。我们将使用从svr4到slip,经路由器bsdi的简单互联网。bsdi和slip之间是9600b/s的SLIP链路。
输出的第1个无标号行给出了目的主机名和其I P地址,指出t r a c e r o u t e程序最大的T T L字段值为3 0。4 0字节的数据报包含2 0字节I P首部、8字节的U D P首部和1 2字节的用户数据(1 2字节的用户数据包含每发一个数据报就加1的序列号,送出T T L的副本以及发送数据报的时间)。
输出的后面两行以T T L开始,接下来是主机或路由器名以及其I P地址。对于每个T T L值,发送3份数据报。每接收到一份I C M P报文,就计算并打印出往返时间。假如在5秒种内仍未收到3 份数据报的任意一份的响应,则打印一个星号,并发送下一份数据报。在上述输出结果中,T T L字段为1的前3份数据报的I C M P报文分别在20 ms、10 ms和10 ms收到。T T L字段为2的3份数据报的I C M P报文则在120 ms后收到。由于T T L字段为2到达最终目的主机,因此程序就此停止。
往返时间是由发送主机的t r a c e r o u t e程序计算的。它是指从t r a c e r o u t e程序到该路由器的总往返时间。假如我们对每段路径的时间感爱好,可以用T T L字段为N + 1所打印出来的时间减去T T L字段为N的时间。
图8 - 1给出了t c p d u m p的运行输出结果。正如我们所预想的那样,第1个发往b s d i的探测数据报的往返时间是20 ms 、而后面两个数据报往返时间是10 ms 的原因是发生了一次A R P交换。t c p d u m p结果证实了确实是这种情况。
图8-1 从svr4到slip的traceroute程序示例的tcpdump输出结果
目的主机U D P端口号最开始设置为3 3 4 3 5,且每发送一个数据报加1。可以通过命令行选项来改变开始的端口号。U D P数据报包含1 2个字节的用户数据,我们在前面t r a c e r o u t e程序输出的4 0字节数据报中已经对其进行了描述。
后面t c p d u m p打印出了T T L字段为1的I P数据报的注释[ttl 1]。当T T L值为0或1时,t c p d u m p打印出这条信息,以提示我们数据报中有些不太平常之处。在这里可以预见到T T L 值为1;而在其他一些应用程序中,它可以警告我们数据报可能无法到达其最终目的主机。我们不可能看到路由器传送一个T T L值为0的数据报,除非发出该数据报的该路由器已经崩溃。
因为b s d i路由器将T T L值减到0,因此我们预计它将发回“传送超时”的I C M P报文。即使这份被丢弃的I P报文发送往s l i p,路由器也会发回I C M P报文。有两种不同的I C M P“超时”报文,它们的I C M P报文中c o d e字段不同。图8 - 2给出了这种I C M P差错报文的格式。
图8-2 ICMP超时报文
我们所讨论的I C M P报文是在T T L值等于0时产生的,其c o d e字段为0。主机在组装分片时可能发生超时,这时,它将发送一份“组装报文超时”的I C M P报文。这种差错报文将c o d e字段置1。图8 - 1的第9 ~ 1 4行对应于T T L为2的3份数据报。这3份报文到达最终目的主机,并产生一份I C M P端口不可达报文。计算出S L I P链路的往返时间是很有意义的,就象我们在7 . 2节中所举的P i n g例子,将链路值设置为1 2 0 0 b / s一样。发送出的U D P数据报共4 2个字节,包括1 2字节的数据、8字节U D P首部、2 0字节的I P首部以及(至少)2字节的S L I P帧。但是与P i n g不一样的是,返回的数据报大小是变化的。从图6 - 9可以看出,返回的I C M P报文包含发生差错的数据报的I P首部以及紧随该I P首部的8字节数据(在t r a c e r o u t e程序中,即U D P首部)。这样,总共就是2 0 + 8 + 20 + 8 + 2,即5 8字节。在数据速率为960 b/s的情况下,预计的RT T 就是(42 + 58/960), 即104 ms。这个值与s v r 4上所估算出来的110 ms 是吻合的。
图8 - 1中的源端口号(4 2 8 0 4)看起来有些大。t r a c e r o u t e程序将其发送的U D P数据报的源端口号设置为U n i x进程号与3 2 7 6 8 之间的逻辑或值。对于在同一台主机上多次运行t r a c e r o u t e程序的情况,每个进程都查看I C M P返回的U D P首部的源端口号,并且只处理那些对自己发送应答的报文。
关于t r a c e r o u t e程序,还有一些必须指出的事项。首先,并不能保证现在的路由也是将来所要采用的路由,甚至两份连续的I P数据报都可能采用不同的路由。假如在运行程序时,路由发生改变,就会观察到这种变化,这是因为对于一个给定的T T L,假如其路由发生变化,t r a c e r o u t e程序将打印出新的I P地址。
第二,不能保证I C M P报文的路由与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 M P报文中的信源I P地址是U D P数据报到达的路由器接口的I P地址。这与I P记录路由选项不同,记录的I P地址指的是发送接口地址。由于每个定义的路由器都有2个或更多的接口,因此,从A主机到B主机上运行t r a c e r o u t e程序和从B主机到A主机上运行t r a c e r o u t e程序所得到的结果可能是不同的。事实上,假如我们从s l i p主机到s v r 4上运行t r a c e r o u t e程序,其输出结果变成了:
这次打印出来的b s d i主机的I P地址是1 4 0 . 2 5 2 . 1 3 . 6 6,对应于S L I P接口;而上次的地址是1 4 0 . 2 5 2 . 1 3 . 3 5,是以太网接口地址。由于t r a c e r o u t e程序同时也打印出与I P地址相关的主机名,因而主机名也可能变化(在我们的例子中,b s d i上的两个接口都采用相同的名字)。
考虑图8 - 3的情况。它给出了两个局域网通过一个路由器相连的情况。两个路由器通过一个点对点的链路相连。假如我们在左边L A N的一个主机上运行t r a c e r o u t e程序,那么它将发现路由器的I P地址为i f 1和i f 3。但在另一种情况下,就会发现打印出来的I P地址为i f 4和i f 2。i f 2和i f 3有着同样的网络号,而另两个接口则有着不同的网络号。
图8-3 t r a c e r o u t e 程序打印出的接口标识
最后,在广域网情况下,假如t r a c e r o u t e程序的输出是可读的域名形式,而不是I P地址形式,那么会更好理解一些。但是由于t r a c e r o u t e程序接收到I C M P报文时,它所获得的唯一信息就是I P地址,因此,在给定I P地址的情况下,它做一个“反向域名查看”工作来获得域名。这就需要路由器或主机的治理员正确配置其反向域名查看功能(并非所有的情况下都是如此)。我们将在后面描述如何使用D N S将一个I P地址转换成域名。