当你「ping 一下」的时候,你知道它背后的逻辑吗

转载自  当你「ping 一下」的时候,你知道它背后的逻辑吗

我们在遇到网络不通的情况,大家都知道去 ping 一下,看一下网络状况。
那你知道「ping」命令后背的逻辑是什么吗?知道它是如何实现的吗?

一、「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协议再详细解释一下。

二、什么是「 ICMP 」?

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

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

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

将上图再细拆一下可见:

继续将ICMP协议模块细拆:

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

ICMP协议大致可分为两类:

  • 查询报文类型

  • 差错报文类型

  1. 查询报文类型

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

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

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

  1. 差错报文类型

差错报文主要产生于当数据传送发送错误的时候。
它包括:目标不可达(网络不可达、主机不可达、协议不可达、端口不可达、禁止分片等)、超时、参数问题、重定向(网络重定向、主机重定向等)等等。

差错报文通常包含了引起错误的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的原理确实很取巧,很有趣。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324628.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

POJ1611-嫌犯【图论,并查集】

正题 题目链接: http://poj.org/problem?id1611 大意 有n个人,m个组,有一个流感嫌犯,流感嫌犯会将所在的组的所有人变成流感嫌犯,求流感嫌犯的数量。 解题思路 并查集将各个组合并,然后看看那些人是和…

python的三元运算

a 10 b 5if a > 15 :c a else:c bd a if a > 15 else bd 值1 if 条件A else 值2如果条件A成立,就取左边的 值1,则 取 值2

​凌云KTV点歌系统功能简介

19级青鸟三班 凌云小组指导老师:穆雄雄老师 班主任:王欣欣老师小组成员:组长:李磊 副组长:杨云浩组员:高启航 朱齐 李欣然 高松 张方仪 王浩如 苏荟旭 贾增伟制作周期:2020年9月25日-10月…

REST参考手册

总说接口定义要遵守 RESTful,那么什么是REST呢,今天跟小编一起来了解一下这个规范吧~! 原文作者简介: BRIAN SLETTEN是一个关注前沿技术的软件工程师,现居于加州奥本。他的职业生涯横跨了各个行业,包括零售…

漫画:如何用栈实现队列

转载自 漫画:如何用栈实现队列 栈的特点是先入后出,出入元素都是在同一端(栈顶): 入栈: 出栈: 队列的特点是先入先出,出入元素是在不同的两端(队头和队尾)…

POJ2524——宗教(Ubiquitous Religions)【图论,并查集】

正题 题目链接&#xff1a; http://poj.org/problem?id2524 大意 有n个学生&#xff0c;告诉你哪两个学生的宗教相等&#xff0c;求校园里有多少个宗教。 解题思路 并查集链接就好了 代码 #include<cstdio> using namespace std; int n,m,x,y,s,father[50001],t; i…

深入理解python的元组本身不可变性

元组本身不可修改&#xff0c; 如果包含可修改的数据类型&#xff0c; 那被包含的数据类型可以修改。

SQ小组KTV点歌系统简介

19级青鸟三班 SQ小组指导老师&#xff1a;穆雄雄老师 班主任&#xff1a;王欣欣老师小组成员:组长:王世泽 副组长:张坤鹏 组员:渠德春 徐龙翥 泮迎国 程至婷 樊永奇 杜坤凯 李含笑 吴俊衫1项目整体运行视频&#xff1a;KTV前端主页点歌系统主页进入主页面后左边第一个是演唱…

什么是ABTest

转载自 什么是ABTest 在互联网公司的业务发展过程中&#xff0c;用户增长是永恒的主题&#xff0c;因为没有增长也就没有发展&#xff0c;所以在业务发展的早期产品迭代速度往往是越快越好&#xff0c;总之一句话&#xff1a;“怎么快怎么来”&#xff0c;至于系统建设得是否可…

Quartz.net基于数据库的任务调度管理(Only.Jobs)

