《TCP/IP详解 卷一》第8章 ICMPv4和ICMPv6

目录

8.1 引言

8.1.1 在IPv4和IPv6中的封装

8.2 ICMP 报文

8.2.1 ICMPv4 报文

8.2.2 ICMPv6 报文

8.2.3 处理ICMP报文

8.3 ICMP差错报文

8.3.1 扩展的ICMP和多部报文

8.3.2 目的不可达和数据包太大

8.3.3 重定向

8.3.4 ICMP 超时

8.3.5 参数问题

8.4 ICMP查询/信息类报文

8.4.1 回显请求 / 应答

8.4.2 路由器发现:路由器请求RS和通告RA

8.4.3 本地代理地址发现请求/应答

8.4.4 移动前缀请求/通告

8.4.5 移动IPv6快速切换报文

8.4.6 组播侦听查询/报告/完成

8.4.7 版本2组播侦听发现

8.4.8 组播路由器发现

8.5 IPv6中的邻居发现

8.5.1 ICMPv6路由器请求和通告

8.5.2 ICMPv6邻居请求和通告

8.5.3 ICMPv6反向邻居发现请求/通告

8.5.4邻居不可达检测

8.5.5安全邻居发现

8.5.6 ICMPv6邻居发现选项

8.6 ICMPv4 和 ICMPv6 转换

8.7 与ICMP相关的攻击

8.8 总结


8.1 引言

ICMP位于网络层和传输层之间。

因为路由器缓冲区溢出的丢包不会触发任何ICMP差错报文。而由TCP等处理(重传等)。

黑客在大量攻击中使用ICMP。由于担心攻击,通常防火墙封阻ICMP报文,特别是边界路由器。此时诊断程序(ping, traceroute)无法正常工作。

ICMPv6包含:

        错误报告。

        邻居请求,邻居通告。

        路由器请求,路由器通告。

        重定向:优化路由。

        报文过滤: 引入Packet Too Big报文,通知源主机包超过了链路层MTU。

8.1.1 在IPv4和IPv6中的封装

报文格式:

其中ICMPv4头:

字段介绍:

        类型:指定报文类型,常用8个值。

        代码:进一步指定报文类型。

        校验和:IP层没有对载荷完整性保护。所以ICMP需包含校验和。

8.2 ICMP 报文

ICMP报文分类:

        差错报文:用于通知发送端数据包传输中的错误情况。

        查询/信息类报文:用于信息采集和配置。

8.2.1 ICMPv4 报文

差错报文:

        目的不可达(类型3),重定向(类型5),超时(类型11 ),参数问题(类型12)

查询/信息类报文:

        回显请求(类型8),回显应答(类型0),路由器通告(类型9),路由器请求(类型10)

其中重定向报文目的:指导主机或路由器改变路由决策,将数据发送到更优路径上。

8.2.2 ICMPv6 报文

ICMPv6不仅包含差错和查询/信息类报文,还有大量IPv6路由器和主机的配置,如RS,RA,NS,NA。

ICMPv6类型字段值:

        从0到127是差错类报文,从128到255是信息类报文。

ICMPv6也使用代码字段。

ICMPv6还支持大量标准选项,而ICMPv4不支持选项。

8.2.3 处理ICMP报文

收到重定向报文:会更新路由表。

目的不可达报文:可用于路径MTU发现(PMTUD)

ICMPv6报文处理规则:

        1. 收到未知ICMPv6差错报文,须传递给上层产生差错报文的进程。

        2. 收到未知ICMPv6信息类报文,丢弃。

        3. 发送ICMPv6差错报文时,应尽可能多地包含导致差错的原始IPv6报文,但不超过最小的IPv6 MTU ( 1280字节)

        4. IPv6节点须限制发送ICMPv6差错报文速率。

IPv6网络中链路层最小MTU是1280字节。IPv4中是576字节。

8.3 ICMP差错报文

请注意8.3.1到8.3.5章节都属于ICMP差错报文。

