ICMP协议详解

ICMP(Internet Control Message Protocol)协议是一个网络层协议。 一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通;但是IP协议并不提供可靠传输。如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因。因此我们需要ICMP协议来完成这样的功能。

一、 功能

ICMP协议的功能主要有:

  1. 确认IP包是否成功到达目标地址
  2. 通知在发送过程中IP包被丢弃的原因

在这里插入图片描述

我们需要注意:ICMP是基于IP协议工作的,但是它并不是传输层的功能,因此仍然把它归结为网络层协议。

二、报文格式

ICMP报文包含在IP数据报中,IP报头在ICMP报文的最前面。一个ICMP报文包括IP报头(至少20字节)、ICMP报头(至少八字节)和ICMP报文(属于ICMP报文的数据部分)。当IP报头中的协议字段值为1时,就说明这是一个ICMP报文。

ICMP报头如下图所示:
在这里插入图片描述

  • 类型:占1字节,标识ICMP报文的类型,从类型值来看ICMP报文可以分为两大类。第一类是取值为1~127的差错报文,第2类是取值128以上的信息报文
  • 代码:占1字节,标识对应ICMP报文的代码。它与类型字段一起共同标识了ICMP报文的详细类型
  • 校验和:占2字节,这是对包括ICMP报文数据部分在内的整个ICMP数据报的校验和,以检验报文在传输过程中是否出现了差错
  • 内容:占8字节。

三、常见的差错报文

常见的ICMP报文可以分为两大类,即差错报文和查询报文。

1.差错报文

常见的ICMP差错报文有以下几种:目的站不可达、数据报超时等。

目的站不可达
目的地不可达由主机或其入站网关生成,以通知客户端由于某种原因目的地不可达。出现此消息的原因可能包括: 与主机的物理连接不存在(距离无限);指定的协议或端口未激活;数据必须分段,但“不分段”标志已打开。不可到达的 TCP 端口特别以TCP RST响应,而不是像预期的那样以目标不可到达类型 3 进行响应。对于IP 多播传输,永远不会报告目标不可达。
在这里插入图片描述
类型字段(位 0–7)必须设置为 3
代码字段(位 8-15)用于指定错误类型,可以是以下任何一种:

代码描述
0网络不可达错误。
1主机无法访问错误。
2协议不可达错误(不支持指定的传输协议)。
3端口不可达错误(指定协议无法通知主机传入消息)。
4数据报太大。数据包分段是必需的,但“不分段”(DF) 标志已打开。
5源路由失败错误。
6目标网络未知错误。
7目标主机未知错误。
8源主机隔离错误。
9目标网络在管理上被禁止
10目标主机被管理禁止。
11对于服务类型,网络无法访问。
12对于服务类型无法访问主机。
13通信被管理禁止(管理过滤阻止数据包转发)。
14主机优先级冲突(表示主机或网络和端口的组合不允许请求的优先级)。
15优先级截止有效(数据报的优先级低于网络管理员设置的级别)。

下一跳 MTU字段(位 48-63)包含发生代码 4 错误时下一跳网络的 MTU。[15]
包含IP 标头和附加数据以允许客户端将回复与导致目标无法到达回复的请求进行匹配。

数据报超时
超时由网关生成,以通知由于生存时间字段达到零而丢弃的数据报的源。如果主机未能在其时限内 重组分段数据报,则也可能会发送超时消息。

Traceroute实用程序使用超时消息来识别两个主机之间路径上的网关。
在这里插入图片描述
类型必须设置为 11
代码指定超时消息的原因,包括以下内容:

代码描述
0运输过程中超过了生存时间。
1超过片段重组时间。

源主机使用IP 标头和原始有效负载的前 64 位将超时消息与丢弃的数据报进行匹配。对于UDP和TCP等更高级别的协议,64 位有效负载将包括丢弃数据包的源端口和目标端口。

2.查询报文

