哈工大计算机网络课程网络层协议详解之:互联网控制报文协议(ICMP)

news2024/9/20 18:11:16

哈工大计算机网络课程网络层协议详解之:互联网控制报文协议(ICMP)

在互联网中,IP数据报的传输很容易出现差错,当出现差错时,最简单的处理办法就是对该IP数据报进行丢弃。但是,并不是直接丢弃就完了,为了让源主机感知到数据报出现差错,当数据报被丢弃时,IP网络会借助于ICMP协议,向发送数据报的源主机发送一个ICMP差错报文。本节详细介绍ICMP协议的原理和报文格式、以及用途。

互联网控制报文协议ICMP

ICMP协议支持主机或路由器:

  • 差错(或异常)报告。
  • 主动发送一些特殊的ICMP报文对网络进行探询。

实现上述功能的原理,主要是借助于发送一些特定的ICMP报文。根据ICMP协议所实现的功能,发送的ICMP报文可以主要分为以下两大类:

  • 差错报告报文(5种)

    • 目的不可达。 当IP数据报已经到达目的主机,但无法实现成功交付的场景(比如目的端口有异常),此时IP数据报会被丢弃,并向源主机发送这种“目的不可达”的ICMP报文。
    • 源抑制(Source Quench)。 该报文与网络中的拥塞控制相关。当路由器发现自己缓存已满,导致新到的IP数据报会被丢弃时,会主动向源主机发送“源抑制”报文,希望源主机在收到该ICMP报文后,降低其自身数据发送速率。
    • 超时/超期。 与IP数据报格式种的TTL字段相关。IP数据报中的TTL字段定义了该报文能够被路由器转发的次数,每转发一次,则TTL减一。当减为0时,会被路由器丢弃,并向源主机发送一个“超时/超期”ICMP报文,报告此类差错。
    • 参数问题。 当路由器在转发一个IP数据报时,如果发现IP数据报中存在参数异常,则可以选择丢弃,并向源主机发送一个“参数问题”报文,报告此类差错。
    • 重定向(redirect)。 当路由器收到一个IP数据报,而这个IP数据报所要到达的目的网络不应该由这个路由器进行转发,而应该由这个网络连接的另一个路由器进行转发的话。此时,路由器可以向源主机发送一个“重定向”报文,让源主机将到达这个网络的IP数据报重定向到另一个网关上去。
  • 网络探询报文(2种)。 由主机或路由器主动发送探询网络状态。

    • 回声(Echo)请求与应答报文(Reply)。

      当主机向探询到另一个主机之间的网络是否通达,可以发送回声请求报文,通过接收回声报文的响应,来探测网络是否可达。此类报文最典型的,也就最经常使用的就是Ping工具。

    • 时间戳请求与应答报文。

典型ICMP报文

典型ICMP报文示例如所示:

图中可以看出,ICMP报文是通过一个类型+编码的形式来标识不同类型报文,不同类型的报文对应了各自表示的含义。

在这里插入图片描述

ICMP例外情况

并不是所有IP数据报的出错,都会发送ICMP报文,下面是几种不发送ICMP差错报文的特殊情况:

  • 对ICMP差错报告报文不再发送ICMP差错报告报文。

    ICMP报文实际上是要封装到IP数据报中进行传输的,当一个IP数据报在传输过程中出错了,就会向源主机发送一个ICMP差错报文。这个差错报文会再次封装到另外一个IP数据报中,如果这个数据报出错了,就不再发送这个数据报的ICMP差错报文。

  • 除第1个IP数据报分片外,对所有后续分片均不发送ICMP差错报告报文。

  • 对所有多播IP数据报均不发送ICMP差错报告报文。

  • 对具有特殊地址(如127.0.0.0或0.0.0.0)的IP数据报不发送ICMP差错报告报文。

其次,还有一些原始的ICMP报文,在现在的互联网中已经不再使用了:

  • 信息请求与应答报文
  • 子网掩码请求和应答报文
  • 路由器询问和通告报文

