ping命令详解

 

1 概述

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指定要求完成的回应次数。

 

2 命令

 

2.1 命令功能

 

ping命令用于:确定网络和各外部主机的状态;跟踪和隔离硬件和软件问题;测试、评估和管理网络。如果主机正在运行并连在网上,它就对回送信号进行响应。每个回送信号请求包含一个网际协议(IP)和 ICMP 头,后面紧跟一个 tim 结构,以及来填写这个信息包的足够的字节。缺省情况是连续发送回送信号请求直到接收到中断信号(Ctrl-C)。

 

ping 命令每秒发送一个数据报并且为每个接收到的响应打印一行输出。ping 命令计算信号往返时间和(信息)包丢失情况的统计信息,并且在完成之后显示一个简要总结。ping 命令在程序超时或当接收到 SIGINT 信号时结束。Host 参数或者是一个有效的主机名或者是因特网地址。

 

2.2 命令格式

 

ping [参数] [主机名或IP地址]

 

ping命令运行在命令提示符终端,用法为:“ping 参数 目标主机”。其中参数为零到多个,目标主机可以是IP或者域名。


 
 
  1. Usage: ping [-aAbBdDfhLnOqrRUvV] [-c count] [-i interval] [-I interface]
  2. [-m mark] [-M pmtudisc_option] [-l preload] [-p pattern] [-Q tos]
  3. [-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp_option]
  4. [-w deadline] [-W timeout] [hop1 ...] destination

 

2.3 命令参数

 

参数

功能

-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 <tos>分别为0x10,0x08,0x04,0x02。TOS的各个位不能同时置1。

-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

设定时间期限为<deadline>秒,不管已经发送和接到了多少包,只要达到时间期限就结束ping的过程。

 

 

2.4 输出格式

 

 

下图为简单的ping产生的响应内容,图中返回内容具体的含义如下:

① ping目标主机的域名和IP(ping会自动将域名转换为IP)

② 不带包头的包大小和带包头的包大小(参考“-s”参数)

③ icmp_seq:ping序列,从1开始;如果数字不是按顺序递增也就意味着丢包了

  ttl:剩余的ttl;见TTL解释

  time: 响应时间,数值越小,联通速度越快;

④ 发出去的包数,返回的包数,丢包率,耗费时间;

⑤ 最小/最大/平均响应时间和本机硬件耗费时间;

 

 

3 TTL解释

 

当我们在使用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。

 

 

4 简单实例

 

(1) 每隔0.6秒ping一次,一共ping 5次

 


 
 
  1. [root@my ~] # ping -c 5 -i 0.6 qq.com
  2. PING qq.com (14.17.32.211) 56(84) bytes of data.
  3. 64 bytes from 14.17.32.211: icmp_seq=1 ttl=54 time=16.5 ms
  4. 64 bytes from 14.17.32.211: icmp_seq=2 ttl=54 time=17.0 ms
  5. 64 bytes from 14.17.32.211: icmp_seq=3 ttl=54 time=16.6 ms
  6. 64 bytes from 14.17.32.211: icmp_seq=4 ttl=54 time=18.3 ms
  7. 64 bytes from 14.17.32.211: icmp_seq=5 ttl=54 time=19.9 ms
  8. --- qq.com ping statistics ---
  9. 5 packets transmitted, 5 received, 0% packet loss, time 2405ms
  10. rtt min/avg/max/mdev = 16.520/17.692/19.919/1.293 ms

 

(2) 极限快速的使用大包ping

以最快的速度,使用最大的包进行ping,可用于测试目标主机的承压能力:


 
 
  1. [root@my ~] # ping -f -s 65507 10.0.0.52
  2. PING 10.0.0.52 (10.0.0.52) 65507(65535) bytes of data.
  3. .^
  4. --- 10.0.0.52 ping statistics ---
  5. 646 packets transmitted, 646 received, 0% packet loss, time 1675ms
  6. 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%,联通非常不稳定


 
 
  1. [root@my ~] # ping 8.8.8.8
  2. PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
  3. 64 bytes from 8.8.8.8: icmp_seq=8 ttl=43 time=32.3 ms
  4. 64 bytes from 8.8.8.8: icmp_seq=9 ttl=43 time=32.2 ms
  5. 64 bytes from 8.8.8.8: icmp_seq=12 ttl=43 time=32.0 ms
  6. ^C
  7. --- 8.8.8.8 ping statistics ---
  8. 17 packets transmitted, 3 received, 82% packet loss, time 16003ms
  9. rtt min/avg/max/mdev = 32.038/32.208/32.362/0.246 ms

 

(4) 完全无法ping通的情形


 
 
  1. [root@my ~] # ping -c 3 9.9.9.9
  2. PING 9.9.9.9 (9.9.9.9) 56(84) bytes of data.
  3. --- 9.9.9.9 ping statistics ---
  4. 3 packets transmitted, 0 received, 100% packet loss, time 1999ms

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在VPP插件GTPU中,处理Echo Request消息的函数是gtpu_echo_request。该函数的定义如下: ``` static_always_inline void gtpu_echo_request (vlib_main_t * vm, vlib_node_runtime_t * node, gtpu_header_t * gtpu, u32 sw_if_index0) { vnet_main_t *vnm = vnet_get_main (); vnet_sw_interface_t *si = vnet_get_sw_interface (vnm, sw_if_index0); /* Set MTU of the tunnel interface. This is an estimate since we do not know how many labels the packet will have, but it is better than nothing. */ gtpu4_tunnel_t *t = gtpu4_tunnel_from_gtpu_header (gtpu); u32 mtu = si->mtu_bytes - sizeof (ip4_header_t) - sizeof (udp_header_t) - sizeof (gtpu_header_t); t->mtu = clib_min (t->mtu, mtu); /* Just swap IP src/dst and send it back */ ip4_header_t *ip4 = &t->ip4; ip_csum_t sum0 = ip4->checksum; ip4->checksum = 0; ip4->src_address.as_u32 = ip4->dst_address.as_u32; ip4->dst_address.as_u32 = gtpu->ip4.src_address.as_u32; ip4->checksum = ip4_header_checksum (ip4); udp_header_t *udp = &t->udp; udp->src_port = udp->dst_port; udp->dst_port = clib_host_to_net_u16 (UDP_DST_PORT_GTPU); gtpu->flags = GTPU_ECHO_RSP; vlib_buffer_t *b = vlib_buffer_from_rte_mbuf (gtpu->buffer); vlib_buffer_advance (b, -(word) sizeof (ip4_header_t)); b->current_data -= sizeof (ip4_header_t); b->current_length += sizeof (ip4_header_t); b->total_length_not_including_first_buffer += sizeof (ip4_header_t); sum0 = ip_csum_update (sum0, 0, 0, ip4->src_address.as_u32); sum0 = ip_csum_update (sum0, 0, 0, ip4->dst_address.as_u32); udp->length = clib_host_to_net_u16 (b->current_length); sum0 = ip_csum_update (sum0, 0, 0, udp->length); gtpu->length = clib_host_to_net_u16 (b->current_length - sizeof (*ip4) - sizeof (*udp)); sum0 = ip_csum_update (sum0, 0, 0, gtpu->length); gtpu->checksum = ~ip_csum_fold (sum0); vlib_buffer_enqueue_to_next (vm, node, &b, 1, /* next_index */ 1); } ``` 这个函数的作用是将Echo Request消息的源地址和目的地址进行交换,然后将其发送回去,以此来测试是否可以进行双向通信。同时,它还会设置隧道接口的MTU,以预估传输时所需的最大传输单元。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值