不会用ICMP差错报文响应以下报文:

        另一个ICMP差错报文。

        头部损坏的数据报(例如校验和错误)。

        IP层广播或组播数据。

        链路层广播或组播帧数据。

        无效地址(零地址、环回地址、广播地址,组播地址)

        第一个之外的分片。

发送ICMP差错报文:应包含导致错误数据报的IP头副本,包括IP选项和原始IP载荷,生成的ICMP数据报大小不超过网络最小MTU。

差错报文包含原始IP包载荷作用:

        使接收ICMP差错报文主机能根据IP头中协议或下一个头部将该差错报文传递到对应传输层和应用进程。

8.3.1 扩展的ICMP和多部报文

扩展的ICMP差错报文: 使ICMP差错报文包含额外信息以提供更多诊断信息。

用ICMP中代码字段指明具体原因,实现扩展功能。

后续章节详解。

8.3.2 目的不可达和数据包太大

ICMPv4目的不可达差错报文:

        网络不可达:code 0,无路由信息。

        主机不可达:Code 1,如目标主机关机等。

        协议不可达:Code 2,目标主机无法处理数据包传输层协议。

        端口不可达:Code 3,该端口未打开或没有对应端口的应用程序。

        需要进行分片,但设置了DF位:Code 4

        源站选路失败:Code 5,IP包中包含源站路由选项,但无法按照指定路由转发数据包。

ICMPv6目的不可达差错报文:

        无路由:code 0,无路由信息。

        目的地被管理员禁止通信:code 1

        源地址的范围之外:code 2,如访问公网时,源IP地址是本地链路地址,不属于全局地址。

        地址不可达:code 3,目标主机未响应或不可达

        端口不可达:code 4

        源地址失败进/出策略:code 5,如因为接口ACL导致数据报无法传递。

数据包太大差错报文

        即PTB(Packet Too Big)

        路由器转发的数据大于出接口MTU,但数据IP头设置了不分片位,则丢弃该数据,并回复PTB差错报文。

        PTB报文中会包含路由器自身 MTU值,以告知源地址减小数据包。

        因此该报文可用于PMTU发现,PMTU是路径中MTU最小值。

net.ipv4.icmp_ratemask = 6168(哪些ICMP报文有速率限制,对应code字段)

应用程序使用如下代码接口ICMP报文:

        sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

        应用层收到ICMP差错报文后,可进行对应操作。

8.3.3 重定向

使用不多。

主机根据ICMP重定向报文信息来更新转发表

8.3.4 ICMP 超时

IPv4头部中TTL字段:表示丢弃前最多可经过的路由器跳数。

IPv6头部中同样有跳数限制(Hop Limit)字段表示。

超时报文差错报文:

        TTL超时:Code 0,指示数据报TTL值已减至零。

        分片重组超时:Code 1,指示数据报片段重组未能在一定时间内完成。

traceroute原理:

        主机先发送IPv4 TTL=1数据,到达第一个路由器,此时TTL到期,路由器回复ICMPv4超时报文。主机下一次数据包TTL加1。导致在更远一跳路由器超时,并回复ICMP超时报文,重复该过程。

ICMP响应报文中包含响应路由器自身IP,由此得到沿途所有路由器IP。

8.3.5 参数问题

场景:IP头部存在不可修复错误。

        该报文是"包罗万象”的错误指示器。无法指明具体原因,但会指出错误相对IP头部的偏移值。

ICMPv6中细分为三种:

        错误头部字段。

        无法识别下一个头部。

        无法识别IPv6选项。

8.4 ICMP查询/信息类报文

注意:8.3 讲解的全是ICMP差错报文。

广泛使用的ICMP查询/信息类报文:回显请求,回显应答(ping使用)

8.4.1 回显请求 / 应答

即ping使用的ICMP报文类型。

回显请求报文大小任意(但受限于IP数据报大小),回显应答时需要将收到数据返回给发送者,即使需要IP分片。