常见的ICMP查询报文有以下几种:回送请求或回答、时间戳请求或回答、路由器询问和通告、信息请求或回答、地址掩码请求或回答。

其中用得较多的是回送请求或回答、时间戳请求或回答,其他的三种查询报文目前几乎很少被用到,以前它们主要在主机启动时使用,通过使用这三种查询报文,主机能确定自身在网络环境中IP地址、地址掩码、路由器状况等信息,现在,DHCP协议已经能够完全实现这些功能。此外,在互联网中的两台主机能够使用时间戳请求或回答报文来确定数据报在彼此之间往返所需要的时间。

时间戳

时间戳用于时间同步。原始时间戳设置为发送者最后一次接触数据包的时间(自午夜以来以毫秒为单位)。不使用接收和发送时间戳。
在这里插入图片描述

类型必须设置为 13
代码必须设置为0
客户端可以使用标识符和序列号来将时间戳回复与时间戳请求进行匹配。
原始时间戳是自世界时间(UT)午夜以来的毫秒数。如果 UT 参考不可用,则可以设置最高有效位来指示非标准时间值。

时间戳回复
时间戳回复回复时间戳消息。它由时间戳发送方发送的原始时间戳以及指示何时接收时间戳的接收时间戳和指示何时发送时间戳回复的传输时间戳组成。
在这里插入图片描述
类型必须设置为 14
代码必须设置为0
客户端可以使用标识符和序列号来将回复与引起回复的请求进行匹配。
原始时间戳是发送者在发送消息之前最后接触消息的时间。
接收时间戳是回显器在接收时第一次接触它的时间。
传输时间戳是回显器在发送消息时最后一次接触消息的时间。
所有时间戳均以自世界标准时间午夜以来的毫秒为单位。如果时间不可用(以毫秒为单位)或无法提供相对于午夜 UT 的时间,则可以将任何时间插入到时间戳中,前提是时间戳的高位也设置为指示此非标准值。

使用时间戳和时间戳回复消息来同步互联网节点的时钟已经很大程度上被基于UDP的网络时间协议和精确时间协议所取代。

四、应用

  1. 错误报告:

    • 目的地不可达:当路由器或网关无法将IP数据包转发到目的地时,会向发送方返回一个“目的地不可达”消息。
    • 时间超出:如果数据包在网络中的存活时间(TTL, Time to Live)耗尽,未到达目的地,会发送时间超出消息告知发送者。
    • 参数问题:如果IP数据包的头部有错误,将发送参数问题消息给发送方。
    • 改变路由(重定向):路由器发出重定向消息以告诉发送主机有一个更好的路由可供选择。
  2. 网络诊断工具:

    • 回声请求/应答(Echo Request/Reply):这是ping命令背后的机制。发送方发送一个回声请求消息,接收方以回声应答消息响应。这通常用于测试网络连接的连通性和延迟。
    • 时间戳请求/应答:用于请求/响应发送者和接收者之间的时间戳信息,可用于计算往返时间并同步时钟。
  3. 网络设备和服务的可达性测试:

    • 使用ICMP回声请求和应答,可以测试网络上特定设备是否可达,并获取有关网络延迟的信息。
  4. 网络拥塞控制:

    • 路由器通过ICMP“来源抑制”(Source Quench)消息向发送方报告网络拥塞情况,建议发送方减少发送速率。注:来源抑制消息在较新的网络实践中不常使用,因为其功能通常由更复杂的拥塞控制机制取代,如TCP的拥塞控制算法。
  5. 路径MTU发现:

    • ICMP通过不允许分片的“片过大”(Fragmentation Needed and DF Set)消息,被用来执行路径MTU发现过程。这个过程的目的是确定到目的地路径上任何一点的最大传输单元(MTU)的大小。

提问:为什么ping的地址不是完整的URL?

