Linux系统的ping命令是常用的网络命令,它通常用来测试与目标主机的连通性,我们经常会说“ping一下某机器,看是不是开着”、不能打开网页时会说“你先ping网关地址192.168.1.1试试”。它通过发送ICMP ECHO_REQUEST数据包到网络主机(send ICMP ECHO_REQUEST to network hosts),并显示响应情况,这样我们就可以根据它输出的信息来确定目标主机是否可访问(但这不是绝对的)。有些服务器为了防止通过ping探测到,通过防火墙设置了禁止ping或者在内核参数中禁止ping,这样就不能通过ping确定该主机是否还处于开启状态。
linux下的ping和windows下的ping稍有区别。linux下ping不会自动终止,需要按ctrl+c终止或者用参数-c指定要求完成的回应次数。
ping命令用于:确定网络和各外部主机的状态;跟踪和隔离硬件和软件问题;测试、评估和管理网络。如果主机正在运行并连在网上,它就对回送信号进行响应。每个回送信号请求包含一个网际协议(IP)和 ICMP 头,后面紧跟一个 tim 结构,以及来填写这个信息包的足够的字节。缺省情况是连续发送回送信号请求直到接收到中断信号(Ctrl-C)。
ping 命令每秒发送一个数据报并且为每个接收到的响应打印一行输出。ping 命令计算信号往返时间和(信息)包丢失情况的统计信息,并且在完成之后显示一个简要总结。ping 命令在程序超时或当接收到 SIGINT 信号时结束。Host 参数或者是一个有效的主机名或者是因特网地址。
ping [参数] [主机名或IP地址]
ping命令运行在命令提示符终端,用法为:“ping 参数 目标主机”。其中参数为零到多个,目标主机可以是IP或者域名。
Usage: ping [-aAbBdDfhLnOqrRUvV] [-c count] [-i interval] [-I interface]
[-m mark] [-M pmtudisc_option] [-l preload] [-p pattern] [-Q tos]
[-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp_option]
[-w deadline] [-W timeout] [hop1 ...] destination
参数 |
功能 |
-a |
Audible ping, 即每ping一次都会有声音提示。 |
-A |
自适应ping,根据ping包往返时间确定ping的速度。 |
-b |
允许ping一个广播地址。 |
-B |
不允许ping改变包头的源地址。 |
-c count |
ping指定次数后停止ping。 |
-d |
设置socket中的SO_DEBUG选项,使能调试跟踪。实质上Linux内核中没有使用这个套接字选项。 |
-F flow_label |
为ping回显请求分配一个20位的“flow label”,如果未设置,内核会为ping随机分配。这个选项只有ping6才有。 |
-f |
洪泛模式。极限检测,快速连续ping一台主机,ping的速度达到100次每秒。对每一个ECHO_REQUEST报文的发送,打印一个“.”,当接受到ECHO_REPLY报文时,打印一个backspace字符。这样能够快速地表明网络丢失了多少个报文。如果interval没有设置,则设置interval为0,并按照报文接受的速度和一百次每秒的速度来发送报文(看哪个速度快)。只有超级用户能够和-i 0选项一起使用这个选项。 |
-i interval |
设定间隔几秒发送一个ping包,默认一秒ping一次。 |
-I interface |
指定网卡接口、或指定的本机地址送出数据包。 |
-l preload |
是在没有接受到回复报文之前能发送的最多报文。非超级用户最多只能设置为3。如果不赋值preload默认为1。 |
-L |
抑制组播报文回送,只适用于ping的目标为一个组播地址。 |
-n |
只有数字形式ip地址值的输出,不通过查询DNS获知IP地址对应的主机名,以节省时间。 |
-p pattern |
允许为传输的回显报文中包含的内容指定字节模式。这对于诊断与传输数据有关的网络问题可能很有用。数据采用16进制,例如“-p ff”可将传输的报文填充为全1。 |
-q |
静默模式。这种模式下,出了开始的提示和结束的数据统计,不会输出任何东西。
|
-Q tos |
用来设置服务质量(Quality of Service ),例如最小开销、 可靠性、吞吐量、低延迟。
IP协议有一个8bit的DS区分服务(以前叫服务类型)。前三位是优先(precedence)字段(在目前,优先字段并未被大家使用),接着4bit是TOS位,最后1bit没有使用,但必须置0。
4比特TOS位的意义分别为D(最小时延)、T(最大吞吐量)、R(最高可靠性)、C(最小代价)。要设置TOS位为对应意义,可以设置-Q |
-R |
记录路由信息。在发送的IP报文首部选项中放入记录路由选项,在接到到报文回复之后,打印出回复报文的路由信息。
注意:IP报文的选项中最多只能计算9个路由信息,计算方式如下:
首部长度HLEN。这4bit字段用来定义首部的长度,以4字节为单位。由于首部长度可变,默认长度是20字节,此时4bit字段值为5。4bit的字段最大可以表示的数为15,故此首部长度最大为15*4byte,即60byte。首部的可变字节数为60-20=40byte,RR选项用去3byte(参见记录路由选项的一般格式),只剩下37byte,最多只能放下9个IP地址。
注意:很多的主机会略过IP报文的路由选项,因此有可能在回复报文中没有路由信息。 注意:不能和-T选项一起使用。 |
-r |
绕过一般的路由表而直接向一个连接着的主机发送报文。如果主机不是通过直接连接的网络相连,则会出现错误。这个选项可以用来ping一个没有通过路由相连而是通过一个接口相连(假设也使用了-I选项)的本地主机。 |
-S sndbuf |
设置套接字的发送缓冲区大小。如果没有设置,则被设定为不超过一个报文长度的长度。 |
-s packetsize |
指定每次ping发送的数据字节数,默认为“56字节”+“28字节”的ICMP头,一共是84字节。 包头+内容不能大于65535,所以最大值为65507(linux:65507, windows:65500)。 |
-t ttl |
设置TTL(Time To Live)为指定的值。该字段指定IP包被路由器丢弃之前允许通过的最大网段数。 |
-T timestamp_option |
设置IP时间戳选项。时间戳选项可以是以下三种: (a) -T tsonly 只记录时间戳。 (b) -T tsandaddr 收集时间戳和IP地址。 (c) -T tsprespec [host1 [host2 [host3[host4]]]] 收集来自预定的网络段的时间戳和地址,发送端对选项列表进行初始化,存放了4个IP地址和四个取值为0的时间戳。只有在列表中的下一个地址和当前路由地址相匹配时,才记录它的时间戳。
与-R选项的分析类似,首部的可变字节数为60-20=40byte,选项用去4byte(参见时间戳选项的一般格式),只剩下36byte,最多只能放下9个时间戳。
注意:由于IP首部的空间限制,程序限制-R选项与-T不能同时使用。 |
-M hint |
设定Path MTU查找选下项,可设置成下列三种: (a) -M do 不允许分段,甚至不允许在本地分段。 (b) -M want 找出PMTU,在如果包太大就在本地分段。 (c) -M dont 不要设置IP首部中的DF位,即允许分段。 |
-m mark |
设置mark。 |
-v |
使ping处于verbose方式,它要ping命令除了打印ECHO-RESPONSE数据包之外,还打印其它所有返回的ICMP数据包。 |
-W timeout |
等待回复的时间,单位是毫秒。这个选项只在没有接到任何的回复的情况下有效,只要接到了一个回复,就将等待时间设置为两倍的RTT。如果没有设置,则等待时间设置为一个最大值。 |
-w deadline |
设定时间期限为 |
下图为简单的ping产生的响应内容,图中返回内容具体的含义如下:
① ping目标主机的域名和IP(ping会自动将域名转换为IP)
② 不带包头的包大小和带包头的包大小(参考“-s”参数)
③ icmp_seq:ping序列,从1开始;如果数字不是按顺序递增也就意味着丢包了
ttl:剩余的ttl;见TTL解释
time: 响应时间,数值越小,联通速度越快;
④ 发出去的包数,返回的包数,丢包率,耗费时间;
⑤ 最小/最大/平均响应时间和本机硬件耗费时间;
当我们在使用ping命令时,返回结果里会带一个TTL值。这个东西的含义其实就是Time To Live,指的是报文在网络中能够‘存活’的限制。以前这个限制方式是设定一个时间(Time To Live中的Time就是这样来的),当报文在网络中转发时,时间超过这个限制,最后一个收到报文的‘路由点’就会把它扔掉,而不继续转发。后来把时间限制改为了跳数限制,就是当报文在网络中转发时,每经过一个‘路由点‘,就把预先设定的这个TTL数值减1,直到最后TTL=1时报文就被扔掉,不向下转发。
路由点:我这里是指完成路由功能的机器,因为并不是只有路由器才可以完成路由转发功能,比如主机可以配置路由转发。
ping命令中的TTL
上边解释的TTL是基础,然后,我们这篇文章要说明的是ping中的TTL到底是什么意思。
其实这个TTL是指:被ping主机那里返回的报文,到了你这里,从它自己预设的TTL减小到还剩下多少。
有点绕口,举个例子就明白了。
(1) 我们先 tracert www.baidu.com
这里表示,我们发出的ICMP报文从自己主机到目标主机一共经过12跳,这里可以想成我们发过去的和对方返回的路由路径是一样的(其实网络很复杂的,这样说是在基本理论上简化问题——一般网络情况不变化就是这样的),也就是目标主机它预设的报文TTL要减掉12。现在,按照刚才说的“被ping主机那里返回的报文,到了你这里,从它自己预设的TTL减小到还剩下多少。”,我们可以计算ping www.baidu.com时的TTL了。
TTL = 目标主机预设报文TTL - 12
现在等式中有两个未知数,但是“目标主机预设报文TTL”其实比较容易知道。并且有一个前提:一般有64、128等几个值。
(2) 我们先来ping www.baidu.com
这里我们看到 TTL = 52。一般就可以推断目标主机预设的报文TTL为64,因为它比较接近(一般啦)。然后对比一下上边的等式,代入数值:
52 = 64 - 12
默认情况下,Linux系统的TTL值为64或255,Windows NT/2000/XP系统的TTL值为128,Windows 98系统的TTL值为32,UNIX主机的TTL值为255。
(1) 每隔0.6秒ping一次,一共ping 5次
[root@my ~]# ping -c 5 -i 0.6 qq.com
PING qq.com (14.17.32.211) 56(84) bytes of data.
64 bytes from 14.17.32.211: icmp_seq=1 ttl=54 time=16.5 ms
64 bytes from 14.17.32.211: icmp_seq=2 ttl=54 time=17.0 ms
64 bytes from 14.17.32.211: icmp_seq=3 ttl=54 time=16.6 ms
64 bytes from 14.17.32.211: icmp_seq=4 ttl=54 time=18.3 ms
64 bytes from 14.17.32.211: icmp_seq=5 ttl=54 time=19.9 ms
--- qq.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 2405ms
rtt min/avg/max/mdev = 16.520/17.692/19.919/1.293 ms
(2) 极限快速的使用大包ping
以最快的速度,使用最大的包进行ping,可用于测试目标主机的承压能力:
[root@my ~]# ping -f -s 65507 10.0.0.52
PING 10.0.0.52 (10.0.0.52) 65507(65535) bytes of data.
.^
--- 10.0.0.52 ping statistics ---
646 packets transmitted, 646 received, 0% packet loss, time 1675ms
rtt min/avg/max/mdev = 1.202/2.406/8.253/0.507 ms, ipg/ewma 2.598/2.318 ms
注意:此用法非常危险,65535(包头+内容)*100个包每秒=6.25MB,每秒发送6.25MB的数据,相当于50Mbps的带宽,完全可能导致目标主机拒绝服务。请勿用于非法用途,造成不良后果自负。
(3) 不稳定网络,丢包严重的情形
下面的ping发出17个ping icmp包,而只有序号为8、9、12的包收到响应信息,丢包率达82%,联通非常不稳定
[root@my ~]# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=8 ttl=43 time=32.3 ms
64 bytes from 8.8.8.8: icmp_seq=9 ttl=43 time=32.2 ms
64 bytes from 8.8.8.8: icmp_seq=12 ttl=43 time=32.0 ms
^C
--- 8.8.8.8 ping statistics ---
17 packets transmitted, 3 received, 82% packet loss, time 16003ms
rtt min/avg/max/mdev = 32.038/32.208/32.362/0.246 ms
(4) 完全无法ping通的情形
[root@my ~]# ping -c 3 9.9.9.9
PING 9.9.9.9 (9.9.9.9) 56(84) bytes of data.
--- 9.9.9.9 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 1999ms