ICMP报文格式

前面我们提到,ICMP报文是需要封装到IP数据报中进行传输的。因此,ICMP报文也是由首部和数据部分进行传输的。首部的前4个字节都是一样的,包括了类型、代码、校验和等信息。数据部分的长度取决于不同的ICMP报文类型。

在这里插入图片描述

下面以ICMP差错报告报文的报文格式来说明:

在这里插入图片描述

我们知道,ICMP差错报告报文是由于一个IP数据报在传输过程中差错或异常,此时该IP数据报会被丢弃,并向源主机发送ICMP差错报告报文。

在差错报告报文中,实际上,需要封装出差错的这个IP数据报的完整的IP首部,以及前8个字节的数据。为什么要这样做呢?

假设这个出差错的IP数据报封装的是一个UDP数据段,而对于UDP数据段来说,前8个字节包含了完整的UDP首部。 此时,对应构造的ICMP差错报文就会把完整的IP首部+UDP首部一起封装,返回给源主机。源主机就非常清晰地知道源和目的IP地址,端口号等重要信息。

假设这个出差错地IP数据报封装地是一个TCP数据段,对于TCP数据段来说,前8个字节不是完整地TCP首部(TCP首部完整应该是20个字节)。但是,TCP段首部前8个字节包含了重要的源端口号,目的端口号信息,有了这些信息,仍然能很好的还原出差错的IP数据报访问的是什么应用。

因此,综上所示,ICMP报文封装差错信息时,数据字段只封装了差错IP数据部分的前8个字节的数据。

进一步的,这些差错信息也要封装到IP数据报中,因此,上述差错IP数据报的首部,以及数据部分前8个字节,再加上ICMP协议定义的前8字节,共同构成了ICMP差错报文IP数据报的数据部分,最后添加上IP首部,即构成了最终封装好ICMP差错报文的IP数据报格式。

ICMP的应用举例:Traceroute

Traceroute工具主要是用来进行网络路径跟踪的,比如从源主机出发到达目的主机,经过哪些路由器等信息。

百度百科

traceroute (Windows 系统下是tracert) 命令利用ICMP 协议定位您的计算机和目标计算机之间的所有路由器。TTL 值可以反映数据包经过的路由器或网关的数量,通过操纵独立ICMP 呼叫报文的TTL 值和观察该报文被抛弃的返回信息,traceroute命令能够遍历到数据包传输路径上的所有路由器。

Traceroute实现的基本原理大概如下所示:

  • 源主机向目的主机发送一系列UDP数据报。
    • 在UDP数据报封装到IP数据报时,设置第一组IP数据报的TTL=1
    • 发送第二组IP数据报时设置TTL=2,以此类推。
    • 同时,确保目的端口号为目的主机不可能使用的端口号。目的是为了出差错,从而获取ICMP报文返回的信息。
  • 当第n组数据报(TTL=n)到达第n个路由器时:
    • 此时TTL=n-n=0,路由器会将该数据报丢弃
    • 向源主机发送ICMP报文(type=11, code=0)
    • ICMP报文携带路由器名称和IP地址信息
    • 此时,源主机就探测到了第n个路由器的信息。
  • 当ICMP报文返回源数据时,记录RTT
  • 停止准则:
    • UDP数据报最终到达目的主机
    • 因为设置的目的端口是目的主机不可用的,势必目的主机会返回“目的端口不可达”类型的ICMP报文(type=3,code=3)
    • 当源主机收到这样的ICMP报文时,就知道已经探测到了最终的目的主机,探测路径结束,并获取了整个链路的信息

在这里插入图片描述

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

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

相关文章

android 如何分析应用的内存(九)——libc回调

android 如何分析应用的内存(九) 接上文,在前面文章中,介绍了bionic库提供的各种功能,其中包括: 自定义的mallocmalloc hookmalloc debug 接下来,介绍的是bionic库提供的libc回调功能&#x…

