图解:Ping 命令的工作原理

目录

一、ping 命令使用的是 ICMP 协议

二、ping —— 工作原理分析

1、打个 ICMP 数据包 - 网络层

2、打个 IP 数据包 - 网络层:

3、加入 Mac 头信息 - 数据链路层

4、接收端 拆解包:物理层-数据链路层-网络层

5、接收端 构建响应包,返回给发送端

6、整体流程图

三、IP协议的助手 —— ICMP 协议

1、 ICMP 是什么

2、ICMP 功能都有什么

3、ICMP 包头格式

4、ICMP 包头的类型 之 查询报文类型

5、ICMP 包头的类型 之 差错报文类型

1>、目标不可达消息(Destination Unreachable Message) —— 类型为 3

2>、原点抑制消息(ICMP Source Quench Message) —— 类型 4

3>、重定向消息(ICMP Redirect Message) —— 类型 5

4>、超时消息(ICMP Time Exceeded Message) —— 类型 11

四、ICMP 协议的应用:traceroute

1. traceroute 作用一:故意设置特殊的 TTL

1>、这个作用是如何工作的呢?

2>、发送方如何知道发出的 UDP 包是否到达了目的主机呢?

2. traceroute 作用二:故意设置不分片

1>、这么做是为了什么?

2>、它的工作原理如下:


一、ping 命令使用的是 ICMP 协议

ping 命令使用的,既不是 tcp 报文,也不是 udp 报文

它用的是 ICMP 协议,与 IP 协议同级,属于 网络层,位于 tcp、udp(传输层)的下一层。【应用层、传输层、网络层、数据链路层、物理层】

 

二、ping —— 工作原理分析

接下来,我们来看 ping发送和接收过程

同个子网下的主机 A 和 主机 B,主机 A 执行ping 主机 B 后,我们来看看其间发送了什么?

 

1、打个 ICMP 数据包 - 网络层

ping 命令执行的时候,源主机首先会构建一个 ICMP 回送请求消息数据包。

ICMP 数据包内包含多个字段,最重要的是两个:

  • 第一个是类型,对于回送请求消息而言该字段为 8
  • 另外一个是序号,主要用于区分连续 ping 的时候发出的多个数据包。

每发出一个请求数据包,序号会自动加 1。为了能够计算往返时间 RTT,它会在报文的数据部分插入发送时间。

 

2、打个 IP 数据包 - 网络层

然后,由 ICMP 协议将这个数据包连同地址 192.168.1.2 一起交给 IP 层。

IP 层将以 192.168.1.2 作为目的地址,本机 IP 地址作为源地址协议字段设置为 1 表示是 ICMP 协议,

再加上一些其他控制信息,构建一个 IP 数据包。

 

3、加入 Mac 头信息 - 数据链路层

接下来,需要加入 MAC 头。

如果在本地 ARP 映射表中查找出 IP 地址 192.168.1.2 所对应的 MAC 地址,则可以直接使用;

如果没有,则需要发送 ARP 协议查询 MAC 地址,获得 MAC 地址后,由数据链路层构建一个数据帧,目的地址是 IP 层传过来的 MAC 地址,源地址则是本机的 MAC 地址;

还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。

 

4、接收端 拆解包:物理层-数据链路层-网络层

主机 B 收到这个数据帧后,先检查它的目的 MAC 地址,并和本机的 MAC 地址对比,如符合,则接收,否则就丢弃。

接收后检查该数据帧,将 IP 数据包从帧中提取出来,交给本机的 IP 层。同样,IP 层检查后,将有用的信息提取后交给 ICMP 协议。

 

5、接收端 构建响应包,返回给发送端

主机 B 会构建一个 ICMP 回送响应消息数据包,回送响应数据包的类型字段为 0序号为接收到的请求数据包中的序号,然后再发送出去给主机 A。

