Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >脑残式网络编程入门(五):每天都在用的Ping命令,它到底是什么?

脑残式网络编程入门(五):每天都在用的Ping命令,它到底是什么?

原创
作者头像
JackJiang
发布于 2018-09-21 10:11:52
发布于 2018-09-21 10:11:52
1.5K0
举报
文章被收录于专栏:即时通讯技术即时通讯技术

本文引用了公众号纯洁的微笑作者奎哥的技术文章,感谢原作者的分享。

1、前言

老于网络编程熟手来说,在测试和部署网络通信应用(比如IM聊天、实时音视频等)时,如果发现网络连接超时,第一时间想到的就是使用Ping命令Ping一下服务器看看通不通。甚至在有些情况下通过图形化的Ping命令工具对目标网络进行长测(比如:《两款增强型Ping工具:持续统计、图形化展式网络状况 [附件下载]》、《网络测试:Android版多路ping命令工具EnterprisePing[附件下载]》),可以得出当前网络通信的网络延迟、网络丢包率、网络抖动等等有价值信息。

Ping命令很简单,但作为为数不多的网络检测工具,却非常有用,是开发网络应用时最常用到的命令。虽然“Ping”这个动作这么简单,但你知道Ping命令背后后的逻辑吗?这就是本文要告诉你!

2、系列文章

本文是系列文章中的第5篇,本系列大纲如下:

脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手》 《脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?》 《脑残式网络编程入门(三):HTTP协议必知必会的一些知识》 《脑残式网络编程入门(四):快速理解HTTP/2的服务器推送(Server Push)》 《脑残式网络编程入门(五):每天都在用的Ping命令,它到底是什么?》(本文)

3、Ping命令的作用和原理

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

ping 命令是基于 ICMP 协议来工作的,「 ICMP 」全称为 Internet 控制报文协议(Internet Control Message Protocol)。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协议再详细解释一下,请继续往下读。

4、正确理解ICMP协议

Ping命令所基于的ICMP协议所处的网络模型层级:

(▲ 上图来自《计算机网络通讯协议关系图(中文珍藏版)[附件下载]》,您可下载此图的完整清晰版)

Ping命令这么简单,在任何系统上上手就能使用,很多人可能想当然的认为Ping命令使用的ICMP协议应该是基于传输层的TCPUDP协议的吧。

正如上图所示,ICMP协议既不是基于TCP,也不是基于UDP,而是直接基于网络层的IP协议,在整个网络协议栈中属于相当底层的协议了。这也从侧面证明了它的重要性,因为根据ICMP的RFC手册规定:ICMP协议是任何支持IP协议的系统必须实现的,没有余地。而IP协议是整个互联网的基石,ICMP协议虽简单,但重要性不言而喻。

所以,以后面视的时候,如果碰到“ICMP协议是基于什么实现的?”这样的问题,请一定要记往此节所讲的内容。

5、深入ICMP协议

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

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

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

将上图再细拆一下可见:

继续将ICMP协议模块细拆:

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

ICMP协议大致可分为两类:

1)查询报文类型;

2)差错报文类型。

【关于查询报文类型】:

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

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

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

【关于差错报文类型】:

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

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

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

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

6、ICMP差错报文的妙用

正如上一节所介绍的那样,ICMP协议主要有:查询报文类型和差错报文类型两种。对于差错报文来说,是不是只有遇到错误的时候才能使用呢?不是!

基于这个特性,Linux下的Traceroute指令(Windows下的对等指令是tracert)利于ICMP的差错报文可以实现遍历到数据包传输路径上的所有路由器!这真是个有用的命令!

百度百科上关于traceroute命令的用途:

traceroute (Windows 系统下是tracert) 命令利用ICMP 协议定位您的计算机和目标计算机之间的所有路由器。TTL 值可以反映数据包经过的路由器或网关的数量,通过操纵独立ICMP 呼叫报文的TTL 值和观察该报文被抛弃的返回信息,traceroute命令能够遍历到数据包传输路径上的所有路由器。

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

