投资理财产品的网站建设,手机上如何制作小程序,呢图网,网站开发维护公司经营范围7.1 引言
“ping”这个名字源于声纳定位操作。Ping程序由Mike Muuss编写#xff0c;目的是为了测试另一台主机是否可达。该程序发送一份ICMP回显请求报文给主机#xff0c;并等待返回ICMP回显应答#xff08;图6-3列出了所有的ICMP报文类型#xff09;。
一般来说#x…7.1 引言
“ping”这个名字源于声纳定位操作。Ping程序由Mike Muuss编写目的是为了测试另一台主机是否可达。该程序发送一份ICMP回显请求报文给主机并等待返回ICMP回显应答图6-3列出了所有的ICMP报文类型。
一般来说如果不能Ping到某台主机那么就不能Telnet或者FTP到那台主机。反过来如果不能Telnet到某台主机那么通常可以用Ping程序来确定问题出在哪里。Ping程序还能测出到这台主机的往返时间以表明该主机离我们有“多远”。
在本章中我们将使用Ping程序作为诊断工具来深入剖析ICMP。Ping还给我们提供了检测IP记录路由和时间戳选项的机会。文献[Stevens 1990]的第11章提供了Ping程序的源代码。
7.2 Ping程序
我们称发送回显请求的ping程序为客户而称被ping的主机为服务器。大多数的TCP/IP实现都在内核中直接支持Ping服务器—这种服务器不是一个用户进程在第6章中描述的两种ICMP查询服务地址掩码和时间戳请求也都是直接在内核中进行处理的。
ICMP回显请求和回显应答报文如图7-1所示。
对于其他类型的ICMP查询报文服务器必须响应标识符和序列号字段。另外客户发送的选项数据必须回显假设客户对这些信息都会感兴趣。
Unix系统在实现ping程序时是把ICMP报文中的标识符字段置成发送进程的ID号。这样即使在同一台主机上同时运行了多个ping程序实例ping程序也可以识别出返回的信息。
序列号从0开始每发送一次新的回显请求就加1。ping程序打印出返回的每个分组的序列号允许我们查看是否有分组丢失、失序或重复。IP是一种最好的数据报传递服务因此这三个条件都有可能发生。
旧版本的ping程序曾经以这种模式运行即每秒发送一个回显请求并打印出返回的每个回显应答。但是新版本的实现需要加上-s选项才能以这种模式运行。默认情况下新版本的ping程序只发送一个回显请求。如果收到回显应答则输出“host is alive”否则在20秒内没有收到应答就输出“no answer没有回答”。
7.2.1 LAN输出
在局域网上运行ping程序的结果输出一般有如下格式
当返回ICMP回显应答时要打印出序列号和TTL并计算往返时间TTL位于IP首部中的生存时间字段。当前的BSD系统中的ping程序每次收到回显应答时都打印出收到的TTL—有些系统并不这样做。我们将在第8章中通过traceroute程序来介绍TTL的用法。
从上面的输出中可以看出回显应答是以发送的次序返回的012等。
ping程序通过在ICMP报文数据中存放发送请求的时间值来计算往返时间。当应答返回时用当前时间减去存放在ICMP报文中的时间值即是往返时间。注意在发送端bsdi上往返时间的计算结果都为0 ms。这是因为程序使用的计时器分辨率低的原因。BSD/386版本0.9.4系统只能提供10 ms级的计时器在附录B中有更详细的介绍。在后面的章节中当我们在具有较高分辨率计时器的系统上Sun查看tcpdump输出时会发现ICMP回显请求和回显应答的时间差在4ms以下。
输出的第一行包括目的主机的IP地址尽管指定的是它的名字svr4。这说明名字已经经过解析器被转换成IP地址了。我们将在第14章介绍解析器和DNS。现在我们发现如果敲入ping命令几秒钟过后会在第1行打印出IP地址DNS就是利用这段时间来确定主机名所对应的IP地址。
本例中的tcpdump输出如图7-2所示。
从发送回显请求到收到回显应答时间间隔始终为3.7ms。还可以看到回显请求大约每隔1秒钟发送一次。
通常第1个往返时间值要比其他的大。这是由于目的端的硬件地址不在ARP高速缓存中的缘故。正如我们在第4章中看到的那样在发送第一个回显请求之前要发送一个ARP请求并接收ARP应答这需要花费几毫秒的时间。下面的例子说明了这一点
第1个RTT中多出的3ms很可能就是因为发送ARP请求和接收ARP应答所花费的时间。
这个例子运行在sun主机上它提供的是具有微秒级分辨率的计时器但是ping程序只能打印出毫秒级的往返时间。在前面运行于BSD/386 0.9.4版上的例子中打印出来的往返时间值为0 ms这是因为计时器只能提供10ms的误差。下面的例子是BSD/386 1.0版的输出它提供的计时器也具有微秒级的分辨率因此ping程序的输出结果也具有较高的分辨率。
7.2.2 WAN输出
在一个广域网上结果会有很大的不同。下面的例子是在某个工作日的下午即Internet具有正常通信量时的运行结果
这里序列号为1、2、3、4、6、10、11、12和13的回显请求或回显应答在某个地方丢失了。另外我们注意到往返时间发生了很大的变化像52%这样高的分组丢失率是不正常的。即使是在工作日的下午对于Internet来说也是不正常的。
通过广域网还有可能看到重复的分组即相同序列号的分组被打印两次或更多次失序的分组序列号为N1的分组在序列号为N的分组之前被打印。
7.2.3 线路SLIP链接
让我们再来看看SLIP链路上的往返时间因为它们经常运行于低速的异步方式如9600b/s或更低。回想我们在2.10节计算的串行线路吞吐量。针对这个例子我们把主机bsdi和slip之间的SLIP链路传输速率设置为1200 b/s。
下面我们可以来估计往返时间。首先从前面的Ping程序输出例子中可以注意到默认情况下发送的ICMP报文有56个字节。再加上20个字节的IP首部和8个字节的ICMP首部IP数据报的总长度为84字节我们可以运行tcpdump -e命令查看以太网数据帧来验证这一点。另外从2.4节可以知道至少要增加两个额外的字节在数据报的开始和结尾加上END字符。此外SLIP帧还有可能再增加一些字节但这取决于数据报中每个字节的值。对于1200 b/s这个速率来说由于每个字节含有8bit数据、1bit起始位和1bit结束位因此传输速率是每秒120个字节或者说每个字节8.33 ms。所以我们可以估计需要143386×8.33×2ms乘2是因为我们计算的是往返时间。
下面的输出证实了我们的计算
对于SVR4来说如果每秒钟发送一次请求则必须带-s选项。往返时间大约是1.5秒但是程序仍然每间隔1秒钟发送一次ICMP回显请求。这说明在第1个回显应答返回之前1.480秒时刻就已经发送了两次回显请求分别在0秒和1秒时刻。这就是为什么总结行指出丢失了一个分组。实际上分组并未丢失很可能仍然在返回的途中。
我们在第8章讨论traceroute程序时将回头再讨论这种低速的SLIP链路。
7.2.4 拨号SLIP链路
对于拔号SLIP链路来说情况有些变化因为在链路的两端增加了调制解调器。用在sun和netb系统之间的调制解调器提供的是V.32调制方式9600 b/s、V.42错误控制方式也称作LAP-M以及V.42bis数据压缩方式。这表明我们针对线路链路参数进行的简单计算不再准确了。
很多因素都有可能影响。调制解调器带来了时延。随着数据的压缩分组长度可能会减小但是由于使用了错误控制协议分组长度又可能会增加。另外接收端的调制解调器只能在验证了循环检验字符检验和后才能释放收到的数据。最后我们还要处理每一端的计算机异步串行接口许多操作系统只能在固定的时间间隔内或者收到若干字符后才去读这些接口。
作为一个例子我们在sun主机上ping主机gemini输出结果如下
注意第1个RTT不是10 ms的整数倍但是其他行都是10 ms的整数倍。如果我们运行该程序若干次发现每次结果都是这样这并不是由sun主机上的时钟分辨率造成的结果因为根据附录B中的测试结果可以知道它的时钟能提供毫秒级的分辨率。
另外还要注意第1个RTT要比其他的大而且依次递减然后徘徊在280300 ms之间。我们让它运行1~2分钟RTT一直处于这个范围不会低于260 ms。如果我们以9600 b/s的速率计算RTT习题7.2那么观察到的值应该大约是估计值的1.5倍。
如果运行ping程序60秒钟并计算观察到的RTT的平均值我们发现在V.42和V.42bis模式下平均值为277 ms这比上个例子打印出来的平均值要好因为运行时间较长这样就把开始较长的时间平摊了。如果我们关闭V.42bis数据压缩方式平均值为330 ms。如果我们关闭V.42错误控制方式它同时也关闭了V.42bis数据压缩方式平均值为300 ms。这些调制解调器的参数对RTT的影响很大使用错误控制和数据压缩方式似乎效果最好。
7.3 IP记录路由选项
ping程序为我们提供了查看IP记录路由RR选项的机会。大多数不同版本的ping程序都提供-R选项以提供记录路由的功能。它使得ping程序在发送出去的IP数据报中设置IP RR选项该IP数据报包含ICMP回显请求报文。这样每个处理该数据报的路由器都把它的IP地址放入选项字段中。当数据报到达目的端时IP地址清单应该复制到ICMP回显应答中这样返回途中所经过的路由器地址也被加入清单中。当ping程序收到回显应答时它就打印出这份IP地址清单。
这个过程听起来简单但存在一些缺陷。源端主机生成RR选项中间路由器对RR选项的处理以及把ICMP回显请求中的RR清单复制到ICMP回显应答中所有这些都是选项功能。幸运的是现在的大多数系统都支持这些选项功能只是有一些系统不把ICMP请求中的IP清单复制到ICMP应答中。
但是最大的问题是IP首部中只有有限的空间来存放IP地址。我们从图3-1可以看到IP首部中的首部长度字段只有4bit因此整个IP首部最长只能包括15个32 bit长的字即60个字节。由于IP首部固定长度为20字节RR选项用去3个字节下面我们再讨论这样只剩下37个字节60-20-3来存放IP地址清单也就是说只能存放9个IP地址。对于早期的ARPA NET来说9个IP地址似乎是很多了但是现在看来是非常有限的在第8章中我们将用Traceroute工具来确定数据报的路由。除了这些缺点记录路由选项工作得很好为详细查看如何处理IP选项提供了一个机会。
IP数据报中的RR选项的一般格式如图7-3所示。
code是一个字节指明IP选项的类型。对于RR选项来说它的值为7。len是RR选项总字节长度在这种情况下为39尽管可以为RR选项设置比最大长度小的长度但是ping程序总是提供39字节的选项字段最多可以记录9个IP地址。由于IP首部中留给选项的空间有限它一般情况都设置成最大长度。
ptr称作指针字段。它是一个基于1的指针指向存放下一个IP地址的位置。它的最小值为4指向存放第一个IP地址的位置。随着每个IP地址存入清单ptr的值分别为81216最大到36。当记录下9个IP地址后ptr的值为40表示清单已满。
当路由器根据定义应该是多穴的在清单中记录IP地址时它应该记录哪个地址呢是入口地址还是出口地址为此RFC 791[Postel 1981a]指定路由器记录出口IP地址。我们在后面将看到当原始主机运行ping程序的主机收到带有RR选项的ICMP回显应答时它也要把它的入口IP地址放入清单中。
7.3.1 通常的例子
我们举一个用RR选项运行ping程序的例子在主机svr4上运行ping程序到主机slip。一个中间路由器(bsdi)将处理这个数据报。下面是svr4的输出结果
分组所经过的四站如图7-4所示每个方向各有两站每一站都把自己的IP地址加入RR清单。
路由器bsdi在不同方向上分别加入了不同的IP地址。它始终是把出口的IP地址加入清单。我们还可以看到当ICMP回显应答到达原始系统svr4时它把自己的入口IP地址也加入清单中。
还可以通过运行带有-v选项的tcpdump命令来查看主机sun上进行的分组交换参见IP选项。输出如图7-5所示。
输出中optlen40表示在IP首部中有40个字节的选项空间IP首部长度必须为4字节的整数倍。RR{39}的意思是记录路由选项已被设置它的长度字段是39。然后是9个IP地址符号“#”用来标记RR选项中的ptr字段所指向的IP地址。由于我们是在主机sun上观察这些分组参见图7-4因此所能看到ICMP回显请求中的IP地址清单是空的而ICMP回显应答中有3个IP地址。我们省略了tcpdump输出中的其他行因为它们与图7-5基本一致。
位于路由信息末尾的标记EOL表示IP选项“end of list清单结束”的值。EOL选项的值可以为0。这时表示39个字节的RR数据位于IP首部中的40字节空间中。由于在数据报发送之前空间选项被设置为0因此跟在39个字节的RR数据之后的0字符就被解释为EOL。这正是我们所希望的结果。如果在IP首部中的选项字段中有多个选项在开始下一个选项之前必须填入空白字符另外还可以用另一个值为1的特殊字符NOP“no operation”。
7.3.2 异常的输出
下面的例子是作者观察到的把它作为第9章讨论ICMP间接报文的起点。在子网140.252.1上ping主机aix在主机sun上通过拨号SLIP连接可以访问并带有记录路由选项。在slip主机上运行有如下输出结果
我们已经在主机bsdi上运行过这个例子。现在选择slip来运行它观察RR清单中所有的9个IP地址。
在输出中令人感到疑惑的是为什么传出的数据报ICMP回显请求直接从netb传到aix而返回的数据报ICMP回显应答却从aix开始经路由器gateway再到netb这里看到的正是下面将要描述的IP选路的一个特点。数据报经过的路由如图7-6所示。
问题是aix不知道要把目的地为子网140.252.13的IP数据报发到主机netb上。相反aix在它的路由表中有一个默认项它指明当没有明确某个目的主机的路由时就把所有的数据报发往默认项指定的路由器gateway。路由器gateway比子网140.252.1上的任何主机都具备更强的选路能力在这个以太网上有超过150台主机每台主机的路由表中都有一个默认项指向路由器gateway这样就不用在每台主机上都运行一个选路守护程序。
这里没有应答的一个问题是为什么gateway不直接发送ICMP报文重定向到aix9.5节以更新它的路由表由于某种原因很可能是由于数据报产生的重定向是一份ICMP回显请求报文重定向并没有产生。但是如果我们用Telnet登录到aix上的daytime服务器ICMP就会产生重定向因而它在aix上的路由表也随之更新。如果接着执行ping程序并带有记录路由选项其路由显示表明数据报从netb到aix然后返回netb而不再经过路由器gateway。在9.5节中将更详细地讨论ICMP重定向的问题。
7.4 IP时间戳选项
IP时间戳选项与记录路由选项类似。IP时间戳选项的格式如图7-7所示请与图7-3进行比较。
时间戳选项的代码为0x44。其他两个字段len和ptr与记录路由选项相同选项的总长度一般为36或40和指向下一个可用空间的指针5913等。
接下来的两个字段是4bit的值OF表示溢出字段FL表示标志字段。时间戳选项的操作根据标志字段来进行如图7-8所示。
如果路由器由于没有空间而不能增加时间戳选项那么它将增加溢出字段的值。
时间戳的取值一般为自UTC午夜开始计的毫秒数与ICMP时间戳请求和应答相类似。如果路由器不使用这种格式它就可以插入任何它使用的时间表示格式但是必须打开时间戳中的高位以表明为非标准值。
与我们遇到的记录路由选项所受到的限制相比时间戳选项遇到情况要更坏一些。如果我们要同时记录IP地址和时间戳标志位为1那么就可以同时存入其中的四对值。只记录时间戳是没有用处的因为我们没有标明时间戳与路由器之间的对应关系除非有一个永远不变的拓扑结构。标志值取3会更好一些因为我们可以插入时间戳的路由器。一个更为基本的问题是很可能无法控制任何给定路由器上时间戳的正确性。这使得试图用IP选项来计算路由器之间的跳站数是徒劳的。我们将看到第8章traceroute程序可以提供一种更好的方法来计算路由器之间的跳站数。
7.5 小结
ping程序是对两个TCP/IP系统连通性进行测试的基本工具。它只利用ICMP回显请求和回显应答报文而不用经过传输层TCP/UDP。Ping服务器一般在内核中实现ICMP的功能。
我们分析了在LAN、WAN以及SLIP链路拨号和线路上运行ping程序的输出结果并对串行线路上的SLIP链路吞吐量进行了计算。我们还讨论并使用了ping程序的IP记录路由选项。利用该IP选项可以看到它是如何频繁使用默认路由的。在第9章我们将再次回到这个讨论主题。另外还讨论了IP时间戳选项但它在实际使用时有所限制。