0%

Ping 本质( ICMP )

1、什么是 Ping

ping是一种计算机网络工具,用来测试数据包能否透过IP协议到达特定主机。ping的运作原理是向目标主机传出一个ICMP echo@要求数据包,并等待接收echo回应数据包。程序会按时间和成功响应的次数估算丢失数据包率(丢包率)和数据包往返时间(网络时延,Round-trip delay time)。———— 维基百科
我们在网络通信的过程中,常常使用 ping 某一个 IP 地址或者某个域名看下基本连接是否正常;是否有丢包;是否有网络延迟。ping 就是我们经常用来作为网络连接通信的测试“指令”。

我记得我们以前调侃说只要会 Ping 就可以去当网吧网管了(其实网管的工作肯定比这个复杂的多)。

Windows 10 下的 Ping

1
2
3
4
5
6
7
8
9
10
11
12
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 协议.

什么是 ICMP 协议

ICMP 的全称是 Intent Control Message Protocol, 中文过来就是 互联网控制报文协议

网络数据包在庞大的网络中会很多各种不同情况。如果一定需要举一个例子来比如的话,用相当于兵种的侦察兵。时刻给大部队探测前方的情况。以便后方的大部队能够根据不同情况做出不同的调整。所以 ICMP 经常用于网络环境的测试。

互联网控制消息协议(英语:Internet Control Message Protocol,缩写:ICMP)是互联网协议族的核心协议之一。它用于TCP/IP网络中发送控制消息,提供可能发生在通信环境中的各种问题反馈,通过这些信息,使管理者可以对所发生的问题作出诊断,然后采取适当的措施解决。 —— 维基百科

ICMP 协议的格式

用图文表示:
ICMP 协议格式
ICMP 报文封装在 IP 包里面。ICMP 的报文类型根据类型和代码有很多,文章后面有来自维基百科的完整的表格。但是主要分为两类:

A、查询报文
B、差错报文

查询报文 (Echo Request与 Echo Reply)

定义:发送端主动发起请求,并且获取到应答。

常见应用:Ping

Ping 就是主动请求,获取到主动应答。但是 Ping 是在原生的 ICMP 中添加了自定义格式区域。例如 Ping 中放了发送的请求时间,以此计算出路程。所以,其实在 Ping 的报文中会加入序号,以用来区分数据包,从而提高计算时间或者路程的准确性。

差错报文

主要有以下几种:

  1. 源抑制
    发送端发送大量数据时,可能会导致网络( 路由器 )过载,此时过载处可以向发送端发送源抑制的消息,让他降低发送速度。

  2. 终点不可到达
    网络信息不能到达终点,就会给发送端发送一个目的不可到达的信息。告诉发送端可能是设备故障而引起关闭(情况之一)。然后这种又可以再次细分:
    A、网络不可达 — 代码为 0,
    B、主机不可达 — 代码为 1.
    C、协议不可达 — 代码为 2.
    D、端口不可达 — 代码为 3.
    E、需要分段 - 代码为 4.( 必须把数据分段才能去到终点 )

  3. 超时
    网络包超过设置的在网络中的生存时间,还没有达到。

  4. 路由重定向
    定义数据包的路由股则。因为大部分的时候,路由规则是通过相关协议算法生成的,有些时候重新定义过之后,会让这个数据包绕的更远。

常见应用:Traceroute
Traceoute 有点像是在不断试错的意思。是用来侦测主机到目的主机之间所经路由情况的重要工具。Ping 我们知道是可以知道这条大路通不通的,Traceoute 通过设置 TTL 知道到底是哪个路由器不通。
TTL : 数据包在网络中生存时间,也就是通过数据被路由器转发的次数,没转发一次就减一。知道为 0 的时候就抛弃。
Traceroute 的原理:它收到目的主机的 IP 后,首先给目的主机发送一个 TTL=1 的 UDP 数据包,而经过的第一个路由器收到这个数据包以后,就自动把 TTL 减 1,而 TTL 变为 0 以后,路由器就把这个包给抛弃了,并同时产生 一个主机不可达的 ICMP 数据报给主机。如此循环就可以知道所有的路由 IP 了。( ICMP 出错了就会回错误包 )

通常 Traceoute 的目的端口设置的是一个大于 30000 的值( 一般的应用端口号远小于这个数 )。所以如果回复的是 “端口不可达”,那就说明到达终点,否则这个信息就会超时。以此确保 消息是否到达终点。

Traceoute 还有一个有意思的功能,就是确定 MTU(数据最大传输单元),Traceoute 通常对数据不分段,就直接发送,如果如果遇到过程中某个路由转发,出现返回 ICMP 需要分段的错误,就把数据进行拆分,直到最后到达终点。就验证出 MTU。

ICMP 其实还有很多意思的地方,这边就简单的介绍到这里。
附表:
ICMP

作者:FutureEye
链接:https://www.jianshu.com/p/e1795962ad76
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Thank you for your support