traceroute的基本原理如下图所示:

具体做法就是:

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

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

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

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

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

可见Traceroute的原理确实很取巧,很有趣。如您对Traceroute感兴趣,可以深入读一读《从Traceroute看网络问题》一文。

附录:更多网络编程精华文章

TCP/IP详解 - 第11章·UDP:用户数据报协议》 《TCP/IP详解 - 第17章·TCP:传输控制协议》 《TCP/IP详解 - 第18章·TCP连接的建立与终止》 《TCP/IP详解 - 第21章·TCP的超时与重传》 《技术往事:改变世界的TCP/IP协议(珍贵多图、手机慎点)》 《通俗易懂-深入理解TCP协议(上):理论基础》 《通俗易懂-深入理解TCP协议(下):RTT、滑动窗口、拥塞处理》 《理论经典:TCP协议的3次握手与4次挥手过程详解》 《理论联系实际:Wireshark抓包分析TCP 3次握手、4次挥手过程》 《计算机网络通讯协议关系图(中文珍藏版)》 《UDP中一个包的大小最大能多大?》 《P2P技术详解(一):NAT详解——详细原理、P2P简介》 《P2P技术详解(二):P2P中的NAT穿越(打洞)方案详解》 《P2P技术详解(三):P2P技术之STUN、TURN、ICE详解》 《通俗易懂:快速理解P2P技术中的NAT穿透原理》 《高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少》 《高性能网络编程(二):上一个10年,著名的C10K并发连接问题》 《高性能网络编程(三):下一个10年,是时候考虑C10M并发问题了》 《高性能网络编程(四):从C10K到C10M高性能网络应用的理论探索》 《高性能网络编程(五):一文读懂高性能网络编程中的I/O模型》 《高性能网络编程(六):一文读懂高性能网络编程中的线程模型》 《不为人知的网络编程(一):浅析TCP协议中的疑难杂症(上篇)》 《不为人知的网络编程(二):浅析TCP协议中的疑难杂症(下篇)》 《不为人知的网络编程(三):关闭TCP连接时为什么会TIME_WAIT、CLOSE_WAIT》 《不为人知的网络编程(四):深入研究分析TCP的异常关闭》 《不为人知的网络编程(五):UDP的连接性和负载均衡》 《不为人知的网络编程(六):深入地理解UDP协议并用好它》 《不为人知的网络编程(七):如何让不可靠的UDP变的可靠?》 《网络编程懒人入门(一):快速理解网络通信协议(上篇)》 《网络编程懒人入门(二):快速理解网络通信协议(下篇)》 《网络编程懒人入门(三):快速理解TCP协议一篇就够》 《网络编程懒人入门(四):快速理解TCP和UDP的差异》 《网络编程懒人入门(五):快速理解为什么说UDP有时比TCP更有优势》 《网络编程懒人入门(六):史上最通俗的集线器、交换机、路由器功能原理入门》 《网络编程懒人入门(七):深入浅出,全面理解HTTP协议》 《网络编程懒人入门(八):手把手教你写基于TCP的Socket长连接》 《技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解》 《让互联网更快:新一代QUIC协议在腾讯的技术实践分享》 《现代移动端网络短连接的优化手段总结:请求速度、弱网适应、安全保障》 《聊聊iOS中网络编程长连接的那些事》 《移动端IM开发者必读(一):通俗易懂,理解移动网络的“弱”和“慢”》 《移动端IM开发者必读(二):史上最全移动弱网络优化方法总结》 《IPv6技术详解:基本概念、应用现状、技术实践(上篇)》 《IPv6技术详解:基本概念、应用现状、技术实践(下篇)》 《从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路》 《以网游服务端的网络接入层设计为例,理解实时通信的技术挑战》 《迈向高阶:优秀Android程序员必知必会的网络基础》 >> 更多同类文章 ……