在规定的时候间内,源主机如果没有接到 ICMP 的应答包,则说明目标主机不可达;如果接收到了 ICMP 回送响应消息,则说明目标主机可达。

此时,源主机会检查,用当前时刻减去该数据包最初从源主机上发出的时刻,就是 ICMP 数据包的时间延迟。

 

6、整体流程图

针对上面发送的事情,总结成了如下图:

【注】:

在TCP/IP模型中,ARP协议属于IP层;在OSI模型中,ARP协议属于链路层。

 

当然这只是最简单的,同一个局域网里面的情况。如果跨网段的话,还会涉及网关的转发、路由器的转发等等。

但是对于 ICMP 的头来讲,是没什么影响的。

会影响的是根据目标 IP 地址,选择路由的下一跳,还有每经过一个路由器到达一个新的局域网,需要换 MAC 头里面的 MAC 地址。

说了这么多,可以看出 ping 这个程序是使用了 ICMP 里面的 ECHO REQUEST(类型为 8 ) 和 ECHO REPLY (类型为 0)

 

三、IP协议的助手 —— ICMP 协议

 

1、 ICMP 是什么

ICMP 全称是 Internet Control Message Protocol,也就是互联网控制报文协议

里面有个关键词 —— 控制,如何控制的呢?

网络包在复杂的网络传输环境里,常常会遇到各种问题。当遇到问题的时候,总不能死的不明不白,没头没脑的作风不是计算机网络的风格。所以需要传出消息,报告遇到了什么问题,这样才可以调整传输策略,以此来控制整个局面。

 

2、ICMP 功能都有什么

ICMP 主要的功能包括:

确认 IP 包是否成功送达目标地址、

报告发送过程中 IP 包被废弃的原因、

改善网络设置等

IP 通信中如果某个 IP 包因为某种原因未能达到目标地址,那么这个具体的原因将由 ICMP 负责通知

如上图例子,主机 A 向主机 B 发送了数据包,由于某种原因,途中的路由器 2 未能发现主机 B 的存在,

这时,路由器 2 就会向主机 A 发送一个 ICMP 目标不可达数据包,说明发往主机 B 的包未能成功。

ICMP 的这种通知消息会使用 IP 进行发送 。

因此,从路由器 2 返回的 ICMP 包会按照往常的路由控制先经过路由器 1 再转发给主机 A

收到该 ICMP 包的主机 A 则分解 ICMP 的首部和数据域以后得知具体发生问题的原因。

 

3、ICMP 包头格式

ICMP 报文是封装在 IP 包里面,它工作在网络层,是 IP 协议的助手。

 

ICMP 包头的类型字段,大致可以分为两大类:

  • 一类是用于诊断的查询消息,也就是「查询报文类型
  • 另一类是通知出错原因的错误消息,也就是「差错报文类型

 

4、ICMP 包头的类型 之 查询报文类型

“ 回送消息 —— 类型 08

回送消息用于进行通信的主机或路由器之间,判断所发送的数据包是否已经成功到达对端的一种消息,ping 命令就是利用这个消息实现的。

可以向对端主机发送回送请求的消息(ICMP Echo Request Message,类型 8),也可以接收对端主机发回来的回送应答消息(ICMP Echo Reply Message,类型 0)。

相比原生的 ICMP,这里多了两个字段:

  • 标识符:用以区分是哪个应用程序发 ICMP 包,比如用进程 PID 作为标识符;
  • 序号:序列号从 0 开始,每发送一次新的回送请求就会加 1, 可以用来确认网络包是否有丢失。

选项数据中,ping 还会存放发送请求的时间值,来计算往返时间,说明路程的长短。

 

5、ICMP 包头的类型 之 差错报文类型

接下来,说明几个常用的 ICMP 差错报文的例子:

  • 目标不可达消息 —— 类型 为 3
  • 原点抑制消息 —— 类型 4
  • 重定向消息 —— 类型 5
  • 超时消息 —— 类型 11

 

