推广 热搜: csgo  vue  2023  angelababy  gps  信用卡  新车  htc  落地  控制 

ping的整个流程详解(icmp)

   2023-08-08 网络整理佚名2870
核心提示:不可达的具体消息,发送端主机也就可以了解此次发送不可达的具体原因。在这个消息中包含了最合适的路由信息和源数据。查询报文类型的使用数据包内包含多个字段,最重要的是两个:地址;还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。数据包的时间延迟。差错报文网络包,类型是时间超时。差错报文数据包,如此往复,直到到达目的主机。差错报文消息,但这个差错报文消息的类型是「**端口不可达**」。

原文:ping已经多少年了? 今天终于明白了ping的原理,准备图解教大家! _小林-CSDN博客

原文老板把整个系列写得很好,转载仅供个人记录

文章目录

前言

在日常生活或者工作中,我们判断与对方的网络是否畅通,最常用的命令就是ping命令。

“那你知道ping是如何工作的吗?” ——小林的灵魂拷问

有的朋友可能会奇怪地问:“虽然我不明白它的工作原理,但是我ping也是用Thief 6的!”

你用6个,但是当你在面试官面前的时候,你不能达到6个,毕竟他们也喜欢问问题。

因此,我们要有“知其然,知其所以然”的态度,这样才能避免面试时出门右转的情况。

不知道的人没关系,我们今天就修复它并了解它。 这次把问号去掉,这样问号就少了。

文本IP协议的助手——ICMP协议

Ping是基于ICMP协议工作的,所以要了解Ping的工作原理,首先我们来熟悉一下ICMP协议。

什么是 ICMP?

ICMP 代表互联网控制消息协议。

这里面有一个关键词——控制,怎么控制呢?

网络报文在复杂的网络传输环境中常常会遇到各种问题。 当你遇到问题的时候,你不能不知道就死掉。 不讲理的风格不是计算机网络的风格。 所以有必要把消息传播出去,汇报遇到了什么问题,这样才能调整传播策略,掌控全局。

ICMP 的功能有哪些?

ICMP的主要功能包括:

在IP通信中,如果IP数据包由于某种原因未能到达目的地址,具体原因会通过ICMP通知。

如上例所示,主机A向主机B发送了一个数据包,由于某种原因,途中的路由器2未能发现主机B的存在,此时路由器2就会向主机B发送一个ICMP目的不可达数据包。主机A。表示发送给主机B的数据包不成功。

此 ICMP 通知消息是使用 IP 发送的。

因此,从路由器2返回的ICMP报文将首先经过路由器1,然后按照通常的路由控制转发到主机A。 主机A收到ICMP数据包后,通过分解ICMP头和数据字段来了解问题的具体原因。

ICMP 标头格式

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

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

查询消息类型

回显消息 - 类型 0 和 8

回显消息用于通信的主机或路由器之间判断发送的数据包是否成功到达对端。 ping命令就是利用该消息来实现的。

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

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

在选项数据中,ping还会存储发送请求的时间值,以计算往返时间,表示旅程的长度。

错误消息类型

接下来介绍一些常用的 ICMP 错误消息示例:

目标无法到达消息 ( ) - 类型 3

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

这样,根据具体的ICMP不可达报文,发送主机就可以知道发送不可达的具体原因。

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

为了向大家解释为什么上述目标无法达到,小林牺牲了自己,给大家送了5份外卖

为什么要送外卖? 别问,问是为35岁的林做准备……

网络不可达代码为0

外卖版:

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

普通版:

IP地址分为网络号和主机号,因此当路由器中的路由器表无法匹配接收者IP的网络号时,就会通过ICMP协议通知主机网络不可达的原因( )。

由于不再有网络分类,网络不可达也逐渐不再使用。

主机不可达代码为 1

外卖版:

小林第二次送餐时,这次小区C座有一栋5层楼房,他找到了地方,但送货地址写的是C座601室,表明他找不到这个房间。

普通版:

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

协议不可达代码为2

外卖版:

小林第三次送餐时,这次是小区C座一栋楼,601室。 我找到了地方和房间,但是当我打开门时,一个外国人说英语,而我说中文! 语言不通,外卖送达失败~

普通版:

当主机使用 TCP 协议访问对端主机时,可以找到对端主机,但对端主机的防火墙禁止 TCP 协议访问,此时会通过 ICMP 协议通知主机,并说明该协议的原因无法到达。

端口不可达代码为3

外卖版:

小林第四次送餐时,这次是小区C座一栋楼601室。 我找到了地方和房间,房间里的人也说中文,但人们说他想要的不是食物。 但要表达。 。 。

普通版:

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

需要分片但非分片位码设置为4

外卖版:

小林第五次送外卖时,这次是一位美食博主点了100份外卖,但美食博主要求一次性送完所有外卖,而小林的电动车装不下,所以没办法交付达到。

普通版:

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

然后,发送方主机会收到 ICMP 不可达消息类型(代码 4)消息的通知。

来源抑制消息 (ICMP) - 类型 4

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

ICMP 源抑制消息的目的是缓解这种拥塞。

当路由器向低速线路发送数据,并且其发送队列的缓存变为零而无法发送出去时,可以向IP数据包的源地址发送ICMP源抑制报文。

收到此消息的主机知道整条线路的某个地方出现拥塞,从而增加IP数据包的发送间隔,减少网络拥塞。

但由于这种ICMP可能会造成不公平的网络流量,所以一般不使用。

重定向消息 (ICMP) - 类型 5

如果路由器发现发送主机使用“次优”路径发送数据,则会向该主机返回 ICMP 重定向消息。