(本文同步发布于:http://www.52im.net/thread-1973-1-1.html

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
听说你 ping 用的很 6 ?给我图解一下 ping 的工作原理!
在日常生活或工作中,我们在判断与对方网络是否畅通,使用的最多的莫过于 ping 命令了。
小林coding
2020/03/31
8260
当你「ping 一下」的时候,你知道它背后的逻辑吗?
我们在遇到网络不通的情况,大家都知道去 ping 一下,看一下网络状况。 那你知道「ping」命令后背的逻辑是什么吗?知道它是如何实现的吗?
奎哥
2018/10/09
1.8K0
当你「ping 一下」的时候,你知道它背后的逻辑吗?
网络协议 5 - ICMP 与 ping:投石问路的侦察兵
    日常开发中,我们经常会碰到查询网络是否畅通以及域名对应 IP 地址等小需求,这时候用的最多的应该就是 ping 命令了。 那你知道 ping 命令是怎么工作的吗?今天,我们就来一起认识下 ping 命令及其对应的 ICMP 协议。
北国风光
2019/04/11
1.1K0
网络协议 5 - ICMP 与 ping:投石问路的侦察兵
你知道ping命令是如何工作的吗?
我们用来测试一台机器与另一台机器的网络连通性一般会使用ping命令,那么你知道ping命令是如何工作的吗?ping命令是基于ICMP协议工作的。
Regan Yue
2023/07/10
4340
你知道ping命令是如何工作的吗?
用侦察兵的故事趣讲ICMP和Ping,看完想忘都难!
无论是在宿舍,还是在办公室,或者运维一个数据中心,我们常常会遇到网络不通的问题。那台机器明明就在那里,你甚至都可以通过机器的终端连上去看。它看着好好的,可是就是连不上去,究竟是哪里出了问题呢?
网络技术联盟站
2020/09/22
8980
用侦察兵的故事趣讲ICMP和Ping,看完想忘都难!
HCNP学习笔记之ICMP协议与ping原理以及用Python实现ping
一、ICMP协议分析 ICMP:Internet控制报文协议。由于IP协议并不是一个可靠的协议,它不保证数据被成功送达,那么,如何才能保证数据的可靠送达呢? 这里就需要使用到一个重要的协议模块ICMP
Jetpropelledsnake21
2018/07/04
1.5K0
ICMP 协议分析
ICMP是(Internet Control Message Protocol)Internet控制报文协议,它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。
用户8418197
2021/07/03
1.6K0
ICMP协议是什么
我们经常用ping命令,但是可能不知道ping命令的底层协议是ICMP,那到底什么是ICMP
opencode
2022/12/26
1K0
ICMP协议是什么
计算机网络:ICMP协议(Internet控制消息协议)介绍
这里推荐一篇实用的文章:《idea的springboot项目如何看mysql位置》,作者:【用户10024547】。
小明互联网技术分享社区
2024/12/06
2510
计算机网络:ICMP协议(Internet控制消息协议)介绍
【建议收藏】通俗易懂图解网络面试知识-第一篇
关于网络的知识,我这里主要是从OSI分层,网络协议等相关的知识,大家一起来学习,觉得不错,记得点赞,转发,在看哦。
公众号-利志分享
2022/06/13
4010
【建议收藏】通俗易懂图解网络面试知识-第一篇
所谓 ICMP,不过将军与士卒而已
关于这点我们在 IP 协议那篇文章中提过一嘴,IP 协议作为一种提供不可靠数据交付的网络层协议,在传输的过程中,其 IP 数据报可能会发生丢失、重复、延迟和乱序等各种情况, 但是 IP 协议对这些糟糕的情况并不拥有有效的检测和弥补措施,当然更不会将这些结果通知收发双方。
飞天小牛肉
2021/05/14
4690
所谓 ICMP,不过将军与士卒而已
脑残式网络编程入门(六):什么是公网IP和内网IP?NAT转换又是什么鬼?
搞网络通信应用开发的程序员,可能会经常听到外网IP(即互联网IP地址)和内网IP(即局域网IP地址),但他们的区别是什么?又有什么关系呢?另外,内行都知道,提到外网IP和内网IP就不得不提NAT路由转换这种东西,那这双是什么鬼?本文就来简单讲讲这些到底都是怎么回事。
JackJiang
2018/11/20
2K0
ICMP (互联网控制消息协议 )是什么
互联网控制消息协议(英语:Internet Control Message Protocol,缩写:ICMP)是互联网协议族的核心协议之一。
微风-- 轻许--
2022/04/13
7770
【网络层】DHCP协议(应用层)、ICMP、IPv6详解
即插即用联网服务-------允许地址重用----------支持移动用户加入网络-----------支持在用地址续租
20岁爱吃必胜客
2022/12/30
8330
【网络层】DHCP协议(应用层)、ICMP、IPv6详解
互联网医生-ICMP协议
在《IP协议详解》入门文章中,IP协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完成。其中一个重要的模块就是网际报文控制协议(InternetControl Message ProtocoL,ICMP )。
网络工程师笔记
2021/05/17
8200
互联网医生-ICMP协议
ICMP 协议「建议收藏」
ICMP(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。 ICMP使用IP的基本支持,就像它是一个更高级别的协议,但是,ICMP实际上是IP的一个组成部分,必须由每个IP模块实现。 中文名 ICMP 外文名 Internet Control Message Protocol 类 型 控制报文协议 协议族 TCP/IP协议族 归 属 网络层协议 作 用 在主机与路由器之间传递控制信息
全栈程序员站长
2022/11/01
2.1K1
ICMP 协议「建议收藏」
一文吃透ICMP协议:网络诊断与故障排查的关键利器
ICMP(Internet Control Message Protocol)即网际控制报文协议,是 TCP/IP 协议族的重要成员,工作在网络层,与 IP 协议、ARP 协议、RARP 协议及 IGMP 协议共同构成了 TCP/IP 模型中的网络层 。它就像是网络世界中的 “交通警察” 和 “维修工人”,主要负责在 IP 主机、路由器之间传递控制消息,包括报告错误、交换受限控制和状态信息等,以确保网络数据传输的顺畅与稳定。
用户11396661
2025/02/28
2540
一文吃透ICMP协议:网络诊断与故障排查的关键利器
网络世界中的侦察兵----ICMP
学习了IP协议后,都知道IP协议本身是不提供可靠性保障的,那么数据包在这么复杂的互联网环境中传输,总会遇到问题,如果遇到问题后,被丢弃、无回应,可能作为工程师的我们来说都不知道发生了什么事,更别提普通用户了,所以数据包发送出去如果被丢弃、或者某些原因造成的不可达,需要一种协议来进行通知原因,这个协议就是这篇要讲解的ICMP。
网络之路一天
2024/01/08
2580
网络世界中的侦察兵----ICMP
网络编程懒人入门(九):通俗讲解,有了IP地址,为何还要用MAC地址?
标题虽然是为了解释有了 IP 地址,为什么还要用 MAC 地址,但是本文的重点在于理解为什么要有 IP 这样的东西。本文对读者的定位是知道 MAC 地址是什么,IP 地址是什么。
JackJiang
2018/11/16
1.1K0
linux网络95值工具,Linux下网络故障排查工具之ping|traceroute和tcptraceroute|mtr工具[通俗易懂]
服务器运维人员在日常运维服务器的过程中经常会遇到服务器网络故障,有服务器硬件造成的,也有服务商网络问题造成的,也有区域网络问题造成的,这个时候就需要用到ping,traceroute,mtr这三个命令
全栈程序员站长
2022/08/31
1.6K0
推荐阅读
相关推荐
听说你 ping 用的很 6 ?给我图解一下 ping 的工作原理!
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档