1>、目标不可达消息(Destination Unreachable Message) —— 类型为 3

IP 路由器无法将 IP 数据包发送给目标地址时,会给发送端主机返回一个目标不可达的 ICMP 消息,并在这个消息中显示不可达的具体原因,原因记录在 ICMP 包头的代码字段。

由此,根据 ICMP 不可达的具体消息,发送端主机也就可以了解此次发送不可达的具体原因

举例 6 种常见的目标不可达类型的代码

  • 网络不可达代码为 0
  • 主机不可达代码为 1
  • 协议不可达代码为 2
  • 端口不可达代码为 3
  • 需要进行分片但设置了不分片位代码为 4

 

举例说明五种 “目标不可达” 类型:

 

a. 网络不可达代码为 0

外卖版本:

小林第一次送外卖时,小区里只有 A 和 B 区两栋楼,但送餐地址写的是 C 区楼,小林表示头上很多问号,压根就没这个地方。

正常版本:

IP 地址是分为网络号和主机号的,所以当路由器中的路由器表匹配不到接收方 IP 的网络号,就通过 ICMP 协议以网络不可达Network Unreachable)的原因告知主机。

自从不再有网络分类以后,网络不可达也渐渐不再使用了。

 

b. 主机不可达代码为 1

外卖版本:

小林第二次送外卖时,这次小区有 5 层楼高的 C 区楼了,找到地方了,但送餐地址写的是 C 区楼 601 号房 ,说明找不到这个房间。

正常版本:

当路由表中没有该主机的信息,或者该主机没有连接到网络,那么会通过 ICMP 协议以主机不可达Host Unreachable)的原因告知主机。

 

c. 协议不可达代码为 2

外卖版本:

小林第三次送外卖时,这次小区有 C 区楼,也有 601 号房,找到地方了,也找到房间了,但是一开门人家是外国人说的是英语,我说的是中文!语言不通,外卖送达失败~

正常版本:

当主机使用 TCP 协议访问对端主机时,能找到对端的主机了,可是对端主机的防火墙已经禁止 TCP 协议访问,那么会通过 ICMP 协议以协议不可达的原因告知主机。

 

d. 端口不可达代码为 3

外卖版本:

小林第四次送外卖时,这次小区有 C 区楼,也有 601 号房,找到地方了,也找到房间了,房间里的人也是说中文的人了,但是人家说他要的不是外卖,而是快递。。。

正常版本:

当主机访问对端主机 8080 端口时,这次能找到对端主机了,防火墙也没有限制,可是发现对端主机没有进程监听 8080 端口,那么会通过 ICMP 协议以端口不可达的原因告知主机。

 

e. 需要进行分片但设置了不分片位代码为 4

外卖版本:

小林第五次送外卖时,这次是个吃播博主点了 100 份外卖,但是吃播博主要求一次性要把全部外卖送达,小林的一台电动车装不下呀,这样就没办法送达了。

正常版本:

发送端主机发送 IP 数据报时,将 IP 首部的分片禁止标志位设置为1。根据这个标志位,途中的路由器遇到超过 MTU 大小的数据包时,不会进行分片,而是直接抛弃。

随后,通过一个 ICMP 的不可达消息类型,代码为 4 的报文,告知发送端主机。

 

2>、原点抑制消息(ICMP Source Quench Message) —— 类型 4

在使用低速广域线路的情况下,连接 WAN 的路由器可能会遇到网络拥堵的问题。

ICMP 原点抑制消息的目的就是为了缓和这种拥堵情况

当路由器向低速线路发送数据时,其发送队列的缓存变为零而无法发送出去时,可以向 IP 包的源地址发送一个 ICMP 原点抑制消息

收到这个消息的主机借此了解在整个线路的某一处发生了拥堵的情况,从而增大 IP 包的传输间隔,减少网络拥堵的情况。

然而,由于这种 ICMP 可能会引起不公平的网络通信,一般不被使用。

 

