0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ping是什么?ping背后的逻辑是什么样的?是如何实现的?

Linux爱好者 来源:未知 作者:易水寒 2018-10-03 12:25 次阅读

我们在遇到网络不通的情况,大家都知道去 ping 一下,看一下网络状况。

那你知道「ping」命令后背的逻辑是什么吗?知道它是如何实现的吗?

一、「ping」命令的作用和原理?

简单来说,「ping」是用来探测本机与网络中另一主机之间是否可达的命令,如果两台主机之间ping不通,则表明这两台主机不能建立起连接。ping是定位网络通不通的一个重要手段。

ping 命令是基于 ICMP 协议来工作的,「 ICMP 」全称为 Internet 控制报文协议( Internet Control Message Protocol)。ping 命令会发送一份ICMP回显请求报文给目标主机,并等待目标主机返回ICMP回显应答。因为ICMP协议会要求目标主机在收到消息之后,必须返回ICMP应答消息给源主机,如果源主机在一定时间内收到了目标主机的应答,则表明两台主机之间网络是可达的。

举一个例子来描述「ping」命令的工作过程:

假设有两个主机,主机A(192.168.0.1)和主机B(192.168.0.2),现在我们要监测主机A和主机B之间网络是否可达,那么我们在主机A上输入命令:ping 192.168.0.2

此时,ping命令会在主机A上构建一个 ICMP的请求数据包(数据包里的内容后面再详述),然后 ICMP协议会将这个数据包以及目标IP(192.168.0.2)等信息一同交给IP层协议。

IP层协议得到这些信息后,将源地址(即本机IP)、目标地址(即目标IP:192.168.0.2)、再加上一些其它的控制信息,构建成一个IP数据包。

IP数据包构建完成后,还不够,还需要加上MAC地址,因此,还需要通过ARP映射表找出目标IP所对应的MAC地址。当拿到了目标主机的MAC地址和本机MAC后,一并交给数据链路层,组装成一个数据帧,依据以太网的介质访问规则,将它们传送出出去。

当主机B收到这个数据帧之后,会首先检查它的目标MAC地址是不是本机,如果是就接收下来处理,接收之后会检查这个数据帧,将数据帧中的IP数据包取出来,交给本机的IP层协议,然后IP层协议检查完之后,再将ICMP数据包取出来交给ICMP协议处理,当这一步也处理完成之后,就会构建一个ICMP应答数据包,回发给主机A

在一定的时间内,如果主机A收到了应答包,则说明它与主机B之间网络可达,如果没有收到,则说明网络不可达。除了监测是否可达以外,还可以利用应答时间和发起时间之间的差值,计算出数据包的延迟耗时。

通过ping的流程可以发现,ICMP协议是这个过程的基础,是非常重要的,因此下面就把ICMP协议再详细解释一下。

二、什么是「 ICMP 」?

我们知道,ping命令是基于ICMP协议来实现的。那么我们再来看下图,就明白了ICMP协议又是通过IP协议来发送的,即ICMP报文是封装在IP包中。

IP协议是一种无连接的,不可靠的数据包协议,它并不能保证数据一定被送达,那么我们要保证数据送到就需要通过其它模块来协助实现,这里就引入的是ICMP协议。

当传送的IP数据包发送异常的时候,ICMP就会将异常信息封装在包内,然后回传给源主机。

将上图再细拆一下可见:

继续将ICMP协议模块细拆:

由图可知,ICMP数据包由8bit的类型字段和8bit的代码字段以及16bit的校验字段再加上选项数据组成。

ICMP协议大致可分为两类:

查询报文类型

差错报文类型

查询报文类型:

查询报文主要应用于:ping查询、子网掩码查询、时间戳查询等等。

上面讲到的ping命令的流程其实就对应ICMP协议查询报文类型的一种使用。在主机A构建ICMP请求数据包的时候,其ICMP的类型字段中使用的是 8 (回送请求),当主机B构建ICMP应答包的时候,其ICMP类型字段就使用的是 0 (回送应答),更多类型值参考上表。

对 查询报文类型 的理解可参考一下文章最开始讲的ping流程,这里就不做赘述。

差错报文类型:

差错报文主要产生于当数据传送发送错误的时候。

它包括:目标不可达(网络不可达、主机不可达、协议不可达、端口不可达、禁止分片等)、超时、参数问题、重定向(网络重定向、主机重定向等)等等。

差错报文通常包含了引起错误的IP数据包的第一个分片的IP首部,加上该分片数据部分的前8个字节。

当传送IP数据包发生错误的时候(例如 主机不可达),ICMP协议就会把错误信息封包,然后传送回源主机,那么源主机就知道该怎么处理了。

那是不是只有遇到错误的时候才能使用 差错报文类型 呢?也不一定。

Traceroute 就是一个例外,Traceroute是用来侦测源主机到目标主机之间所经过路由情况的常用工具。Traceroute 的原理就是利用ICMP的规则,制造一些错误的事件出来,然后根据错误的事件来评估网络路由情况。

具体做法就是:

Traceroute会设置特殊的TTL值,来追踪源主机和目标主机之间的路由数。首先它给目标主机发送一个 TTL=1 的UDP数据包,那么这个数据包一旦在路上遇到一个路由器,TTL就变成了0(TTL规则是每经过一个路由器都会减1),因为TTL=0了,所以路由器就会把这个数据包丢掉,然后产生一个错误类型(超时)的ICMP数据包回发给源主机,也就是差错包。这个时候源主机就拿到了第一个路由节点的IP和相关信息了。

接着,源主机再给目标主机发一个 TTL=2 的UDP数据包,依旧上述流程走一遍,就知道第二个路由节点的IP和耗时情况等信息了。

