第十八篇:一文说清楚ICMP的底层原理

news2024/11/19 14:46:39

作为程序员或者网络工程师,有时候无法访问对方主机;导致这个现象的有很多原因,那要排查具体的网络原因,可能会用到ping的指令。而ping的底层实现是互联⽹控制报⽂协议(ICMP)。

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

  • ICMP 功能都有啥?

ICMP 主要的功能包括:

① 确认 IP 包是否成功送达⽬标地址

② 报告发送过程中 IP 包被废弃的原因和改善⽹络设置等。

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

注意:

① ICMP是基于IP协议工作的,但是它并不是传输层的功能,因此人们仍把它归结于网络层协议。

② ICMP只能搭配IPv4使用。如果是IPv6的情况下,需要使用ICMPv6。

如上图例⼦,主机 A 向主机 B 发送了数据包,由于某种原因,途中的路由器 2 未能发现主机 B 的存在,这时,路由器 2 就会向主机 A 发送⼀个 ICMP ⽬标不可达数据包,说明发往主机 B 的包未能成功。

ICMP 的这种通知消息会使⽤ IP 进⾏发送。

因此,从路由器 2 返回的 ICMP 包会按照往常的路由控制先经过路由器 1 再转发给主机 A 。收到该 ICMP包的主机 A 则分解 ICMP 的⾸部和数据域以后得知具体发⽣问题的原因。

  • ICMP报文格式

说明

① 类型:1字节,说明该报文属于什么类型。

② 代码:1字节,说明ICMP报文的代码。

③ 检验和:2字节,检验ICMP报文是否有错误。

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

① 查询报⽂类型

ICMP协议报文里面的类型是08的时候说明这是一个查询报⽂

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

② 差错报⽂类型

ICMP协议报文里面的类型不是08的时候说明这是一个差错报⽂

目标不可达

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

举例 6 种常⻅的⽬标不可达类型的代码

a. ⽹络不可达

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

b.  主机不可达

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

c. 协议不可达

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

d. 端⼝不可达

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

e. 需要进⾏分⽚但设置了不分⽚

发送端主机发送 IP 数据报时,将 IP ⾸部的分⽚禁⽌标志位设置为 1 。根据这个标志位,途中的路由器遇到超过MTU ⼤⼩的数据包时,不会进⾏分⽚,⽽是直接抛弃。

原点抑制消息(ICMP Source Quench Message):

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

ICMP 原点抑制消息的⽬的就是为了缓和这种拥堵情况。当路由器向低速线路发送数据时,其发送队列的缓存变为零⽽⽆法发送出去时,可以向 IP 包的源地址发送⼀个 ICMP 原点抑制消息

收到这个消息的主机借此了解在整个线路的某⼀处发⽣了拥堵的情况,从⽽增⼤ IP 包的传输间隔,减少⽹络拥堵的情况。 然⽽,由于这种 ICMP 可能会引起不公平的⽹络通信,⼀般不被使⽤。

定向消息(ICMP Redirect Message):

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

在这个消息中包含了最合适的路由信息和源数据。这主要发⽣在路由器持有更好的路由信息的情况下。路由器会通过这样的 ICMP 消息告知发送端,让它下次发给另外⼀个路由器。

超时消息(ICMP Time Exceeded Message)

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

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

设置 IP 包⽣存周期的主要⽬的,是为了在路由控制遇到问题发⽣循环状况时,避免 IP 包⽆休⽌地在⽹络上被转发。

此外,有时可以⽤ TTL 控制包的到达范围,例如设置⼀个较⼩的 TTL

  • ping命令

ping的报文格式

相⽐原⽣的 ICMP,这⾥多了两个字段:

① 标识符:⽤以区分是哪个应⽤程序发 ICMP 包,⽐如⽤进程 PID 作为标识符;

② 序号:序列号从 0 开始,每发送⼀次新的回送请求就会加 1 , 可以⽤来确认⽹络包是否有丢失。

使用方法

ping + 域名或IP

ping命令执行细节

① ping命令会发送一个ICMP Echo Request给对端

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

ICMP报文被ICMP协议的实现程序组织好后,交给网络层的程序处理,加上源地址IP与目的IP,再传给数据链路层,加上源MAC地址与目的MAC地址;然后发送出去

说明:源和目的IP为上图的IP

② 对端接收后,返回一个ICMP Echo Reply