3>、重定向消息(ICMP Redirect Message) —— 类型 5

如果路由器发现发送端主机使用了「不是最优」的路径发送数据,那么它会返回一个 ICMP 重定向消息给这个主机。

在这个消息中包含了最合适的路由信息和源数据。这主要发生在路由器持有更好的路由信息的情况下。

路由器会通过这样的 ICMP 消息告知发送端,让它下次发给另外一个路由器。

好比,小林本可以过条马路就能到的地方,但小林不知道,所以绕了一圈才到,后面小林知道后,下次小林就不会那么再绕一圈了。

 

4>、超时消息(ICMP Time Exceeded Message) —— 类型 11

IP 包中有一个字段叫做 TTLTime To Live,生存周期),它的值随着每经过一次路由器就会减 1,直到减到 0 时该 IP 包会被丢弃。

此时,路由器将会发送一个 ICMP 超时消息给发送端主机,并通知该包已被丢弃。

设置 IP 包生存周期的主要目的,是为了在路由控制遇到问题发生循环状况时,避免 IP 包无休止地在网络上被转发。

此外,有时可以用 TTL 控制包的到达范围,例如设置一个较小的 TTL 值

 

四、ICMP 协议的应用:traceroute

有一款充分利用 ICMP 差错报文类型的应用叫做 traceroute(在UNIX、MacOS中是这个命令,而在Windows中对等的命令叫做 tracert )。

 

1. traceroute 作用一:故意设置特殊的 TTL

traceroute 的第一个作用就是故意设置特殊的 TTL,来追踪去往目的地时沿途经过的路由器。

traceroute 的参数指向某个目的 IP 地址

traceroute 192.168.1.100

 

1>、这个作用是如何工作的呢?

它的原理就是利用 IP 包的生存期限1 开始按照顺序递增的同时发送 UDP 包,强制接收 ICMP 超时消息的一种方法。

比如,将 TTL 设置 为 1,则遇到第一个路由器,就牺牲了,接着返回 ICMP 差错报文网络包,类型是时间超时

接下来将 TTL 设置为 2,第一个路由器过了,遇到第二个路由器也牺牲了,也同时返回了 ICMP 差错报文数据包,如此往复,直到到达目的主机。

这样的过程,traceroute 就可以拿到了所有的路由器 IP。

当然有的路由器根本就不会返回这个 ICMP,所以对于有的公网地址,是看不到中间经过的路由的。

 

2>、发送方如何知道发出的 UDP 包是否到达了目的主机呢?

traceroute 在发送 UDP 包时,会填入一个不可能的端口号值作为 UDP 目标端口号(大于 3000 )。当目的主机,收到 UDP 包后,会返回 ICMP 差错报文消息,但这个差错报文消息的类型是「端口不可达」。

所以,当差错报文类型是端口不可达时,说明发送方发出的 UDP 包到达了目的主机。

 

2. traceroute 作用二:故意设置不分片

traceroute 还有一个作用是故意设置不分片,从而确定路径的 MTU

 

1>、这么做是为了什么?

这样做的目的是为了路径MTU发现

因为有的时候我们并不知道路由器的 MTU 大小,以太网的数据链路上的 MTU 通常是 1500 字节,但是非以太网的 MTU 值就不一样了,所以我们要知道 MTU 的大小,从而控制发送的包大小。

 

2>、它的工作原理如下:

首先在发送端主机发送 IP 数据报时,将 IP 包首部的分片禁止标志位设置为 1

根据这个标志位,途中的路由器不会对大数据包进行分片,而是将包丢弃。

随后,通过一个 ICMP 的不可达消息将数据链路上 MTU 的值一起给发送主机,不可达消息的类型为「需要进行分片但设置了不分片位」。