如此反复进行,Traceroute就可以拿到从主机A到主机B之间所有路由器的信息了。

但是有个问题是,如果数据包到达了目标主机的话,即使目标主机接收到TTL值为1的IP数据包,它也是不会丢弃该数据包的,也不会产生一份超时的ICMP回发数据包的,因为数据包已经达到了目的地嘛。那我们应该怎么认定数据包是否达到了目标主机呢?

Traceroute的方法是在源主机发送UDP数据包给目标主机的时候,会设置一个不可能达到的目标端口号(例如大于30000的端口号),那么当这个数据包真的到达目标主机的时候,目标主机发现没有对应的端口号,因此会产生一份“端口不可达”的错误ICMP报文返回给源主机。

可见Traceroute的原理确实很取巧,很有趣。

以上,就是对ping的基本原理以及ICMP协议的基本讲解了,欢迎大家一起交流。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 以太网
    +关注

    关注

    40

    文章

    5080

    浏览量

    166298
  • ICMP
    +关注

    关注

    0

    文章

    50

    浏览量

    14814
  • Ping
    +关注

    关注

    0

    文章

    66

    浏览量

    15819

原文标题:当你「ping 一下」的时候,你知道它背后的逻辑吗?

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何实现ping外网域名

    1.前言 编写这篇文章主要目的如何实现ping外网域名,前提情况是可以ping外网IP(这里不详细说明网络IP等的配置)2.问题重现 首先使用电脑ping获取其IP,然后在开发板上
    发表于 11-02 07:14

    三种不同的“防 Ping”技巧

    三种不同的“防 Ping”技巧 浅析三种不同的“防 Ping”方法   众所周知,Ping命令是一个非常有用的网络命令,大家常用它
    发表于 04-14 13:53 1040次阅读

    Ping程序的C语言编程

      大部分人用ping命令只是作为查看另一个系统的网络连接是否正常的一种简单方法。在这篇文章中,作者将介绍如何用C语言编写一个模拟ping命令功能的程序。   ping
    发表于 08-18 15:36 1051次阅读

    uCOS-II下实现的lwip协议栈实现Ping功能

    uCOS-II下实现的lwip协议栈实现Ping功能
    发表于 03-26 15:51 143次下载

    如何实现Ping操作_Delphi教程

    Delphi教程如何实现Ping操作,很好的Delphi学习资料。
    发表于 03-16 14:59 5次下载

    ping命令的使用方法及功能

    ping是Windows、Unix和Linux系统下的一个命令。ping也属于一个通信协议,是TCP/IP协议的一部分。利用“ping”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障。应用格式:
    发表于 11-23 15:22 7w次阅读
    <b class='flag-5'>ping</b>命令的使用方法及功能

    ping命令的使用大全(Windows下ping命令的使用)

    ping命令相信大家已经再熟悉不过了,但是能把ping的功能发挥到最大的人却并不是很多,下面就给大家讲一些ping命令的运用。
    的头像 发表于 02-24 10:29 1.3w次阅读

    ping命令入门详解

    Ping是潜水艇人员的专用术语,表示回应的声纳脉冲,在网络中Ping 是一个十分好用的TCP/IP工具。它主要的功能是用来检测网络的连通情况和分析网络速度。 Ping有好的善的一面也有恶的一面。先说
    发表于 10-06 14:09 3013次阅读

    ping原理及应用介绍

    Ping程序的实质是利用了ICMP请求回显和回显应答报文,但ARP请求和应答报文也在其中起了非常重要的作用。 Ping逻辑过程以从PC1 ping PC2(命令:
    发表于 10-06 14:25 8012次阅读

    ping值和网速有关系吗?ping值多少算正常

    PING值--代表你的电脑跟服务器的连接速度,即:客户端数据传送至服务器后再将命令反馈到客户端所需的时长,单位为毫秒(ms),PING值越小速度越快。 主要还要看是用“光纤宽带”还是“普通宽带
    发表于 10-06 15:27 11.5w次阅读

    说说PING命令涉及端到端的理论

    任何靠 IT 行业讨饭吃的人,无论在哪个范畴工作,都一定懂得 Ping 这个指令。差不多任何作业系统都具备 Ping 这命令,用来做简单的 Troubleshooting。但究竟 Ping
    的头像 发表于 01-01 17:26 2861次阅读

    嵌入式linux实现ping域名

    1.前言    编写这篇文章主要目的如何实现ping外网域名,前提情况是可以ping外网IP(这里不详细说明网络IP等的配置)2.问题重现    首先使用电脑ping www.baid
    发表于 11-01 17:38 11次下载
    嵌入式linux<b class='flag-5'>实现</b><b class='flag-5'>ping</b>域名

    Ping命令的7个基础用法

    IT行业中ping命令经常被用到,今天整理了一下关于网络基础知识中的网络命令ping命令在项目中是使用频率最高的,一般我们用的都是它的基本功能,今天和大家来详细看下Ping命令的7个基础用法,掌握了秒变大神!
    的头像 发表于 10-12 09:16 2602次阅读

    PING命令还能这么用?

    今天和你聊聊PING命令。 一般来说,网工们通常会用它来直接ping ip地址,来测试网络的连通情况。 类似这种,ping ip地址或网关,然后ping通后会显示出以上数据。 再通过
    的头像 发表于 05-18 16:43 723次阅读
    <b class='flag-5'>PING</b>命令还能这么用?

    你知道ping命令是如何工作的吗?

    我们用来测试一台机器与另一台机器的网络连通性一般会使用ping命令,那么你知道ping命令是如何工作的吗?ping命令是基于ICMP协议工作的。
    的头像 发表于 05-31 11:40 704次阅读
    你知道<b class='flag-5'>ping</b>命令是如何工作的吗?