ping是什么?关于ping的详细介绍

创闻科学2020-11-16 15:12:37

Ping是一种计算机网络诊断工具,用于测试互联网协议网络上主机的可达性。它几乎适用于所有具有网络功能的操作系统,包括大多数嵌入式网络管理软件。Ping测量的是消息从源主机发送到目标计算机并返回到源主机的往返时间。这个名字源于主动声纳的术语,指的是通过发出声音脉冲,并听回声来探测水下物体。

Ping通过向目标主机发送因特网信报控制协议(ICMP)回显请求数据包并等待ICMP回显回复来实现。该程序报告错误、数据包丢失和结果的统计摘要,通常包括往返时间的最小值、最大值、平均值以及平均值的标准差。ping诊断工具的命令行选项及其输出在众多实现方法中各不相同。命令行选项可能包括有效负载的大小、测试的次数、探测遍历的网络跳数的限制以及请求之间的间隔。许多系统提供了一个配套诊断工具ping6,用于在实现ICMPv6的互联网协议版本6 (IPv6)网络上进行测试。

历史

ping诊断工具是迈克·穆斯1983年12月在弹道研究实验室(现为美国陆军研究实验室)任职期间写的。迈克·穆斯是将其作为一种诊断网络故障的工具而创建的,他的灵感来自大卫·米尔斯的关于使用ICMP回声数据包进行网络诊断和测量的讨论。 作者以声纳发出的声音来命名它,因为它的方法类似于声纳的回声定位。 第一个发布的版本是公共软件,而所有后续版本都是根据BSD许可证获得许可的。Ping第一次许可发布是在4.3BSD中。

RFC 1122规定,任何主机都必须处理ICMP回声请求并发出回应回复。

调用示例

以下是在Linux上运行ping,向目标主机www.example.com发送五个探测的输出:

$ ping -c 5 www.example.com
PING www.example.com (93.184.216.34): 56 data bytes
64 bytes from 93.184.216.34: icmp_seq=0 ttl=56 time=11.632 ms
64 bytes from 93.184.216.34: icmp_seq=1 ttl=56 time=11.726 ms
64 bytes from 93.184.216.34: icmp_seq=2 ttl=56 time=10.683 ms
64 bytes from 93.184.216.34: icmp_seq=3 ttl=56 time=9.674 ms
64 bytes from 93.184.216.34: icmp_seq=4 ttl=56 time=11.127 ms

--- www.example.com ping statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 9.674/10.968/11.726/0.748 ms

输出列出了每个探测消息和获得的结果。最后,它列出了整个测试的统计数据。在本例中,最短往返时间为9.674毫秒,平均往返时间为10.968毫秒,最长往返时间11.726毫秒。往返时间的标准偏差为0.748毫秒。

错误指示

在目标主机没有响应的情况下,大多数实现方法是要么什么都不显示,要么在一段时间后打印超时通知。可能出现的指示问题的ping结果如下所示:

  • H, !N 或 !P– 主机、网络或协议不可访问
  • S– 源路径设置失败
  • F– 需要存储残片
  • U or!W--目标网络/主机未知
  • I– 源主机被隔离
  • A– 管理禁止与目的网络通信
  • Z– 管理禁止与目的主机通信
  • Q– 对于这个ToS,目的网络是不可达的
  • T– 对于这个ToS,目的主机是不可达的
  • X– 管理禁止通信
  • V– 违反主机优先级
  • C– 优先级截止生效

出现错误时,目标主机或中间路由器会发回一条ICMP错误消息,例如“主机无法到达”或“传输中超出TTL”。此外,这些消息包括原始消息的前八个字节(在本例中是ICMP回应请求的报头,包括抑制值),因此ping诊断工具可以匹配对原始查询的响应。

消息格式

ICMP数据包

IPv4 数据报
位 0–7 位 8–15 位 16–23 位 24–31
头部

(20 字节)

版本/IHL 服务类型 长度
标识 标志和偏移
生存时间 (TTL) 协议 首部检验和
源地址
目的地址
ICMP 头部

(8 字节)

消息类型 代码 检验和
头部数据
ICMP 有效载荷

可选的

有效载荷数据
IPv6 数据报
位 0–3 位 4–7 位 8–11 位 12–15 位 16–23 位 24–31
头部