字段介绍:

        标识符:UNIX用发送进程PID表示。方便识别同一主机多个ping程序。

        序列号:从0开始,每个回显请求加1。方便查看丢包、重复问题。

        可选数据:如ping在回显请求和应答包含本地时,方便计算RTT。

        之前提过NAT处理ICMP时,会结合标识符和序列号进行NAT转换,因为ICMP报文没有端口号信息。

ping -b 10.0.0.254

ping广播地址作用:

        子网所有主机收到该ping包后,都需要响应,所以都需要知道ping主机的MAC,于是都向ping主机发ARP请求,最终快速广播ping主机ARP。

Linux默认允许回复CMP应答报文给广播地址的ICMP请求。

8.4.2 路由器发现:路由器请求RS和通告RA

路由器发现:RD(Router Discovery)

RD:IPv4使用少。主要用于IPv6,是IPv6 SLAAC功能一部分。

IPv6 RD包括:

        路由器请求RS(Router Solicitation)报文

        路由器通告RA(Router Advertisement)报文

ICMP type 133,表示路由器请求RS。请求网络配置,如DNS,IPv6网络前缀。

ICMP type 134,表示路由器通告RA。要么用于回复RS,要么周期多播发送。

使用场景:

        无状态地址配置:RA中包含网络前缀信息。

8.4.3 本地代理地址发现请求/应答

允许移动网络IPv6节点在移动时保持其IPv6地址不变,并且可以在外部网络上通过本地代理进行通信。

8.4.4 移动前缀请求/通告

当节点的本地地址将无效时,请求更新路由前缀。

8.4.5 移动IPv6快速切换报文

改善IP层切换延迟

8.4.6 组播侦听查询/报告/完成

允许节点查询或报告本地链路上的组播组成员信息,并执行组播组成员的管理。

8.4.7 版本2组播侦听发现

8.4.8 组播路由器发现

通过ICMPv6组播路由器发现报文,主机确定哪些路由器支持 IPv6 组播,从而决定是否启用 IPv6 组播功能。

8.5 IPv6中的邻居发现

邻居发现:(Neighbor Discovery,ND),类似IPv4的ARP。

IPv6中没有广播地址。

ND用于在同一个链路或者网段的节点找到彼此,确定一个邻居是否变得可用。

ND使用ICMPv6报文。

ND包含:

        邻居请求NS(Neighbor Solicitation),ICMP type为135。

        邻居通告NA(Neighbor Advertisement),ICMP type为136。

功能:地址解析,邻居发现,地址自动配置。

8.5.1 ICMPv6路由器请求和通告

路由器通告(RA)报文:

        通告网络前缀,MTU,DNS,NTP服务器等配置。

        通常会定期发送,或者用于响应路由器请求(RS)报文。

RS报文目的IP:ff02::2(所有路由器组播地址)

RA报文目的IP:ff02::1(所有节点的组播地址)或者单播RS主机

结合无状态DHCPv6 SLAAC使用。

8.5.2 ICMPv6邻居请求和通告

ICMPv6中的邻居请求(NS)报文:取代IPv4 ARP

目的:

        IPv6中ARP功能,获取IPv6地址对应MAC。

        检测附近节点是否可达。

8.5.3 ICMPv6反向邻居发现请求/通告

在帧中继网络中确定给定的MAC地址对应IPv6地址

8.5.4邻居不可达检测

(Neighbor Unreachability Detection, NUD)

定期检测邻居节点的存活状态

如果检测到邻居不可达,更新邻居表和路由表,切换到备用网络。

8.5.5安全邻居发现

安全邻居发现(Secure Neighbor Discovery,SEND)

安全性增强的邻居发现协议。

作用:

        邻居发现,且解决传统IPv6邻居发现过程安全漏洞。

8.5.6 ICMPv6邻居发现选项

使用一些可选的选项(Options)来提供额外信息或配置。

源/目标链路层地址选项