【Java】Java核心 77:Dom4j 解析 XML综合案例

文章目录 1、需求2、案例效果3、案例分析4、自定义JDBC框架-代码实现4.1、Configuration4.2、注解4.3、映射类:Mapper4.4、SqlSession类 5、自定义JDBC框架的使用5.1、数据表5.2、创建实体类5.3、UserMapper接口5.4、配置文件:config.xml5.5、测试类5.5、…

当金融风控遇上人工智能,众安金融的实时特征平台实践

导读:随着企业数字化转型升级,线上业务呈现多场景、多渠道、多元化的特征。数据要素价值的挖掘可谓分秒必争,业务也对数据的时效性和灵活性提出了更高的要求。在庞大分散、高并发的数据来源背景下,数据的实时处理能力成为企业提升…

vCenter崩了之后重新搭建处理办法

一、需要重新搭的情况下,vCenter虚拟机是无法使用分布式端口组的,而此时所有的物理网卡都在分布式交换机上,这样vCenter虚拟机的网络是无法访问的,所以需要先找到需要一台esxi。 二、此时可以看到两个分布式交换机 正常情况下分布…

高性能商品秒杀抢购系统

完整资料进入【数字空间】查看——baidu搜索"writebug" Goirisrabbbitmqmysql构建高性能商品秒杀抢购系统 一、项目介绍 1. 课程目标 应用GoWeb快速构建秒杀系统全流程应用开发及架构化设计思维梳理逐级优化,轻松应对“秒杀”及类似高并发场景 2. 知…

layui框架学习(30:树形模块)

Layui中的树形组件模块tree用于以树形形式显示上下级结构的数据&#xff0c;类似于winform中的tree控件。tree模块的基本用法及显示效果如下所示&#xff1a; <div id"test"></div><br /><script>layui.use([tree,layer], function(){var tr…

python安装pyelliptic-.5.7报错ImportError: No module named setuptools

1.背景&#xff1a; python安装pyelliptic-.5.7模块报错 2.环境及版本&#xff1a; linux&#xff1a;centos-7.7 python&#xff1a; 2.7.5 pyelliptic&#xff1a;5.7 注意&#xff1a;这里是纯内网环境所以pip不能使用&#xff0c;我这里配置了一个内部yum源 3.解决思路&…

Spring Boot 中的事务注解

在应用程序中&#xff0c;事务管理是一个非常重要的概念。事务是指一系列的操作&#xff0c;这些操作要么全部成功&#xff0c;要么全部失败。在Spring Boot中&#xff0c;可以使用事务注解来管理事务。在使用事务注解的时候&#xff0c;一个非常重要的概念就是事务传播行为。 …

js内存泄漏及排查详解

js内存泄漏及排查详解 常见内存泄漏及解决方案 内存泄漏&#xff08;Memory Leak&#xff09;是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放&#xff0c;造成系统内存的浪费&#xff0c;导致程序运行速度减慢甚至系统崩溃等严重后果。 隐式全局变量 在局部…

音频小说项目介绍

看小说、听音频&#xff0c;App,H5网站&#xff0c;小程序多端开发 一、主页 主页tabBar四个分类&#xff1a; 首页&#xff0c;分类&#xff0c;收藏&#xff0c;我的 最上方是搜索框 下方是轮播图&#xff0c;不但自动滚动&#xff0c;还有动画效果 下面分类有&#xf…

IDEA 或者SVN修改老项目的svn地址

公司svn地址修改了&#xff0c;ip修改了。本地还有代码没提交。这里介绍一下怎么在IDEA或svn修改为新地址&#xff0c;然后代码就可以直接提交了。网上也有文章介绍&#xff0c;但其中没注明一个关键点&#xff0c;导致很多人修改不成功。所以有了这篇文章。 IDEA下修改svn地址…

