《TCPIP详解-卷一-协议-72Ping程序.docx》由会员分享,可在线阅读,更多相关《TCPIP详解-卷一-协议-72Ping程序.docx(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、7.2Ping程序我们称发送回显请求的ping程序为客户,而称被ping的主机为服务器。大多数的TCP/IP实现都在内核中直接支持Ping服务器这种服务器不是一个用户进程(在第6章中描述的两种ICMP查询服务,地址掩码和时间戳请求,也都是直接在内核中进行处理的)。ICMP回显请求和回显应答报文如图7-1所示。类型(0或8)代码(0)标识符选项数据检验和序号8字节图7-1ICMP回显请求和回显应答报文格式对于其他类型的ICMP查询报文,服务器必须响应标识符和序列号字段。另外,客户发送的选项数据必须回显,假设客户对这些信息都会感兴趣。Unix系统在实现ping程序时是把ICMP报文中的标识符字段置
2、成发送进程的ID号。这样即使在同一台主机上同时运行了多个ping程序实例,ping程序也可以识别出返回的信息。序列号从0开始,每发送一次新的回显请求就加1。ping程序打印出返回的每个分组的序列号,允许我们查看是否有分组丢失、失序或重复。IP是一种最好的数据报传递服务,因此这三个条件都有可能发生。旧版本的ping程序曾经以这种模式运行,即每秒发送一个回显请求,并打印出返回的每个回显应答。但是,新版本的实现需要加上-s选项才能以这种模式运行。默认情况下,新版本的ping程序只发送一个回显请求。如果收到回显应答,则输出“hostisalive”;否则,在20秒内没有收到应答就输出“noanswer
3、(没有回答)”。7.2.1LAN输出在局域网上运行ping程序的结果输出一般有如下格式:键入中断键来停止显示当返回ICMP回显应答时,要打印出序列号和TTL,并计算往返时间(TTL位于IP首部中的生存时间字段。当前的BSD系统中的ping程序每次收到回显应答时都打印出收到的TTL有些系统并不这样做。我们将在第8章中通过traceroute程序来介绍TTL的用法)。从上面的输出中可以看出,回显应答是以发送的次序返回的(0,1,2等)。ping程序通过在ICMP报文数据中存放发送请求的时间值来计算往返时间。当应答返回时,用当前时间减去存放在ICMP报文中的时间值,即是往返时间。注意,在发送端bsd
4、i上,往返时间的计算结果都为0ms。这是因为程序使用的计时器分辨率低的原因。BSD/386版本0.9.4系统只能提供10ms级的计时器(在附录B中有更详细的介绍)。在后面的章节中,当我们在具有较高分辨率计时器的系统上(Sun)查看tcpdump输出时会发现,ICMP回显请求和回显应答的时间差在4ms以下。输出的第一行包括目的主机的IP地址,尽管指定的是它的名字(svr4)。这说明名字已经经过解析器被转换成IP地址了。我们将在第14章介绍解析器和DNS。现在,我们发现,如果敲入ping命令,几秒钟过后会在第1行打印出IP地址,DNS就是利用这段时间来确定主机名所对应的IP地址。本例中的tcpdu
5、mp输出如图7-2所示。从发送回显请求到收到回显应答,时间间隔始终为3.7ms。还可以看到,回显请求大约每隔1秒钟发送一次。通常,第1个往返时间值要比其他的大。这是由于目的端的硬件地址不在ARP高速缓存中图7-2在LAN上运行ping程序的结果的缘故。正如我们在第4章中看到的那样,在发送第一个回显请求之前要发送一个ARP请求并接收ARP应答,这需要花费几毫秒的时间。下面的例子说明了这一点:保证ARP高速缓存是空的键入中断键来停止显示第1个RTT中多出的3ms很可能就是因为发送ARP请求和接收ARP应答所花费的时间。这个例子运行在sun主机上,它提供的是具有微秒级分辨率的计时器,但是ping程序
6、只能打印出毫秒级的往返时间。在前面运行于BSD/3860.9.4版上的例子中,打印出来的往返时间值为0ms,这是因为计时器只能提供10ms的误差。下面的例子是BSD/3861.0版的输出,它提供的计时器也具有微秒级的分辨率,因此,ping程序的输出结果也具有较高的分辨率。键入中断键来停止显示7.2.2WAN输出在一个广域网上,结果会有很大的不同。下面的例子是在某个工作日的下午即Internet具有正常通信量时的运行结果:键入中断来停止显示这里,序列号为1、2、3、4、6、10、11、12和13的回显请求或回显应答在某个地方丢失了。另外,我们注意到往返时间发生了很大的变化(像52%这样高的分组丢
7、失率是不正常的。即使是在工作日的下午,对于Internet来说也是不正常的)。通过广域网还有可能看到重复的分组(即相同序列号的分组被打印两次或更多次),失序的分组(序列号为N+1的分组在序列号为N的分组之前被打印)。7.2.3线路SLIP链接让我们再来看看SLIP链路上的往返时间,因为它们经常运行于低速的异步方式,如9600b/s或更低。回想我们在2.10节计算的串行线路吞吐量。针对这个例子,我们把主机bsdi和slip之间的SLIP链路传输速率设置为1200b/s。下面我们可以来估计往返时间。首先,从前面的Ping程序输出例子中可以注意到,默认情况下发送的ICMP报文有56个字节。再加上20
8、个字节的IP首部和8个字节的ICMP首部,IP数据报的总长度为84字节(我们可以运行tcpdump-e命令查看以太网数据帧来验证这一点)。另外,从2.4节可以知道,至少要增加两个额外的字节:在数据报的开始和结尾加上END字符。此外,SLIP帧还有可能再增加一些字节,但这取决于数据报中每个字节的值。对于1200b/s这个速率来说,由于每个字节含有8bit数据、1bit起始位和1bit结束位,因此传输速率是每秒120个字节,或者说每个字节8.33ms。所以我们可以估计需要1433(868.332)ms(乘2是因为我们计算的是往返时间)。下面的输出证实了我们的计算:(对于SVR4来说,如果每秒钟发送
9、一次请求则必须带-s选项)。往返时间大约是1.5秒,但是程序仍然每间隔1秒钟发送一次ICMP回显请求。这说明在第1个回显应答返回之前(1.480秒时刻)就已经发送了两次回显请求(分别在0秒和1秒时刻)。这就是为什么总结行指出丢失了一个分组。实际上分组并未丢失,很可能仍然在返回的途中。我们在第8章讨论traceroute程序时将回头再讨论这种低速的SLIP链路。7.2.4拨号SLIP链路对于拔号SLIP链路来说,情况有些变化,因为在链路的两端增加了调制解调器。用在sun和netb系统之间的调制解调器提供的是V.32调制方式(9600b/s)、V.42错误控制方式(也称作LAP-M)以及V.42b
10、is数据压缩方式。这表明我们针对线路链路参数进行的简单计算不再准确了。很多因素都有可能影响。调制解调器带来了时延。随着数据的压缩,分组长度可能会减小,但是由于使用了错误控制协议,分组长度又可能会增加。另外,接收端的调制解调器只能在验证了循环检验字符(检验和)后才能释放收到的数据。最后,我们还要处理每一端的计算机异步串行接口,许多操作系统只能在固定的时间间隔内,或者收到若干字符后才去读这些接口。作为一个例子,我们在sun主机上ping主机gemini,输出结果如下:注意,第1个RTT不是10ms的整数倍,但是其他行都是10ms的整数倍。如果我们运行该程序若干次,发现每次结果都是这样(这并不是由s
11、un主机上的时钟分辨率造成的结果,因为根据附录B中的测试结果可以知道它的时钟能提供毫秒级的分辨率)。另外还要注意,第1个RTT要比其他的大,而且依次递减,然后徘徊在280300ms之间。我们让它运行12分钟,RTT一直处于这个范围,不会低于260ms。如果我们以9600b/s的速率计算RTT(习题7.2),那么观察到的值应该大约是估计值的1.5倍。如果运行ping程序60秒钟并计算观察到的RTT的平均值,我们发现在V.42和V.42bis模式下平均值为277ms(这比上个例子打印出来的平均值要好,因为运行时间较长,这样就把开始较长的时间平摊了)。如果我们关闭V.42bis数据压缩方式,平均值为330ms。如果我们关闭V.42错误控制方式(它同时也关闭了V.42bis数据压缩方式),平均值为300ms。这些调制解调器的参数对RTT的影响很大,使用错误控制和数据压缩方式似乎效果最好。