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

哈工大计算机网络课程网络层协议详解之:互联网控制报文协议(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.hqwc.cn/news/4676.html

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

相关文章

视频与AI,与进程交互(二) pytorch 极简训练自己的数据集并识别

目标学习任务 检测出已经分割出的图像的分类 2 使用pytorch pytorch 非常简单就可以做到训练和加载 2.1 准备数据 如上图所示,用来训练的文件放在了train中,验证的文件放在val中,train.txt 和 val.txt 分别放文件名称和分类类别&#xff…

Redis之数据类型String、List、Hash、Set、Sorted Set(详细)

一、String数据类型 1、SET/GET/APPEND/STRLEN (1) APPEND (2) SET/STRLEN 2、 INCR/ DECR/INCRBY/DECRBY (1)INCR/ DECR (2) INCRBY/DECRBY INCRBY key increment&#xff1…

selenium通过xpath定位text换行的元素

DOM元素(该元素是换行的,不能通过普通xpath定位): 可使用下面xpath定位该div //div[./text()/following-sibling::text()"点" and ./text()"5"] 解释一下就是:定位“子节点的text是[5] 且 子节点…

【Java项目】解决请求路径上明文ID传输导致可能被攻击的方法

文章目录 问题思路解决 问题 这个问题是我公司的一个小业务问题,问题来源于我们发送请求的时候,请求路径上携带的是明文,比如http://xxx/xxx/id12345,那么别有用心的人就可能会推测出id的生成策略,导致遍历id&#xf…

Qt编写视频监控系统79-四种界面导航栏的设计

一、前言 最初视频监控系统按照二级菜单的设计思路,顶部标题栏一级菜单,左侧对应二级菜单,最初采用图片在上面,文字在下面的按钮方式展示,随着功能的增加,二级菜单越来越多,如果都是这个图文上…

数据库表的操作

目录 前言 1.创建表 2.查看表 2.1查看表结构 2.2查看表中插入的数据 3.修改表 4.删除表 总结 前言 前面已经介绍了对数据库的操作,今天我们介绍的是数据库表的操作,数据库表简单可以理解为存储数据的介质。有了这个认识之后,下面我们…

21.RocketMQ源码之NameServer的路由管理和架构设计

highlight: arduino-light NameServer 路由管理 Broker消息服务器在启动的时向所有NameServer注册。 消息生产者Producer在发送消息之前先从NameServer获取Broker服务器地址列表然后根据负载均衡算法从列表中选择一台服务器进行发送。 NameServer与每台Broker保持长连接&#x…

如何在Microsoft Excel中快速筛选数据

你通常如何在 Excel 中进行筛选?在大多数情况下,通过使用自动筛选,以及在更复杂的场景中使用高级过滤器。 使用自动筛选或 Excel 中的内置比较运算符(如“大于”和“前10项”)来显示所需数据并隐藏其余数据。筛选单元格或表范围中的数据后,可以重新应用筛选器以获取最新…

移动端微信小程序学习

目录 小程序和web端的不同 小程序的宿主环境 通信 组件 视图容器​编辑 text组件 button image ​编辑 API api三大分类 模板语法 事件绑定 ​编辑 事件传参​编辑 bindinput 条件渲染 列表渲染 ​编辑 全局配置 window 页面配置 网络数据请求 ​编辑 GET请求 POST…

从电源 LED 读取智能手机的秘密?

研究人员设计了一种新的攻击方法,通过记录读卡器或智能手机打开时的电源 LED,使用 iPhone 摄像头或商业监控系统恢复存储在智能卡和智能手机中的加密密钥。 众所周知,这是一种侧信道攻击。 通过密切监视功耗、声音、电磁辐射或执行操作所需…

轻松生成高质量用例的API接口工具

1、前言 随着自动化测试技术的普及,已经有很多公司或项目,多多少少都会进行自动化测试。 目前本部门的自动化测试以接口自动化为主,接口用例采用 Excel 进行维护,按照既定的接口用例编写规则,对于功能测试人员来说只…

置换检验临界值

置换检验和t检验一样,会有统计值和P值。 置换检验的统计值记为Z值 其中这个Z和t检验的t一样,是有大小分别的。 例如b为1和2的分类变量,那么Z正值代表1大于2。 我们知道t检验的t值换算成P值,是需要自由度的。 例如在这个数据中&a…