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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 学习记录40(C++篇)

Linux 学习记录40(C/QT篇) 本文目录 Linux 学习记录40(C/QT篇)一、QT软件的使用1. 新建工程 二、C语言和C的区别1. C对C的扩充2. C对C的兼容 三、第一个C程序1. cout标准输出流对象(1.介绍:(2. 运算符(3. cout的使用 2. cin标准输出流对象(1.介绍:(3. ci…

TCP/IP详解(一)

TCP/IP协议是Internet互联网最基本的协议,其在一定程度上参考了七层OSI(Open System Interconnect,即开放式系统互联)模型 OSI参考模型是国际组织ISO在1985年发布的网络互联模型,目的是为了让所有公司使用统一的规范来…

序列化和反序列化的认识【protobuf、json、xml】

1. 什么是序列化与反序列化? 程序员在编写应用程序的时候往往需要将程序的某些数据存储在连续的内存中,然后将其写入文件或是将其传输到网络中的另一台计算机上以实现通讯。这个将程序数据转换成能被存储并传输的格式的过程被称为序列化(seri…

web存储(Storage)

目录 1、基本概念 2、功能监测 2.1 测试可用性 2、W3C标准 3、基本方法或属性 4、 Local Storage 4.1 描述 4.2 示例 5、sessionStorage 5.1 描述 5.2 示例 6、StorageEvent(存储事件) 6.1 构造函数 6.2 实例属性 6.3 实例方法 6.4 响应…

【spring源码系列-04】注解方式启动spring时refresh的前置工作

Spring源码系列整体栏目 内容链接地址【一】spring源码整体概述https://blog.csdn.net/zhenghuishengq/article/details/130940885【二】通过refresh方法剖析IOC的整体流程https://blog.csdn.net/zhenghuishengq/article/details/131003428【三】xml配置文件启动spring时refres…

团体程序设计天梯赛-练习集L2篇⑨

🚀欢迎来到本文🚀 🍉个人简介:Hello大家好呀,我是陈童学,一个与你一样正在慢慢前行的普通人。 🏀个人主页:陈童学哦CSDN 💡所属专栏:PTA 🎁希望各…

线性代数高级--矩阵的秩--SVD分解定义--SVD分解的应用

目录 矩阵的秩 概念 k阶子式 矩阵的秩的定义 矩阵的秩的性质 SVD分解 概念 注意 SVD的分解过程 SVD分解的应用 矩阵的秩 概念 矩阵的秩是线性代数中的一个重要概念,用于描述矩阵的行(或列)向量的线性无关程度。矩阵的秩可以通过…

Spring Data JPA 报 HOUR_OF_DAY: 0 -> 1异常的解决过程和方案

在进行数据查询时,控制台报了Caused by: com.mysql.cj.exceptions.WrongArgumentException: HOUR_OF_DAY: 0 -> 1异常,查询得知:这是由于查mysql库,转换类型为datetime类型的字段引起的。 网上的解决方案有多种,大…

fastadmin如何自定义一个列表上的按钮。

参考文档: 首先,这是没有新增按钮的,只有删除和编辑。 然后js按钮是这一块: 我现在呢想加上一个撤销的按钮怎么办呢,只需要在js加上这一串代码就行了。 {field: "operate",title: __("Operate")…

uni-app 使用axios发请求 运行到微信开发者工具报错 Adapter “http‘ is not available in the build

场景 最近在使用uni-app开发H5移动端,跟往常一样使用axios发请求,做一些全局的请求拦截响应拦截操作 uni-app数据存储,uni-ui组件开发,配置axios,vuex。配置了vue.config.js文件做跨域操作 运行到谷歌浏览器一切正常…

HBase(8):扫描操作

1 需求 查看ORDER_INFO表中所有的数据 1.2 scan命令 在HBase,我们可以使用scan命令来扫描HBase中的表。语法: scan 表名 1.3 扫描ORDER_INFO表 scan ORDER_INFO,{FORMATTER => toString} 注意:要避免scan一张大表! 2 需求二:查询订单数据(只显示3条) scan ORDE…

从0开始,精通Go语言Rest微服务架构和开发

说在前面 现在拿到offer超级难,甚至连面试电话,一个都搞不到。 尼恩的技术社区中(50),很多小伙伴凭借 “左手云原生右手大数据”的绝活,拿到了offer,并且是非常优质的offer,据说年…

响应式数据大屏开发rem、%、vh/vm

前言 响应式数据大屏开发rem、%、vh/vm 我们在开发数据大屏的时候难免会需要解决响应式问题 ,那么响应式是什么呢? 响应式:响应式布局是元素随着屏幕发生宽高大小变化 盒子布局发生变化 通俗的来说: 自适应:元素随着…

尚硅谷大数据Flink1.17实战教程-笔记02【Flink部署】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址:尚硅谷大数据Flink1.17实战教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据Flink1.17实战教程-笔记01【Flink概述、Flink快速上手】尚硅谷大数据Flink1.17实战教程-笔记02【Flink部署】尚硅谷…

深入理解深度学习——Transformer:编码器(Encoder)部分

分类目录:《深入理解深度学习》总目录 相关文章: 注意力机制(AttentionMechanism):基础知识 注意力机制(AttentionMechanism):注意力汇聚与Nadaraya-Watson核回归 注意力机制&#…

Unix/Linux编程:UDS 流(Stream)

〇、前言 socket 是一种 IPC (Inter-Process Communication,进程间通信)方法,它允许位于同一主机(计算机)或使用网络连接起来的不同主机上的应用程序之间交换数据。通过使用Socket,开发人员可以…

HTML5 游戏开发实战 | 贪吃蛇

在该游戏中,玩家操纵一条贪吃的蛇在长方形场地里行走,贪吃蛇按玩家所按的方向键折行,蛇头吃到食物(豆)后,分数加10分,蛇身会变长,如果贪吃蛇碰上墙壁或者自身的话,游戏就结束了(当然也可能是减去…

企业级微服务架构实战项目--xx优选-用户登录

一 用户登录的触发页面 1.登录常量 2.登录地址 3.配置域名 4.启动程序 触发连接小程序后端的登录接口 小程序controller的登录方法

XR云新未来圆桌精彩回顾 | XR应用场景迭代下的新商业模式

6月15日,由平行云联合首都在线共同主办,中关村软件园协办,以“XR云新未来|弹性算力赋能可交互、沉浸式商业实践”为主题的XR行业交流盛会在北京成功举办。 本次会议我们邀请到平行云科技创始人兼CEO 李岩、XREAL 云XR负责人 吴维、瑞帆科技…

利用SQL注入漏洞登录后台

所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQ…
最新文章