我们经常会使用ping命令来看看当前的网络情况,现在来具体看一下它的输出。

基本使用

输入命令:

ping jiangkang.tech

输出结果:

PING www.jiangkang.tech (116.62.113.200): 56 data bytes
64 bytes from 116.62.113.200: icmp_seq=0 ttl=53 time=12.452 ms
64 bytes from 116.62.113.200: icmp_seq=1 ttl=53 time=9.396 ms
64 bytes from 116.62.113.200: icmp_seq=2 ttl=53 time=13.394 ms
64 bytes from 116.62.113.200: icmp_seq=3 ttl=53 time=11.754 ms
64 bytes from 116.62.113.200: icmp_seq=4 ttl=53 time=15.670 ms
64 bytes from 116.62.113.200: icmp_seq=5 ttl=53 time=10.101 ms
--- www.jiangkang.tech ping statistics ---
6 packets transmitted, 6 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 9.396/12.128/15.670/2.080 ms

其中:

  • host后面括号里的是服务器的IP地址(如116.62.113.200)
  • 56 data bytes :客户端向服务端发送的报文大小,56字节
  • icmp_seq : 响应的序列号,依次递增
  • ttl : Time to live,生存时间,指的是IP包被在被路由器丢弃前允许的最大网段数,8 bit
  • time : ICMP请求响应一来一回的时间
  • 64 bytes : 响应的数据包是64字节

原理

Ping是基于ICMP实现的,分为客户端和服务端两部分:

  • 客户端发送 回显请求报文(echo message)
  • 服务端返回 回显应答报文(echo reply message)

而ICMP报文格式如下:

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Type      |     Code      |          Checksum             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           Identifier          |        Sequence Number        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Data ...
   +-+-+-+-+-

ICMP的IP层的子协议,通过Wireshark可以看到具体的报文收发过程:

image.png

请求报文

image.png

应答报文

image.png

如果仔细观察的话,会发现请求报文中的48bytes数据与应答报文中的48bytes数据是相同的,这就是ICMP的特点之一,请求什么数据,应答就返回什么数据。不同的系统,默认的发送数据可能有所不同。

参考文章

  1. https://tools.ietf.org/html/rfc792
  2. https://zhuanlan.zhihu.com/p/36811342