ping命令,相信接触linux的同仁,都不陌生,但你又知道ping命令的整体能力吗?linux下man ping可窥一斑,来让我们重新认识下。
man ping
命令描述DESCRIPTION
ping使用ICMP协议的ECHO_REQUEST从主机或网关获取ECHO_RESPONSE。ECHO_REQUEST数据报文(pings)包括IP和ICMP报头,struct timeval,以及任意数量的用于填充数据包的pad字节。
使用ping进行故障隔离时,最好先在本地主机上运行它,验证本地网卡是否已启动并运行,然后ping其它的主机和网关。ping命令会计算icmp包的往返时间和丢包统计信息。如果接收到重复的数据包,它们不包含在丢包计算中,尽管重复数据包的往返时间用于计算最小/平均/最大往返时间。发送(接收)指定数量的数据包或用SIGINT终止程序时,将显示简短摘要。
假设ping没有收到任何,响应的数据包并以退出码1退出。假如数据包个数和deadline time是明确的,在deadline来临时收到少量包,ping也将以退出码1退出。其它错误将以退出码2退出。其它情况将以退出码0退出。可以通过退出码来判断某台主机是否正常。
该程序旨在用于网络测试,网络测量和网络管理。因为ping的负载可能会施加在网络上,因此在正常操作或自动化脚本中使用ping是不明智的。
ICMP PACKET DETAILS
不带选项的IP标头为20个字节。ICMP ECHO_REQUEST数据包包含额外的8个字节的ICMP标头,后跟任意数量的数据。当数据包大小给定时,表示该额外数据的大小(默认值为56)。因此,在ICMP ECHO_REPLY类型的IP数据包内部接收到的数据量将始终比请求的数据空间(ICMP头)多8个字节。
如果数据空间至少为struct timeval大小,ping将使用此空间的起始字节来包含时间戳记,以用于往返时间的计算。如果数据空间较短,则不会给出往返时间。
重复和损坏的包装
ping将报告重复和损坏的数据包。重复的数据包永远不会出现,并且似乎是由不适当的链路级重传引起的。在许多情况下可能会出现重复,但很少(如果有的话)是一个好兆头,尽管重复水平较低的情况可能并不总是会引起警报。
损坏的数据包显然是引起警报的严重原因,并且通常表明ping数据包路径中某处(网络或主机中)的硬件损坏。
尝试不同的数据模式
网络层决不应根据数据部分中包含的数据对数据包进行不同的处理。不幸的是,已知与数据有关的问题会潜入网络,并且很长一段时间都不会被发现。在许多情况下,会出现问题的特定模式是没有足够的``过渡''的东西,例如全1或全零,或者在边缘的模式(例如几乎全零)。在命令行上指定全零的数据模式并不一定足够,因为感兴趣的模式在数据链接级别,并且您键入的内容与控制器传输的内容之间的关系可以是复杂。
这意味着,如果您遇到与数据相关的问题,则可能必须进行大量测试才能找到它。如果幸运的话,您可能会设法找到一个文件,该文件要么无法通过网络发送,要么需要比其他类似长度的文件传输更长的时间。然后,您可以检查该文件中是否存在重复的模式,可以使用ping的-p选项进行测试。
BUG故障
·许多主机和网关都忽略RECORD_ROUTE选项。
·最大IP标头长度太小,无法完全使用RECORD_ROUTE之类的选项。但是,对此没有太多可以做的。
·通常不建议进行泛洪ping操作,并且仅应在非常受控的条件下对广播地址进行泛洪ping操作。
安全
ping需要执行CAP_NET_RAW功能。它可以用作set-uid根。
可用性
ping是iputils软件包的一部分,最新版本以源代码形式提供,网址为http://www.skbuff.net/iputils/iputils-current.tar.bz2。
ping命令检测包延迟还有丢包和包延迟抖动分析
root@docker:~# ping 192.168.226.1
PING 192.168.226.1 (192.168.226.1) 56(84) bytes of data.
64 bytes from 192.168.226.1: icmp_seq=1 ttl=128 time=1.23 ms
64 bytes from 192.168.226.1: icmp_seq=2 ttl=128time=0.902 ms
64 bytes from 192.168.226.1: icmp_seq=3 ttl=128time=0.810 ms
64 bytes from 192.168.226.1: icmp_seq=4 ttl=128time=0.669 ms
64 bytes from 192.168.226.1: icmp_seq=5 ttl=128time=0.650 ms
64 bytes from 192.168.226.1: icmp_seq=6 ttl=128time=15.8 ms
64 bytes from 192.168.226.1: icmp_seq=7 ttl=128time=0.779 ms
64 bytes from 192.168.226.1: icmp_seq=8 ttl=128time=0.683 ms
--- 192.168.226.1 ping statistics ---
8 packets transmitted, 8 received,0% packet loss,time 7008ms
rtt min/avg/max/mdev = 0.650/2.692/15.809/4.960 ms
ping返回time=15.8 ms 意味着某个包延迟 15.8ms。
min/avg/max/mdev = 0.650/2.692/15.809/4.960 ms,从整体结果来看,包延迟不稳,在一定范围内,max代表最大延迟15.8094ms,min代表最小延迟0.650ms,avg代表平均延迟2.692ms也就是包延迟,min-avg和max-avg为包延迟抖动范围-2.042ms到+13.1174ms。至于mdev,是 Mean Deviation 的缩写,表示这些 ICMP 包的 RTT 偏离平均值的程度,这个值越大说明你的网速越不稳。
0% packet loss 意味着有0%的机率出现丢包,当然这个只是限于本次ping的操作,可能下次ping就不是0%,所以这个参数只是ping的这段时间内没有丢包,不能说没有丢包的可能,具体见netstat -s对各个协议报文的统计可以知道是否丢包。
检查网络上的MTU值
以太网(Ethernet)数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的。这个1500字节被称为链路层的MTU(最大传输单元)。因特网协议允许IP分片,这样就可以将数据包分成足够小的片段以通过那些最大传输单元小于该数据包原始大小的链路了。这一分片过程发生在网络层,它使用的是将分组发送到链路上的网络接口的最大传输单元的值。这个最大传输单元的值就是MTU(Maximum Transmission Unit)。它是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。最大传输单元这个参数通常与通信接口有关(网络接口卡、串口等)。