速读原著-TCP/IP(局域网输出)

2020-03-06 18:12:09 浏览数 (1)

第8章 Traceroute程序

8.3 局域网输出

现在已经做好运行 Tr a c e r o u t e程序并观察其输出的准备了。我们将使用从 s v r 4到s l i p,经路由器b s d i的简单互联网(见内封面)。b s d i和s l i p之间是9600 b/s的S L I P链路。

输出的第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结果证实了确实是这种情况。

目的主机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“超时”报文(见6 . 2节的图6 - 3),它们的I C M P报文中c o d e字段不同。图8 - 2给出了这种I C M P差错报文的格式。

我们所讨论的I C M P报文是在T T L值等于0时产生的,其c o d e字段为0。主机在组装分片时可能发生超时,这时,它将发送一份“组装报文超时”的 I C M P报文(我们将在11 . 5节讨论分片和组装)。这种差错报文将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帧(2 . 4节)。但是与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记录路由选项( 7 . 3节)不同,记录的 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有着同样的网络号,而另两个接口则有着不同的网络号。

最后,在广域网情况下,如果 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地址的情况下,它做一个“反向域名查看”工作来获得域名。这就需要路由器或主机的管理员正确配置其反向域名查看功能(并非所有的情况下都是如此)。我们将在1 4 . 5节描述如何使用D N S将一个I P地址转换成域名。

0 人点赞