ping的相关知识

在日常生活或工作中,我们在判断与对方网络是否畅通,使用的最多的莫过于ping命令了。
但是你知道ping是如何工作的吗?
知其然,更要知其所以然,下面我们一起来学习一下这个过程吧。

前置知识 – ICMP 协议

ping 是基于 ICMP 协议工作的,所以要明白 ping 的工作,首先我们先来熟悉 ICMP 协议

什么是ICMP协议?

ICMP 全称是 Internet Control Message Protocol,也就是互联网控制报文协议。

网络包在复杂的网络传输环境里,常常会遇到各种问题。当遇到问题的时候,总不能死的不明不白,没头没脑的作风不是计算机网络的风格。所以需要传出消息,报告遇到了什么问题,这样才可以调整传输策略,以此来控制整个局面。

所以ICMP就是负责传递这个信息的。

ICMP的具体功能

ICMP 主要的功能包括:确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等。

换句话说,我们在进行数据包的发送过程中,对ip包的结果要有明确的反馈,以确定是否发送成功。如果失败,又是因为什么错误。
那么问题来了,ICMP要如何进行这些信息的传递呢?别急,我们先来了解一下ICMP包头的布局。

ICMP包头的布局

可见,ICMP报文是被封装在IP包里面的。而在ICMP报文中,我们要重点关注两个区域:类型代码

下面我们具体对这两类进行介绍:

ICMP类型

ICMP包头的类型字段,大致分为二类:

  • 一类是用于诊断的查询消息,也就是「查询报文类型
  • 另一类是通知出错原因的错误消息,也就是「差错报文类型

ICMP类型
其中,图片中的第一列的数字就是ICMP类型字段的内容,对应者不同的种类。

报文类型又可以分为查询报文类型与差错报文类型。

回收消息 –类型 0与8

回送消息用于进行通信的主机或路由器之间,判断所发送的数据包是否已经成功到达对端的一种消息, ping 命令就是利用这个消息实现的。
回送消息的流程
内部结构

可知,在发送请求后如果收到应答,就表示二者可以进行通信。

差错报文类型 – 3,4,5,11

具体对应内容见上图。同时,除了不同的错误会对应不同的类型字段外,同一个类型也会细分为不同的错误,这里使用代码字段进行区分。
简单举一个例子,类型号3对应目标消息不可达,而目标不可达又可以分为不同的类别,常见的有6类:
代码号

其余几个类型也会有不同的代码号,我们这里不在细说。

ping的过程

回送消息用于进行通信的主机或路由器之间,判断所发送的数据包是否已经成功到达对端的一种消息, ping 命令就是利用这个消息实现的。

同一个网络的主机进行ping操作

下面我们重点来看一下ping的发送与接收过程,以同一个网络下的两个不同主机为例。

ping操作下的发送操作:
1. ping 命令执⾏的时候,源主机⾸先会构建⼀个 ICMP 回送请求消息数据包
前面我们已经了解到,ICMP的类型字段分为不同类别,其中8代表回送请求。
一个ICMP数据包包含很多字段,其中最重要的是 类型 与 序号 两个区域。

  1. 第⼀个是类型,对于回送请求消息⽽⾔该字段为 8 ;
  2. 另外⼀个是序号,主要⽤于区分连续 ping 的时候发出的多个数据包

2. 整合为IP数据包
然后,由 ICMP 协议将这个数据包连同地址 目标地址⼀起交给 IP 层。IP 层将以 本机 IP 地址作为源地址,协议字段设置为 1 表示是 ICMP 协议,再加上⼀些其他控制信息,构建⼀个 IP 数据包。

3. MAC头的加入
如果在本地 ARP 映射表中查找出 目标IP地址所对应的 MAC 地址,则可以直接使⽤;如果没有,则需要发送 ARP 协议查询 MAC 地址,获得 MAC 地址后,由数据链路层构建⼀个数据帧,⽬的地址是 IP 层传过来的 MAC 地址,源地址则是本机的 MAC 地址;还要附加上⼀些控制信息,依据以太⽹的介质访问规则,将它们传送出去。

最终形态


ping操作下的接收操作
(以下步骤大体分为三个流程)

  1. 主机 B 收到这个数据帧后,先检查它的⽬的 MAC 地址,并和本机的 MAC 地址对⽐,如符合,则接收,否则就丢弃。
  2. 接收后检查该数据帧,将 IP 数据包从帧中提取出来,交给本机的 IP 层。同样,IP 层检查后,将有⽤的信息提取后交给 ICMP 协议。
  3. 主机 B 会构建⼀个 ICMP 回送响应消息数据包,回送响应数据包的类型字段为 0序号为接收到的请求数据包中的序号,然后再发送出去给主机 A。
    回送报文

在规定的时候间内,源主机如果没有接到 ICMP 的应答包,则说明⽬标主机不可达;如果接收到了 ICMP 回送响应消息,则说明⽬标主机可达
此时,源主机会检查,⽤当前时刻减去该数据包最初从源主机上发出的时刻,就是 ICMP 数据包的时间延迟

下面对ping的流程做一个整体描述:
ping

跨网段的ping操作

上面的ping操作是以在同一个局域网里的主机为例,如果二者不在同一个网络,这其中会涉及到路由的转发等。

但是这影响的只是传输过程的复杂性,不会对ICMP头造成影响。

ping这个操作就是利用ICMP中的类型8与类型0的交互实现。

小鲨鱼的使用

Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是截取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。

前面我们讲了那么多ping操作的理论知识,这里正好来实际操作验证一下。

第一步 打开wireshark软件,现在对应的网卡

第二步 过滤操作:icmp

第三步 ping一下

第四步 抓到ping操作的icmp包

第五步 icmp的分析

第六步 IP协议的对应


ps:wireshark是一个强大的网络抓包工具,这里只是用于抓取和分析了ping操作的包。通过不同的过滤规则可以抓取不同的数据包。
推荐一个博客:wireshark抓包入门