【Python】模块导入 ⑤ ( 主程序判断语句 | 模块中执行函数问题 | 制作自定义模块并执行函数 | 导入自定义模块会执行模块中的代码 )

文章目录 一、模块中执行函数问题1、制作自定义模块并执行函数2、导入自定义模块会执行模块中的代码3、主程序判断语句4、代码示例 - 主程序判断语句 一、模块中执行函数问题 1、制作自定义模块并执行函数 如果在自定义模块中 , 定义了函数 , 并且调用了该函数 ; 如下代码所示…

【TCP/IP】多播 - 定义、原理及编程实现 (TTL、多播组、多播消息)

目录 多播 多播的原理 多播的数据传输时的特点 TTL 的概念 TTL 和 多播组的配置方法 多播的编程与实现 发送者 接收者 多播 多播是一种介于单播和广播通信之间的技术方式&#xff0c;可以将发送者所需要发送的数据包分别发送给分散在不同子网中的一组接收者。 多播的原…

MySQL - 第11节 - MySQL事务管理

1.事务的概念 事务的概念&#xff1a; • 上层看起来比较简单的需求&#xff0c;可能对应的后端要做很多工作&#xff0c;后端这些工作组合起来才是一个完整的需求解决的方案。 • 事务由一条或多条SQL语句组成&#xff0c;这些语句在逻辑上存在相关性&#xff0c;共同完成一个…

聊聊transformers库; 微软推出ZeRO++技术:优化大型AI模型训练时间和成本

&#x1f989; AI新闻 &#x1f680; 微软推出ZeRO技术&#xff1a;优化大型AI模型训练时间和成本 摘要&#xff1a;据报道&#xff0c;微软研究人员最近发布了一项名为ZeRO的新技术&#xff0c;旨在优化训练大型AI模型时常遇到的数据传输成本和带宽限制问题&#xff0c;可大…

【0212】tcpdump抓包分析pg_hba.conf以password作为认证证方式下frontend与Backend之间身份验证过程(13 - 2)

文章目录 1. 回顾2. 密码校验通过3. 密码校验失败上一文:【0211】tcpdump抓包分析pg_hba.conf以password作为认证证方式下frontend与Backend之间身份验证过程(13 - 1) 1. 回顾 在上一节内容中,讲解了Backend对于接收到来自frontend的字符串明文密码,和来自于来自pg_auth…

荷兰宽带数据泄露 1

又要引入一个新工具RouterPassView 大多数现代路由器都可以备份一个路由器的配置文件&#xff0c;然后在需要的时候从文件中恢复配置。路由器的备份文件通常包含了像您的ISP的用户名重要数据/密码&#xff0c;路由器的登录密码&#xff0c;无线网络的KEY。 如果你忘记了这些密码…

第八十九天学习记录:C++核心:引用

引用的基本使用 作用&#xff1a;给变量起别名 语法&#xff1a;数据类型 &别名原名 #include<iostream> using namespace std;int main() {//引用基本语法//数据类型 &别名 原名int num1 3;int &num2 num1;cout << "num1" << n…

输入路由器IP地址进入IIS问题解决

0x01 问题描述 Windows10系统&#xff0c;路由器IP为192.168.1.1&#xff0c;本机获取的IP为192.168.1.110&#xff0c;但在浏览器URL输入路由器IP时却没有进入路由登录页&#xff0c;而是进了IIS欢迎页面。 0x02 问题分析 由于我本机IP不是192.168.1.1&#xff0c;所以排除与…

第八十七天学习记录:Linux基础:基础指令Ⅱ

touch创建文件 可以通过touch命令创建文件 语法&#xff1a;touch Linux路径 1、touch命令无选项&#xff0c;参数必填&#xff0c;表示要创建的文件路径&#xff0c;相对、绝对、特殊路径符均可以使用 cat命令 查看文件内容 首先用Vim编辑器在刚刚新建的tanktest.txt中编辑…