暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

数据与人 2021-07-19
2625
点击上方"数据与人"右上角选择“设为星标”
分享干货,共同成长!
作者 | FutureEye
一、什么是ping?
ping是一种计算机网络工具,用来测试数据包能否透过IP协议到达特定主机。ping的运作原理是向目标主机传出一个ICMP echo@要求数据包,并等待接收echo回应数据包。
程序会按时间和成功响应的次数估算丢失数据包率(丢包率)和数据包往返时间(网络时延,Round-trip delay time)。
我们在网络通信的过程中,常常使用 ping 某一个 IP 地址或者某个域名看下基本连接是否正常,是否有网络延迟。ping 就是我们经常用来作为网络连接通信的测试指令。那你知道「ping」命令后背的逻辑是什么吗?知道它是如何实现的吗?
Windows 10 下的 Ping:
    C:\>ping www.baidu.com
    正在 Ping www.a.shifen.com [119.75.216.20] 具有 32 字节的数据:
    来自 119.75.216.20 的回复: 字节=32 时间=42ms TTL=53
    来自 119.75.216.20 的回复: 字节=32 时间=42ms TTL=53
    来自 119.75.216.20 的回复: 字节=32 时间=42ms TTL=53
    来自 119.75.216.20 的回复: 字节=32 时间=42ms TTL=53

    119.75.216.20 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
    往返行程的估计时间(以毫秒为单位):
    最短 = 42ms,最长 = 42ms,平均 = 42ms
    、ping命令的作用及原理?
    ping 命令是基于ICMP(Internet Control Message Protocol)协议来工作的,全称为 Internet 控制报文协议。
    ping 命令会发送一份ICMP回显请求报文给目标主机,并等待目标主机返回ICMP回显应答。因为ICMP协议会要求目标主机在收到消息之后,必须返回ICMP应答消息给源主机,如果源主机在一定时间内收到了目标主机的应答,则表明两台主机之间网络是可达的。
    举一个例子来描述「ping」命令的工作过程:
    1、假设有两个主机,主机A(192.168.0.1)和主机B(192.168.0.2),现在我们要监测主机A和主机B之间网络是否可达,那么我们在主机A上输入命令:ping 192.168.0.2;
    2、此时,ping命令会在主机A上构建一个 ICMP的请求数据包,然后 ICMP协议会将这个数据包以及目标IP(192.168.0.2)等信息一同交给IP层协议。
    3、IP层协议得到这些信息后,将源地址(即本机IP)、目标地址(即目标IP:192.168.0.2)、再加上一些其它的控制信息,构建成一个IP数据包。
    4、IP数据包构建完成后,还不够,还需要加上MAC地址,因此,还需要通过ARP映射表找出目标IP所对应的MAC地址。当拿到了目标主机的MAC地址和本机MAC后,一并交给数据链路层,组装成一个数据帧,依据以太网的介质访问规则,将它们传送出出去。
    5、当主机B收到这个数据帧之后,会首先检查它的目标MAC地址是不是本机,如果是就接收下来处理,接收之后会检查这个数据帧,将数据帧中的IP数据包取出来,交给本机的IP层协议,然后IP层协议检查完之后,再将ICMP数据包取出来交给ICMP协议处理,当这一步也处理完成之后,就会构建一个ICMP应答数据包,回发给主机A。
    6、在一定的时间内,如果主机A收到了应答包,则说明它与主机B之间网络可达,如果没有收到,则说明网络不可达。除了监测是否可达以外,还可以利用应答时间和发起时间之间的差值,计算出数据包的延迟耗时。
    通过ping的流程可以发现,ICMP协议是这个过程的基础,是非常重要的,因此下面就把ICMP协议再详细解释一下。

    三、什么是「 ICMP 」?

    我们知道,ping命令是基于ICMP协议来实现的。那么我们再来看下图,就明白了ICMP协议又是通过IP协议来发送的,即ICMP报文是封装在IP包中。
    ICMP用图文表示:
    IP协议是一种无连接的,不可靠的数据包协议,它并不能保证数据一定被送达,那么我们要保证数据送到就需要通过其它模块来协助实现,这里就引入的是ICMP协议。
    当传送的IP数据包发送异常的时候,ICMP就会将异常信息封装在包内,然后回传给源主机。
    ICMP协议大致可分为两类:
    • 查询报文类型
    • 差错报文类型
    1、查询报文类型:
    定义:发送端主动发起请求,并且获取到应答。常见应用:Ping、子网掩码查询、时间戳查询等
    Ping 就是主动请求,获取到主动应答。但是 Ping 是在原生的 ICMP 中添加了自定义格式区域。例如 Ping 中放了发送的请求时间,以此计算出路程。所以,其实在 Ping 的报文中会加入序号,以用来区分数据包,从而提高计算时间或者路程的准确性。
    2、差错报文类型:
    主要有以下几种:
    1、源抑制
    发送端发送大量数据时,可能会导致网络( 路由器 )过载,此时过载处可以向发送端发送源抑制的消息,让他降低发送速度。
    2、终点不可到达
    网络信息不能到达终点,就会给发送端发送一个目的不可到达的信息。告诉发送端可能是设备故障而引起关闭(情况之一)。然后这种又可以再次细分:A、网络不可达  — 代码为 0,B、主机不可达 — 代码为 1.C、协议不可达 — 代码为 2.D、端口不可达 — 代码为 3.E、需要分段 - 代码为 4.( 必须把数据分段才能去到终点 )
    3、超时
    网络包超过设置的在网络中的生存时间,还没有达到。
    4、路由重定向
    定义数据包的路由股则。因为大部分的时候,路由规则是通过相关协议算法生成的,有些时候重新定义过之后,会让这个数据包绕的更远。
    常见应用:TracerouteTraceoute  有点像是在不断试错的意思。是用来侦测主机到目的主机之间所经路由情况的重要工具。Ping 我们知道是可以知道这条大路通不通的,Traceoute 通过设置  TTL 知道到底是哪个路由器不通。
    TTL : 数据包在网络中生存时间,也就是通过数据被路由器转发的次数,没转发一次就减一。知道为 0 的时候就抛弃。
    Traceroute 的原理:它收到目的主机的 IP 后,首先给目的主机发送一个 TTL=1 的 UDP 数据包,而经过的第一个路由器收到这个数据包以后,就自动把 TTL 减 1,而 TTL 变为 0 以后,路由器就把这个包给抛弃了,并同时产生 一个主机不可达的 ICMP 数据报给主机。如此循环就可以知道所有的路由 IP 了。( ICMP 出错了就会回错误包 )
    通常 Traceoute 的目的端口设置的是一个大于 30000 的值( 一般的应用端口号远小于这个数 )。所以如果回复的是 “端口不可达”,那就说明到达终点,否则这个信息就会超时。以此确保 消息是否到达终点。
    Traceoute 还有一个有意思的功能,就是确定 MTU(数据最大传输单元),Traceoute  通常对数据不分段,就直接发送,如果如果遇到过程中某个路由转发,出现返回 ICMP 需要分段的错误,就把数据进行拆分,直到最后到达终点。就验证出 MTU。
    以上,就是ping背后基本逻辑了。

    来源:
    https://www.jianshu.com/p/e1795962ad76
    觉得本文有用,请转发、点赞或点击“在看”
    聚焦技术与人文,分享干货,共同成长
    更多内容请关注“数据与人
    文章转载自数据与人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论