该消息中包含最合适的路由信息​​和源数据。 当路由器拥有更好的路由信息​​时,通常会发生这种情况。 路由器会通过这样的ICMP消息通知发送者,以便下次将其发送到另一台路由器。

比如,小林原本可以过马路去一个地方,但是小林不知道,所以他就绕着走去。 后来萧林知道了之后,下次萧林就不会那么傻了,再去兜圈子了。

超时消息(ICMP 时间)- 类型 11

IP数据包中有一个字段叫TTL(Time To Live,生命周期),每经过路由器它的值就会减1,直到达到0,IP数据包就会被丢弃。

此时,路由器将向发送主机发送ICMP超时消息,并通知数据包已被丢弃。

设置IP报文生命周期的主要目的是为了防止当路由控制遇到问题而产生循环时,IP报文在网络上无休止地转发。

另外,TTL有时可以用来控制数据包的到达范围,例如设置较小的TTL值。

ping——查询报文类型的使用情况

接下来我们重点关注ping的发送和接收过程。

主机A和主机B在同一子网下,主机A执行ping主机B后,我们看看这期间发送了什么?

当执行ping命令时,源主机首先构造一个ICMP Echo 消息包。

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

然后,ICMP协议将该数据包与地址192.168.1.2一起交给IP层。 IP层会使用192.168.1.2作为目的地址,本地IP地址作为源地址,将协议字段设置为1表示ICMP协议,并添加一些其他控制信息来构造IP数据包。

接下来,需要添加 MAC 标头。 如果在本地ARP映射表中找到IP地址192.168.1.2对应的MAC地址,则可以直接使用; 如果没有,则需要发送ARP协议查询MAC地址。 数据链路层获得MAC地址后,构造数据帧,目的地址是IP层传过来的MAC地址,源地址是本机的MAC地址; 还添加了一些控制信息,并按照以太网的介质访问规则进行传输。

主机B收到数据帧后,首先检查其目的MAC地址,并与本地MAC地址进行比较。 如果匹配,则接受它,否则丢弃它。

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

主机B会构造一个ICMP回显响应消息包,该回显响应包的类型字段为0,序列号为收到的请求包中的序列号,然后发送给主机A。

在指定时间内,如果源主机没有收到ICMP响应报文,则表示目标主机不可达; 如果收到ICMP回显响应消息,则表明目标主机可达。

此时,源主机会进行检查,并将当前时间减去该数据包最初从源主机发出的时间,即为ICMP数据包的时延。

对于上面发的东西,总结如下:

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

但对于ICMP头来说,没有任何作用。 它会影响根据目的IP地址来选择路由的下一跳,并且每次经过一个路由器到达一个新的局域网时都需要改变MAC头中的MAC地址。

说了这么多,可以看出ping程序使用了ICMP中的ECHO(类型8)和ECHO REPLY(类型0)。

- 错误消息类型的使用

有一个利用 ICMP 错误消息类型的应用程序称为(在 UNIX、MacOS 中这是该命令,在等效命令中是 称为)。

1、功能一

ip的第一个功能是故意设置一个特殊的TTL来跟踪沿途经过的路由器到目的地。

该参数指向目标IP地址:

traceroute 192.168.1.100

这个功能是如何工作的?

其原理是在发送UDP数据包时,利用IP数据包的生存期从1开始按顺序递增,强制接收ICMP超时消息。

例如,如果TTL设置为1,则会牺牲遇到的第一个路由器,然后返回ICMP错误消息网络数据包,类型为超时。

接下来,将TTL设置为2,第一个路由器通过,第二个路由器也牺牲,同时返回ICMP错误数据包,以此类推,直到到达目的主机。

在此过程中,可以获得所有路由器的IP。

当然,有些路由器根本不会返回这个ICMP,因此对于某些公网地址,中间路由是看不到的。

发送方如何知道发送的UDP数据包是否已经到达目的主机?

发送`UDP`数据包时,会填写一个**不可能的端口号**值作为UDP目的端口号(大于`3000`)。 当目的主机收到UDP数据包时,会返回ICMP错误消息,但错误消息的类型为“**端口不可达**”。 因此,**当错误消息类型为端口不可达时,说明发送方发送的UDP数据包已到达目的主机。 **

2、功能二

另一个作用是刻意设置不分片,从而确定路径的MTU。

这样做的目的是什么?

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

因为有时候我们不知道路由器的MTU大小,以太网数据链路上的MTU通常是1500字节,但是非外部网络的MTU值不同,所以我们需要知道MTU大小,所以至于控制发送的数据包大小。

它的工作原理如下:

首先,当发送方主机发送IP数据报时,将IP数据包头部的禁止分片标志位设置为1。根据这个标志,途中的路由器不会对大数据包进行分片,而是丢弃该数据包。

随后,数据链路上的MTU值通过ICMP不可达消息发送到发送主机。 不可达消息的类型为“需要分片但设置了不分片位”。

发送主机每次收到ICMP错误消息时都会缩小数据包大小,以便找到合适的MTU值到达目标主机。

巨人的肩膀

[1] 竹下隆. 图形化 TCP/IP。 人民邮电出版社.

[2] 刘超. 关于网络协议的有趣讨论。 极客时间。

读者问答

有读者问:“有一个问题,A的icmp到达B后,为什么B会自动给A回执0?这是操作系统的底层设计吗?”

你提到的“ 0”是否意味着ICMP类型为0? 如果是,那么B收到A的echo (type 8)ICMP报文,B的主机操作系统协议栈发现这是一个echo ICMP报文,那么协议栈就会组装一个echo (type 0)IMCP响应A 。

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON