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

news/2025/3/29 6:59:57/

目录

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.ppmy.cn/news/1367003.html

相关文章

高光谱遥感学习入门丨高光谱数据处理基础、Python和Matlab高光谱遥感数据处理

目录 ①Python高光谱遥感数据处理与高光谱遥感机器学习方法深度应用 ②Matlab高光谱遥感、数据处理与混合像元分解实践技术应用 ③高光谱遥感数值建模技术及在植被、水体、土壤信息提取领域应用 更多应用 高光谱遥感信息对于我们认识世界具有重要意义。尽管大部分物质在人眼…

【Rust】——结构体struct

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

NLP Seq2Seq模型

🍨 本文为[🔗365天深度学习训练营学习记录博客🍦 参考文章:365天深度学习训练营🍖 原作者:[K同学啊 | 接辅导、项目定制]\n🚀 文章来源:[K同学的学习圈子](https://www.yuque.com/mi…

MyBatis 学习(三)之 MyBatis 全局配置文件

目录 1 MyBatis 全局配置文件 2 properties 元素 3 setting 设置 4 typeAlianses 别名处理器 5 typeHandler 类型处理器 6 objectFacotry 对象工厂(了解) 7 plugins 插件(了解) 8 environments 运行环境 9 databaseIdPro…

Unity中URP实现水体(整理优化)

文章目录 前言一、优化水的深度1、我们把 水流动的方向 和 水深浅过渡值,整合到一个四维变量中2、修改 水体流动方向3、在片元着色器中,修改使用过渡变量 二、优化泡沫三、优化水下的扭曲1、修复原本扰动UV的计算 四、优化水面高光1、把高光强度、光滑度…

1. 开发环境搭建

文章目录 前端 前后端分离项目 前端:管理端web页面 , 用户端小程序后端:SpringBoot 前端 基于Nginx运行

禁止涉密电脑插U盘

某国家机关在日常工作中发现,一台涉密电脑受到了不明攻击,大量机密文件被非法访问和复制。 经过调查,原来是一名工作人员在不知情的情况下,将感染病毒的U盘插入涉密电脑,导致机密数据被窃取。 事件发生后&#xff0c…

【系统分析师】-系统配置与性能评价

1、性能指标 主频:又称时钟频率,1GHZ表示1秒有1G个时钟周期 1s10^9ns 主频外频 * 倍频 时钟周期 主频的倒数指令周期:取出并执行一条指令的时间 总线周期:一个访存储器或IO操作所用时间平均执行周期数:CPI表示…