前缀信息选项PIO

重定向头部选项

MTU 选项

通告间隔选项

源和目标地址列表选项

时间戳选项

随机数选项

证书选项

IP地址/前缀选项

链路层地址选项

邻居通告确认选项

路由信息选项

递归DNS服务器选项

切换密钥请求选项

切换密钥应答选项

8.6 ICMPv4 和 ICMPv6 转换

8.7 与ICMP相关的攻击

分为3类:

泛洪(flood):DoS

炸弹(bomb):发送特殊构造报文,导致IP或者ICMP的处理崩溃。

信息泄露(information disclosure)

8.8 总结

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

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

相关文章

猫头虎分享已解决Bug || Invariant Violation: Element type is invalid

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

oracle官网下载早期jdk版本

Java Downloads | Oracle JDK Builds from Oracle 以上压缩版,以下安装版 Java Downloads | Oracle 该链接往下拉能看到jdk8和jdk11的安装版 -- end

Vue源码系列讲解——生命周期篇【七】(模板编译阶段)

目录 1. 前言 2. 模板编译阶段分析 2.1 两种$mount方法对比 2.2 完整版的vm.$mount方法分析 3. 总结 1. 前言 前几篇文章中我们介绍了生命周期的初始化阶段,我们知道,在初始化阶段各项工作做完之后调用了vm.$mount方法,该方法的调用标志…

二 线性代数-向量

1、向量的表示方法: 其中的 i、j、k是坐标轴方向的单位向量。 2、向量的模: 用坐标计算的方法: 3、向量的运算: 3.1 向量的加法减法: 3.2 向量的数乘: 拉格朗日乘数法的 基础 公式。 3.3 向量的数量积&a…

计算机网络-后退N帧协议(弊端 滑动窗口 运行中的GBN 滑动窗口长度习题 GBN协议性能分析 )

文章目录 停等协议的弊端后退N帧协议中的滑动窗口GBN发送方必须响应的三件事GBN接受方要做的事运行中的GBN滑动窗口长度GBN协议重点总结习题1习题2GBN协议性能分析小结 停等协议的弊端 信道利用率低:在停等协议中,发送方在发送完一帧后必须等待接收方确…

List去重有几种方式