(40 字节)

版本 通信分类 流标签
有效载荷长度 下一个头部 跳数限制
源地址
目的地址
ICMP6 头部

(8 字节)

消息类型 代码 校验和
头部数据
ICMP6 有效载荷

可变的

有效载荷数据

ICMP数据包的一般组成:

  • IPv4报头(蓝色):协议设置为1 (ICMP),服务类型设置为0。
  • l IPv6报头(蓝色):下一个报头设置为58 (ICMP6)。
  • ICMP报头(红色):
    • ICMP消息的类型(8位)。
    • 代码(8位)。
    • 校验和(16位),用数据包的ICMP部分计算(不使用IP报头)。它是从类型字段开始的ICMP消息的补码总和的16位补码。
    • 报头数据(32位)字段,在这种情况下(ICMP回声请求和回复中),将由标识符(16位)和序列号(16位)组成。
  • ICMP有效载荷:不同类型答复的有效载荷;可以是任意长度,具体由实施方法决定。但是,包含IP和ICMP报头的数据包必须小于网络的最大传输单位,否则会有被分段的风险。

回声请求

回声请求(“ping”)是一条ICMP/ICMP6消息。

00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
类型 = 8(IPv4, ICMP) 128(IPv6,ICMP6) 代码 = 0 校验和
识别码 序列号
有效载荷

客户端可以使用标识符和序列号将回复与导致该回复的请求相匹配。实际上,大多数Linux系统在每个ping过程中都使用一个唯一的标识符,并且序列号在该过程中是不断增长的。Windows使用固定标识符(在不同Windows版本之间会有所不同)和仅在启动时重置的序列号。

回声回复

回声回复是响应回声请求而生成的ICMP消息;它对所有主机都是强制性的,并且必须包括请求中收到的确切有效载荷。

00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
类型 = 0(IPv4,ICMP) 129(IPv6,ICMP6) 代码 = 0 校验和
识别码 序列号
有效载荷
  • 客户端可以使用标识符和序列号将每个回声请求与其回复相关联。

有效载荷

数据包的有效负载通常由ASCII字符填充,如下例的tcpdump诊断输出的最后32字节所示(在以0x0800开头的8字节ICMP报头之后):

16:24:47.966461 IP (tos 0x0, ttl 128, id 15103, offset 0, flags [none],
proto: ICMP (1), length: 60) 192.168.146.22 > 192.168.144.5: ICMP echo request,
id 1, seq 38, length 40
       0x0000:  4500 003c 3aff 0000 8001 5c55 c0a8 9216  E..<:.....U....
       0x0010:  c0a8 9005 0800 4d35 0001 0026 6162 6364  ......M5...&abcd
       0x0020:  6566 6768 696a 6b6c 6d6e 6f70 7172 7374  efghijklmnopqrst
       0x0030:  7576 7761 6263 6465 6667 6869            uvwabcdefghi

有效载荷可以包括指示传输时间的时间戳和序列号,这在本例中找不到。这允许ping以无状态方式计算往返时间,而不需要记录每个数据包的传输时间。

有效载荷也可以包括局域网唤醒协议的魔术包(magic packet),但是在这种情况下最小有效载荷比所示的长。如果主机处于休眠状态,回声请求通常不会收到任何回复,但是如果其接口被配置为接受唤醒请求,主机仍然会从休眠状态中唤醒。如果主机已经处于活动状态,并且配置为允许对传入的ICMP回声请求数据包进行回复,则返回的回复应包含相同的有效载荷。这可用于检测远程主机是否被有效唤醒,方法是在延迟一段时间后重复一个新请求,以允许主机恢复其网络服务。如果主机正处于低功耗活动状态,单个请求将唤醒该主机,只要该主机启用了回声回复服务,该服务就可以立即回复。主机不需要完全唤醒所有设备,并可能在短暂延迟后返回低功耗模式。这种配置可用于避免主机在低功率活动模式下经过一段时间后进入具有更长的唤醒延迟的休眠状态。

安全考虑

为了实施拒绝服务攻击,攻击者可能会尽可能快的发送ping请求,这可能会使受害者无法接受ICMP回声请求。这种技术被称为ping flood。

对多个地址的Ping请求(ping sweeps)可用于获取网络上所有主机的列表。