发送主机端每次收到 ICMP 差错报文时就减少包的大小,以此来定位一个合适的 MTU 值,以便能到达目标主机。

 

  • 16
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 《编译系统透视:图解编译原理》是一本以图解为主导的编译原理教材。编译原理是计算机科学中的一门重要课程,主要研究编译器的设计和实现方法。 《编译系统透视:图解编译原理》通过直观的图解方式,清晰地阐述了编译器的工作原理和各个环节的具体实现。书中从语言的词法分析、语法分析、语义分析,到代码生成和优化等方面,系统地介绍了编译器的整个工作流程。 这本教材的一大特色是使用大量的图示来展示编译器的各个过程,这使得抽象和复杂的概念变得直观易懂。图解的方式可以帮助读者更好地理解编译器的工作原理,并且能够通过具体的例子更好地掌握编译器设计和实现的方法。 《编译系统透视:图解编译原理》适合计算机相关专业的学生和从事编译器开发相关工作的人员阅读。对于初学者来说,这本书可以帮助他们建立对编译原理的基本理解和认知。对于已经具备一定编译器基础的人员来说,这本书可以帮助他们进一步深入理解编译器的实现细节和技术要点。 总之,《编译系统透视:图解编译原理》是一本十分优秀的编译原理教材,通过图解的方式生动展示了编译器的工作原理,不仅有助于读者理解编译原理的基本概念,也有助于读者掌握编译器的设计和实现方法。 ### 回答2: 《编译系统透视:图解编译原理》是一本由高级程序设计语言编译原理方面的专家撰写的编译原理教材。该书结合图解的方式,以简明易懂的语言介绍了编译系统的基本概念和原理,帮助读者理解编译器的工作原理及其在程序开发中的作用。 书中首先介绍了编译器的基本功能和作用,以及编译器的主要组成部分,如词法分析器、语法分析器等。然后,通过具体的案例分析,详细解释了编译器的各个组成部分的工作流程和原理,并伴有大量的示意图,有助于读者更好地理解。特别是对一些较为复杂的编译原理概念,如语法分析树、中间代码生成等,通过图解的方式进行了详细解释。 同时,该书还介绍了一些实际的编译器实现技术和工具,如词法分析器生成器、语法分析器生成器等。这些工具的使用可以大大简化编译器的实现过程,并提高编译器的效率和可靠性。书中提供了对这些工具的简单介绍和使用方法,帮助读者快速上手。 总的来说,《编译系统透视:图解编译原理》是一本非常实用的编译原理入门教材,它不仅讲解了编译器的基本原理和工作流程,还介绍了一些实用的工具和技术。通过学习这本书,读者不仅可以对编译原理有一个全面的了解,还可以更好地理解和使用现有的编译器工具。无论是对正在学习编译原理的学生,还是对从事程序开发的程序员来说,这本书都是一本不可多得的参考书。 ### 回答3: 编译系统透视:图解编译原理是一本图文并茂的编译原理教材,通过图解的方式生动地介绍了编译系统的工作原理和过程。编译系统是将高级程序语言转换成可执行代码的工具,它包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等多个阶段。 该书首先介绍了编译系统的基本概念和作用,并通过图示来解释编译器的组成部分。然后,详细讲解了编译器的各个阶段,包括词法分析器的工作原理、语法分析器的LL(1)文法和LR分析方法、语义分析器的类型检查和符号表管理等内容。同时,还揭示了中间代码生成、代码优化和目标代码生成的关键技术和原理。 该书以通俗易懂的方式介绍编译器相关的核心概念和算法,通过图解的方式形象地展示整个编译过程,使读者能够更好地理解和掌握编译原理。此外,书中还提供了大量的实例和练习题,帮助读者加深对编译原理的理解和应用。 总之,编译系统透视:图解编译原理是一本理论与实践相结合的编译原理教材,适合计算机相关专业的学生和从事编译器开发的工程师阅读。它通过图解的方式使抽象的编译原理变得直观易懂,帮助读者深入了解编译系统的运作机制,提高编写高效编译器的能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值