目录 1、for循环添加去重 2、for 双循环去重 3、for 双循环重复坐标去重 4、Set去重 5、stream流去重 1、for循环添加去重 List<String> oldList new ArrayList<>();oldList.add("张三");oldList.add("张三");oldList.add("李四&q…

基于python-socket构建任务服务器(基于socket发送指令创建、停止任务)

在实现ia业务服务器时需要构建一个python-socket客户端&#xff0c;1、要求能与服务器保持心跳连接&#xff0c;每10秒钟发送一次心跳信号&#xff1b;2、要求能根据socket服务器发送的指令创建或终止一个定时任务。 为此以3个类实现该功能&#xff0c;分别为socket通信类&…

成功解决SyntaxError: unexpected character after line continuation character

成功解决SyntaxError: unexpected character after line continuation character &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &…

蓝桥杯Learning

Part 1 递归和递推 1. 简单斐波那契数列 n int(input())st [0]*(47) # 注意这个地方&#xff0c;需要将数组空间设置的大一些&#xff0c;否则会数组越界 st[1] 0 st[2] 1 # 这个方法相当于是递推&#xff0c;即先求解一个大问题的若干个小问题 def dfs(u):if u 1:print(…

Object中的hashCode()

让hashcode方法的返回值为地址 vm参数中输入-XX:UnlockExperimentalVMOptions -XX:hashCode4&#xff0c;如下图&#xff1a; 参考 搞懂JAVAObject中的hashCode()_java_脚本之家 JDK核心JAVA源码解析(9) - hashcode 方法 - 知乎

pop链构造 [NISACTF 2022]babyserialize

打开题目 题目源代码如下 <?php include "waf.php"; class NISA{public $fun"show_me_flag";public $txw4ever;public function __wakeup(){if($this->fun"show_me_flag"){hint();}}function __call($from,$val){$this->fun$val[0];…

【小沐学QT】QT学习之Web控件的使用

文章目录 1、简介1.1 Qt简介1.2 Qt下载和安装1.3 Qt快捷键1.4 Qt帮助 2、QtWeb控件2.1 测试代码1&#xff08;QApplication&#xff09;2.2 测试代码2&#xff08;QApplicationQWidget&#xff09;2.3 测试代码3&#xff08;QApplicationQMainWindow&#xff09;2.4 测试代码4&…

记录一下 Unity团结引擎开发OpenHarmony Next 应用 环境搭建流程

原视频链接 记录环境搭建过程~&#xff0c;本文是图文版本 一、打开团结引擎官网下载对应的 团结引擎版本 官网地址&#xff1a;https://unity.cn/tuanjie/releases 根据各自的开发环境下载对应的软件版本&#xff0c;我是 windwos 环境&#xff0c;我就下载 windows 环境 …

微服务-实用篇

微服务-实用篇 一、微服务治理1.微服务远程调用2.Eureka注册中心Eureka的作用&#xff1a;搭建EurekaServer服务Client服务注册服务发现Ribbon负载均衡策略配置Ribbon配置饥饿加载 3.nacos注册中心使用nacos注册中心服务nacos区域负载均衡nacos环境隔离-namespaceNacos和Eureka…

深度学习神经网络实战:多层感知机,手写数字识别

目的 利用tensorflow.js训练模型&#xff0c;搭建神经网络模型&#xff0c;完成手写数字识别 设计 简单三层神经网络 输入层 28*28个神经原&#xff0c;代表每一张手写数字图片的灰度隐藏层 100个神经原输出层 -10个神经原&#xff0c;分别代表10个数字 代码 // 导入 Ten…

负载均衡.

简介: 将请求/数据【均匀】分摊到多个操作单元上执行&#xff0c;负载均衡的关键在于【均匀】。 负载均衡的分类: 网络通信分类 四层负载均衡:基于 IP 地址和端口进行请求的转发。七层负载均衡:根据访问用户的 HTTP 请求头、URL 信息将请求转发到特定的主机。 载体维度分类 硬…

前端开发_Vue入门

Vue概念 Vue 是一个用于构建用户界面的渐进式框架 构建用户界面&#xff1a;基于数据渲染出用户看到的页面渐进式&#xff1a;循序渐进框架&#xff1a;一套完整的项目解决方案 创建Vue实例 准备容器 引包&#xff08;开发版本/生产版本&#xff09; <script src"h…

消息中间件篇之Kafka-数据清理机制

一、Kafka文件存储机制 Kafka文件存储结构&#xff1a;一个Topic有多个分区。每一个分区都有多个段&#xff0c;每个段都有三个文件。 为什么要分段&#xff1f;1. 删除无用文件方便&#xff0c;提高磁盘利用率。 2. 查找数据便捷。 二、数据清理机制 1.日志的清理策略方案1 根…

[C++][linux]Linux上内存共享内存用法

一&#xff0c;什么是共享内存 共享内存&#xff08;Shared Memory&#xff09;&#xff0c;指两个或多个进程共享一个给定的存储区。进程可以将同一段共享内存连接到它们自己的地址空间中&#xff0c;所有进程都可以访问共享内存中的地址&#xff0c;就好像它们是由用C语言函…

GEE入门篇|遥感专业术语(实践操作4):光谱分辨率(Spectral Resolution)

目录 光谱分辨率&#xff08;Spectral Resolution&#xff09; 1.MODIS 2.EO-1 光谱分辨率&#xff08;Spectral Resolution&#xff09; 光谱分辨率是指传感器进行测量的光谱带的数量和宽度。 您可以将光谱带的宽度视为每个波段的波长间隔&#xff0c;在多个波段测量辐射亮…