③ 注意是在主机A网络层发出ICMP Echo Request,在主机B接收到网络层,再发出ICMP Echo Reply

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

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

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

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

但是对于 ICMP 的头来讲,是没什么影响的。会影响的是根据⽬标 IP 地址,选择路由的下⼀跳,还有每经过⼀个路由器到达⼀个新的局域⽹,需要换 MAC 头⾥⾯的 MAC 地址。

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

  • traceroute命令

traceroute充分利⽤ ICMP 差错报⽂类型;(在UNIX、MacOS中是这个命令,⽽在Windows中对等的命令叫做 tracert )。

  1. 使用

Windowstracert + 域名或IP地址

Linux/macOStraceroute + 域名或IP地址

① 定位从源主机到目标主机之间经过了哪些路由器,以及到达各个路由器的耗时

原理: traceroute使用UDP,主机之间通信,网络层IP数据报的首部中,有个TTL字段(Time To Live)。TTL的作用是,设置IP数据报被丢弃前,最多能够经过的节点数。

每经过一个中间节点,再向下一个节点转发数据前,都会将TTL减1。如果TTL不为0,则将数据报转发到下一个节点;否则,丢弃数据报,并返回错误错误类型是时间超时

问题如何判断报文是否到达目标主机?

traceroute发送UDP报文时,将目标端口设置为较大的值( 33434 - 33464),避免目标主机B上该端口有在实际使用。

当报文到达目标主机B,目标主机B发现目标端口不存在,则向源主机A发送ICMP报文(Type=3,Code=3),表示目标端口不可达。

源主机A收到差错报文,发现Type=3,Code=3,知道已经到达目标主机B。记录下IP、耗费,检测结束。

 故意设置不分⽚,从⽽确定路径的 MTU

有的时候我们并不知道路由器的 MTU ⼤⼩,以太⽹的数据链路上的 MTU 通常是 1500 字节,但是⾮以外⽹的 MTU 值就不⼀样了,所以我们要知道 MTU 的⼤⼩,从⽽控制发送的包⼤⼩。

它的⼯作原理如下:

⾸先在发送端主机发送 IP 数据报时,将 IP 包⾸部的分⽚禁⽌标志位设置为 1。根据这个标志位,途中的路由器不会对⼤数据包进⾏分⽚,⽽是将包丢弃。

随后,通过⼀个 ICMP 的不可达消息将数据链路上 MTU 的值⼀起给发送主机,不可达消息的类型为「需要进⾏分⽚但设置了不分⽚位」。发送主机端每次收到 ICMP 差错报⽂时就减少包的⼤⼩,以此来定位⼀个合适的 MTU 值,以便能到达⽬标主机。

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

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

相关文章

清华系“仓颉”来袭:图形起源:用AI颠覆字体设计,推动大模型商业化落地

大模型如何落地?又该如何实现商业化?这一议题已成为今年科技领域的焦点话题。 在一个鲜为人知的字体设计赛道上,清华创业公司“图形起源”悄然实现了商业变现:他们帮助字体公司将成本降低了80%,生产速度提升了10倍以上…

网站优化门槛低了还是高了?

自从2015年刚接触网站时,从一无所知到现在无人指导,一直跌跌撞撞走过来,当年花了1500元找了广东一个网友用织梦CMS做了一个门户网站,记得那时一星期没下楼,把网站折腾的千疮百孔,而终逐步熟悉网站建设与搜索…

手机怎样改网络ip地址?内容详尽实用

随着网络技术的发展,更改手机IP地址已成为一种常见需求。本文将详细介绍如何在不同网络环境下更改手机IP地址,包括移动网络和WiFi网络,以及同时适用于两种网络的方法,内容详尽实用,干货满满。 一、适用于移动网络&…

sentinel微服务部署

一.启动nacos和redis 1.查看是否有nacos和redis docker ps -a2.启动nacos和redis docker start nacos docker start redis-6379 docker ps 二.使用openfeign项目 这里看我另一个博客OpenFeign微服务部署-CSDN博客,我把SpringSessiondemo复制后改为sentinel1…

钡铼技术R10工业4G路由在智能交通中的应用

随着物联网技术的迅猛发展,智能交通系统(Intelligent Transportation System, ITS)正逐渐成为现代城市交通管理的重要组成部分。智能交通系统通过集成先进的信息技术、通信技术、传感技术以及计算机处理技术,实现对交通信息的实时…