一 前言&#xff1a; 各大调度组件优缺点在这就不讨论了&#xff0c;使用Quartz.net是因为它可以执行秒级任务。 Only.Jobs 项目通过将各Job存储在数据库中&#xff0c;启动一个专门的Job管理任务来循环调度各Job的的调度情况。 项目分为 Web管理系统 、服务运行端 、数据…

畅想小组KTV点歌系统简介

19级青鸟三班畅想小组指导老师&#xff1a;穆雄雄老师班主任&#xff1a;王欣欣老师小组成员:组长:毛帅龙 副组长:扈明旺组员:张俊豪 靖相民 袁康凯 魏子凯 李明义 魏婉莹 谢润祺 项目整体运行视频&#xff1a;1主页面功能&#xff1a;可以根据用户所需要的页面进行显示和隐藏…

POJ2560-雀斑(Freckles)【图论,并查集,最小生成树,KURUSKAL】

正题 题目链接&#xff1a; http://poj.org/problem?id2560 大意 有n个点&#xff0c;给出坐标&#xff0c;求连接这n个点的最短路线 解题思路 KURUSKAL算法求最小生成树。 代码 #include<cstdio> #include<cmath> #include<algorithm> using namespac…

使用Docker Swarm搭建分布式爬虫集群

转载自 使用Docker Swarm搭建分布式爬虫集群 在爬虫开发过程中&#xff0c;你肯定遇到过需要把爬虫部署在多个服务器上面的情况。此时你是怎么操作的呢&#xff1f;逐一SSH登录每个服务器&#xff0c;使用git拉下代码&#xff0c;然后运行&#xff1f;代码修改了&#xff0c;…

Docker~从Dockerfile到Container的过程

上一文章&#xff0c;主要介绍Dockerfile里各参数的含义&#xff0c;以及在项目文件里这些内容的含义&#xff0c;因为大叔认为官方和网上其它文章说的有些模棱两可&#xff0c;不太好让大家理解&#xff0c;所有我又从新写了一个大白话的文章&#xff0c;希望可以给大家一些帮…

驭梦KTV点歌系统简介

19级青鸟三班驭梦小组指导老师&#xff1a;穆雄雄老师班主任&#xff1a;王欣欣老师小组成员&#xff1a;组 长&#xff1a;刘文瑞 副组长&#xff1a;陈浴森组员&#xff1a;蒋建强、翟帅、谢学致、申世业、潘浩杨、芦泽宇、季淑琦、冯涵婷制作周期&#xff1a;2020年9月25日-…

一文让你秒懂字符编码

字符编码 文字是如何显示的 128 64 32 16 8 4 2 165 0 1 0 0 0 0 0 1 108 0 1 1 0 1 1 0 1 148 0 0 1 1 0 0 0 0二进制 ——》十进制 9 A 1101101 l 1101101 e x 11011011101101 设定为&#xff0c;每8个2进制位代表一个字符 论断句的重要性 8bit 1bytes 字节 &#…

ssl1222-矩形【图论,并查集】

正题 大意 有n个正方形&#xff0c;求块数。 解题思路 用并查集求块数 代码 #include<cstdio> #include<algorithm> using namespace std; int i,lt[7001],x1[7001],y1[7001],x2[7001],y2[7001],n,s; int father(int x) {if (lt[x]!x) lt[x]father(lt[x]);ret…

漫画:什么是桶排序

转载自 漫画&#xff1a;什么是桶排序 计数排序需要根据原始数列的取值范围&#xff0c;创建一个统计数组&#xff0c;用来统计原始数列中每一个可能的整数值所出现的次数。 原始数列中的整数值&#xff0c;和统计数组的下标是一一对应的&#xff0c;以数列的最小值作为偏移…

shiro初步学习

文章目录一、 Shiro 简介二、 *Shiro 架构原理*三、 INI文件介绍四、 Shiro环境搭建及认证实现五、 第一个Shiro演示六、 授权七、 加密及凭证匹配器八、 自定义Realm九、 凭证匹配器一、 Shiro 简介 1 概述 权限体系在现代软件应用中有着非常重要的地位。一个应用如果没有权限…