Ping是基于ICMP协议工作的,ICMP报文封装在IP包里面,它工作在网络层,是IP协议的助手。
ICMP包头的类型字段,大致可分为两大类:
- 一类是用于诊断的查询消息,也就是查询报文类型
- 一类是通知出错原因的错误消息,也就是差错报文类型
查询报文类型
回送消息-类型 0 和 8
回送消息用于进行通信的主机或路由器之间,判断所发送的数据包是否已经成功到达对端的一种消息, ping 命令就是利用这个消息实现的。
可以向对端主机发送回送请求消息(ICMP Echo Request Message,类型 8 ),也可以接收对端主机发回来的回送应答消息 (ICMP Echo Reply Message,类型 0)
相比原生的ICMP,这里多了两个字段:
- 标识符:用以区分是哪个应用程序发ICMP包,比如用进程PID作为标识符
- 序号:序列号从 0 开始,每发送一次新的回送请求就会加 1 ,用来确认网络包是否有丢失
在选项数据中, ping 还会存放发送请求的时间值,来计算往返时间,说明路程的长短。
Ping-查询报文类型的使用
同一个子网的主机A和主机B,主机A执行ping主机B后:
ping命令执行的时候,源主机首先会构建一个ICMP回送请求消息数据包。
ICMP数据包内包含多个字段,最重要的是两个:
- 第一个是类型,对于回送请求消息而言该字段为 8 ,
- 另一个是序号,主要用于区分连续ping的时候发出的多个数据包
每发出一个请求数据包,序号会自动加1。为了能够计算往返时间RTT ,它会在报文的数据部分插入发送时间。
然后,由ICMP协议将这个数据包连同地址192.168.1.2一起交给IP层。IP层将192.168.1.2作为目的地址,本地IP地址作为源地址,协议字段设置为 1 表示是 ICMP协议,再加上一些其他控制信息,构建一个 IP 数据包。
接下来,需要加入MAC头。如果在本地ARP映射表中查找出IP地址192.168.1.2所对应的MAC地址,则可以直接使用;如果没有,则需要发送ARP协议查询MAC地址。获得MAC地址后,由数据链路层构建一个数据帧,目的地址是IP层传过来的MAC地址,源地址是本机的MAC地址;还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。
主机 B 收到这个数据帧后,先检查它的目的地址,并和本机的MAC地址对比,如符合则接受,否则就丢弃。
接收后检查该数据帧,将IP数据包从帧中提取出来,交给本机的IP层。同样,IP层检查后,将有用的信息提取后交给ICMP协议。
主机 B 会构建一个ICMP回送响应消息数据包,回送响应数据包的类型字段为 0 ,序号为接收到的请求数据包中的序号,然后再发送出去给主机A。
在规定时间内,源主机如果没有接到ICMP的应答包,则说明目标主机不可达;如果接收到了ICMP回送响应消息,则说明目标主机可达。
此时,源主机会检查,用当前时刻减去该数据包最初从源主机上发出的时刻,就是ICMP数据包的时间延迟。
这是同一个局域网里面的情况,如果跨网段的话,还会涉及网关的转发、路由器的转发等等。