抖店API接口系列(商品详情数据),Json数据格式参考

抖店API接口系列中的商品详情数据接口允许第三方应用通过编程方式访问抖音小店的商品数据。这些数据通常包括商品的基本信息、价格、库存、用户评价等,并且会以JSON数据格式返回。以下是一个抖店商品详情数据JSON格式的参考示例: { "status":…

共享购模式:绿色积分引领消费新潮流

绿色消费浪潮席卷全球,绿色积分作为一种创新的激励机制,正受到越来越多消费者的青睐。在众多消费模式中,共享购模式凭借独特的绿色积分体系,不仅推动了绿色消费,还为消费者带来了更多实惠与额外收益,成为市…

解数独Python

怎样解数独? Python def setBoardFunc(puz): global grid print("Original Sudoku") for i in range(0, len(puz), 9): row puz[i:i9] temp [] for block in row: temp.append(int(block)) g…

简单理解程序地址空间:Linux 中的内存映射与页表解析

ps: Linux操作系统对于程序地址,物理地址的处理,对于源码,我也看不大懂,只是截取当我们进程发生正常缺页中断的时候的调用情况。本文中所有的源码都是进行截取过的,如果大家感兴趣可以去下载源码。 在Linux 操作系统 …

【Linux】wsl2安装ubuntu并移动安装位置

本文首发于 ❄️慕雪的寒舍 1.启用wsl 首先是启用你的wsl,参考本站wsl安装centos8中的教程; 启用wsl后,更新一下,并设置版本为2; wsl --update wsl --set-default-version 2 # 设置wsl版本为2,不然可能安装失败2.安…

【FPGA开发】Modelsim仿真精度的坑

问题所在 最近在使用黑金的AXU3EG板卡对着正点原子ZYNQ7020的例程进行移植学习。但在编写tb代码以及使用modelsim进行仿真时出了问题,发现我的实际波形与正点的对不上,仔细测量一下波形发现,我的系统时钟是6ns周期,而不是理想中的…

某象异形滑块99%准确率方案

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 该文章模型已经上线ocr识别网站,欢迎测试!!,地址:https://yxlocr.windy-rain.cn/ocr/slider/6 所谓的顶象异形滑块,是指没有采用常规的缺口,使用各种形状的…

20.安卓逆向-frida基础-hook分析调试技巧2-hookDES

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:图灵Python学院 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。 工…

MEMS 课本习题(1)

Chapter 5 Lump Modeling 为了将机械系统转换为等效电路,我们需要将各个机械元件转换为相应的电气元件。以下是机械元件和其电气等效元件的对照关系: 质量(m) - 转换为 电感(L)弹簧(k&#xff…

SD入门教程一:Stable Diffusion 基础(技术篇)

前言 在开篇的时候就大致讲了SD和VAE,那么今天我们具象化地再来讲讲Stable Diffusion(稳定扩散)。 严格说来它是一个由几个组件(模型)构成的系统,而非单独的一个模型。我以最常见的文生图为例,…

PCL 计算3DSC并可视化

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 法线计算 2.1.2 3DSC特征计算 2.1.3 可视化3DSC直方图 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总&#…

【C++】——继承【上】

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。 P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。 博主主页:Yan. yan.                        …

MPLS解决BGP路由黑洞问题

文章目录 MPLS应用实验实验配置 MPLS应用实验 实验目的:解决BGP中IBGP邻居之间存在的问题 MPLS解决BGP路由黑洞问题实验 配置完基本的MPLS和BGP操作之后,只有R2和R5上面有两个私网的路由,中间的设备没有私网路由,这时候默认还是走…

Linux源码阅读笔记-USB驱动分析

基础层次详解 通用串行总线(USB)主要用于连接主机和外部设备(协调主机和设备之间的通讯),USB 设备不能主动向主机发送数据。USB 总线采用拓扑(树形),主机侧和设备侧的 USB 控制器&a…

IT招聘乱象的全面分析

近年来,IT行业的招聘要求似乎越来越苛刻,甚至有些不切实际。许多企业在招聘时,不仅要求前端工程师具备UI设计能力,还希望后端工程师精通K8S服务器运维,更有甚至希望研发经理掌握所有前后端框架和最新开发技术。这种招聘…