ping是在网络层工作的,并且直接与目标主机的IP地址交互,而不处理传输层或应用层的协议,如TCP/UDP或HTTPS。

当您在浏览器中输入https://作为网页的一部分时,这个前缀指定了您希望使用HTTP协议的安全变体(HTTPS)。HTTP和HTTPS是应用层协议,它们使用TCP协议(位于传输层)在客户端和服务器之间传输数据。HTTPS特别使用加密和TLS/SSL证书来保护传输数据的安全。

因此,“https://”前缀对于ping命令来说没有意义,因为ping不涉及这些高层的网络协议。当您想用ping测试服务器的可达性时,您应该直接使用服务器的IP地址或域名,而不是完整的URL。

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

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

相关文章

Java中Integer(127)==Integer(127)为True,Integer(128)==Integer(128)却为False,这是为什么?

文章目录 1.前言2. 源码解析3.总结 1.前言 相信大家职业生涯中或多或少的碰到过Java比较变态的笔试题,下面这道题目大家应该不陌生: Integer i 127; Integer j 127;Integer m 128; Integer n 128;System.out.println(i j); // 输出为 true System.o…

Unknown encoder ‘libmp3lame

环境: macos m1 , python3.10.x 背景 做视频切片, 使用moviepy 中VideoFileClip进行截取视频。 报错: Unknown encoder libmp3lameThe audio export failed because FFMPEG didnt find the specified codec for audio encoding …

【ARMv8M Cortex-M33 系列 7 -- RA4M2 移植 RT-Thread 问题总结】

请阅读【嵌入式开发学习必备专栏 】 文章目录 问题小结栈未对齐 经过几天的调试,成功将rt-thead 移植到 RA4M2(Cortex-M33 核)上,thread 和 shell 命令已经都成功支持。 问题小结 在完成 rt-thread 代码 Makefile 编译系统搭建…

Django开发_19_form表单前后端关联(1)

实例分析,过程使用URL反向解析知识: Django开发_12_URL反向解析、重定向-CSDN博客y 一、实例代码 (一)主路由urls.py: path("work4/", include("work4_app.urls",namespace"work4")), (二)app内urls.py: from djang…

利用大数据靶向肿瘤细胞的基因突变

在亚利桑那健康科学大学,研究人员正在应用大量数据,试图更多地了解这种突变、其变异以及任何可能有助于他们治疗患者的相关因素。 癌症的潜在原因很多,从食物和环境到创伤和感染。在遗传学方面,研究人员发现,有一种基因…

uniapp app更新

uniapp app更新 这个版本要随之增加,不然刚更新时直接用app, 新包增加的那些页面跳转会有问题,不能跳新的页面 //app更新检测 updataApp(){const that this;uni.showLoading({title:加载中...})plus.runtime.getProperty(plus.runtime.appid, functio…

解密:消息中间件的选择与使用:打造高效通信枢纽

目录 第一章:消息中间件介绍 1.1 什么是消息中间件 1.2 消息中间件的作用 1.3 消息中间件的分类 第二章:消息中间件的选择标准 2.1 性能 2.2 可靠性 2.3 可扩展性 2.4 易用性 2.5 社区支持 2.6 成本 第三章:常见的消息中间件对比…

解决 [Vue warn]:Avoid mutating a prop directly 警告

错误信息 [Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop’s value. Prop being mutated: “xxx” 错误原因 所有的 prop 都使得…

蓝桥杯备战——3.定时器前后台

1.STC15F2k61S2的定时器 阅读STC15系列的手册,我们可以看到跟STC89C52RC的定时器还是有不同之处的: 由上图可以看到我们可以通过AUXR寄存器直接设置定时器的1T/12T模式了 在定时器0/1模式上也可以设置为16位自动重装载。 另外需要注意IAP15F2K61S2只有…

nvm安装的node,脚手架安装 vue 项目时报错

npm install -g vue/cli 时报错 解决办法 //修改npm的资源镜像: npm config set registry http://registry.npm.taobao.org重新脚手架安装 npm install -g vue/cli成功到下一步,当执行:vue create my-vue-demo时又报新的错 原因:【HTTPS …

part2. jdk9/10/11/12/16新特性详解

1.jdk9 1.1 模块化机制 定义模块:module-info.java module com.newfeature.test {requires java.se;requires lombok;requires junit; }package com.newfeature.test;import java.lang.reflect.Field;public class Main {public static void main(String[] args) …

Element UI样式修改之NavMenu导航菜单箭头样式修改

UI设计稿给的菜单箭头样式可能与我们饿了么组件NavMenu的菜单箭头样式不一致,目前我们侧边导航菜单的上下翻转箭头如下所示: 希望得到如下的结果: 找到饿了么Icon里我们想要向下箭头,F12后复制content内容content: “\e790”; content: "\e790";然后将默认的c…

C语言基本概念

目录 2.1 编写一个简单的C程序 2.1.1 编译和链接 2.1.2 集成开发环境 2.2 简单程序的一般形式 2.2.1 指令 2.2.2 函数 2.2.3 语句 2.3 注释 2.4 变量和赋值 2.4.1 类型 2.4.2 声明 2.4.3 赋值 2.4.4 显示变量的值 2.4.5 初始化 2.4.6 显示表达式的值 2.5 读入…

网络通信(15)-C#TCP客户端掉线重连实例

本文上接前面的文章使用Socket在C#语言环境下完成TCP客户端的掉线重连实例。 掉线重连需要使用心跳包发送测试网络的状态,进而进入重连循环线程。 前面实例完成的功能: 客户端与服务器连接,实现实时刷新状态。 客户端接收服务器的数据。 客户端发送给服务器的数据。 客…

pytorch代码实现注意力机制之MLCA

MLCA注意力机制 简要:注意力机制是计算机视觉中使用最广泛的组件之一,可以帮助神经网络强调重要元素并抑制不相关的元素。然而,绝大多数信道注意力机制仅包含信道特征信息而忽略了空间特征信息,导致模型表示效果或目标检测性能较…

docker之部署青龙面板

青龙面板是一个用于管理和监控 Linux 服务器的工具,具有定时运行脚本任务的功能。在实际情况下也可以用于一些定期自动签到等任务脚本的运行。 本次记录下简单的安装与使用,请提前安装好docker,参考之前的文章。 一、安装部署 1、拉取镜像 # …

weak_ptr 与 一个难发现的错误(循环依赖问题)笔记

推荐B站视频:7.weak_ptr与一个非常难发现的错误_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV18B4y187uL/?p7&spm_id_frompageDriver&vd_sourcea934d7fc6f47698a29dac90a922ba5a3一、weak_ptr weak_ptr并不拥有所有权并不能调用 -> 和 解引…

ACL--访问控制列表概述、组成、分类、应用

目录 一、ACL概述 二、ACL的组成 三、ACL分类 四、举例说明 1、基于标准ACL和基础的高级ACL应用 2、基于端口的ACL 一、ACL概述 访问控制列表ACL(Access Control List)是由一条或多条规则组成的集合。所谓规则,是指描述报文匹配条件的…

黑马程序员——javase进阶——day02——关键字,接口,代码块,枚举

目录: Java中的关键字 static关键字final关键字Java中的权限修饰符代码块 构造代码块静态代码块接口 接口的介绍接口的定义和特点接口的成员特点接口的案例接口中成员方法的特点枚举随堂小记 继承方法重写抽象类模板设计模式staticfinal权限修饰符接口回顾上午内容…

大数据开发之Spark(完整版)

第 1 章:Spark概述 1.1 什么是spark 回顾:hadoop主要解决,海量数据的存储和海量数据的分析计算。 spark是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。 1.2 hadoop与spark历史 hadoop的yarn框架比spark框架诞生的晚&#xff…