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

news2025/1/24 14:50:19

目录

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.coloradmin.cn/o/1474430.html

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

相关文章

C++ //练习 9.16 重写上一题的程序,比较一个list<int>中的元素和一个vector<int>中的元素。

C Primer(第5版) 练习 9.16 练习 9.16 重写上一题的程序,比较一个list中的元素和一个vector中的元素。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块 /**********************************…

Stable Diffusion 模型分享:【Checkpoint】YesMix(动漫、2.5D)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四下载地址模型介绍 条目内容类型大模型基础模型SD 1.5来源

一文讲清DTO、BO、PO、VO

DTO、BO、PO、VO是什么? 在后端开发中,比如传统的MVC架构和现在流行的DDD架构,经常会使用到下列几种对象的概念 DTO (Data Transfer Object) 数据传输对象: DTO设计模式用于将数据从服务端传输到客户端,或者在不同的…

python Matplotlib Tkinter-->tab切换1

环境 python:python-3.12.0-amd64 包: matplotlib 3.8.2 pillow 10.1.0 import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk import tkinter as tk import tkinter.messagebox as messagebox import …

C++ stack queue详解以及模拟实现

目录 1.stack的使用 1.1stack的定义 1.2stack的使用 1.3stack的构造 2.stack底层模拟实现 3.queue的使用 3.1queue的定义 3.2queue的使用 4.queue底层模拟实现 1.stack的使用 1.1stack的定义 1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环…

AI:138-开发一种能够自动化生成艺术品描述的人工智能系统

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…

面试redis篇-11Redis集群方案-哨兵

Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。哨兵的结构和作用如下: 监控:Sentinel 会不断检查您的master和slave是否按预期工作自动故障恢复:如果master故障,Sentinel会将一个slave提升为master。当故障实例恢复后也以新的master为主通知:Sentinel充当…

每日五道java面试题之spring篇(八)

目录: 第一题. Component, Controller, Repository,Service 有何区别?第二题. Required 注解有什么作用第三题. Autowired和Resource之间的区别第四题. 自动装配有哪些局限性?第五题. 使用Autowired注解自动装配的过程是怎样的? 第…

ElasticSearch之单值多字段查询以及multi match

写在前面 在这篇文章 我们看了使用dis_max查询来进行单值多字段场景下的查询,如下: POST /blogs/_search {"query": {"dis_max": {"queries": [{"match": {"title": "Brown fox"}},{&quo…

项目登录方案选型

一.Cookie + Session 登录 大家都知道,HTTP 是一种无状态的协议。无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求返回数据,但不会记录任何信息。为了解决 HTTP 无状态的问题,出现了 Cookie。Co…

Java SpringBoot 创建项目工程输出 Hello World

Java SpringBoot 创建项目工程输出 Hello World 1、新建项目 2、创建 controller 3、编写 Hello World 代码 package com.zhong.demo01.controller;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.Res…

Sentinel微服务流量治理组件实战下

目录 Sentinel控制台介绍 实时监控 簇点链路 流控规则 限流阈值类型 流控模式 流控效果 熔断降级规则 熔断策略之慢调用比例 熔断策略之异常比例 熔断策略之异常数 热点规则 系统规则——系统自适应保护 系统规则阈值类型 授权控制规则——来源访问控制&#xf…

JAVA AQS源码深度讲解和分析

为方便理解,本文章以非公平锁ReentrantLock()为例作为突破讲解方法lock。 前置知识:JAVA AQS源码分析前置知识-CSDN博客 ReentrantLock的原理 Lock接口的实现类,基本都是通过聚合了一个队列同步器的子类完成线程访问控制的 从最简单的lock方…

2.23日学习打卡----初学Nginx(二)

2.23日学习打卡 目录: 2.23日学习打卡一. Nginx 虚拟主机虚拟主机的分类Nginx支持三种类型的虚拟主机配置Nginx虚拟主机单网卡多IP配置Nginx虚拟主机_基于域名虚拟主机配置Nginx虚拟主机基于多端口的配置4 二. Nginx 核心指令root和alias指令的区别return指令rewrite指令rewrit…

代码随想录Leetcode474. 一和零

题目&#xff1a; 代码(首刷看解析 2024年2月26日&#xff09; class Solution { public:// 二维 0 1背包int findMaxForm(vector<string>& strs, int m, int n) {// 1 二维 [i]表示 0 的个数&#xff0c;上限m; [j]表示 1 的个数&#xff0c;上限nvector<vector…

C++面试宝典第32题:零钱兑换

题目 给定不同面额的硬币coins和一个总金额amount,编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,则返回-1。说明:你可以认为每种硬币的数量是无限的。 示例1: 输入:coins = [1, 2, 5], amount = 11 输出:3 解释:11 = …

Redis高可用三主三从集群部署(三种方式部署/18个节点的大集群)

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容使用宝塔面板搭建集群规划配置验证 使用docker搭建使用脚本搭建规划防火墙端口配置脚本redis.conf配置文件执行过程 &#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff…

HTTP 与HTTPS笔记

HTTP 80 HTTP是一个在计算机世界里专门在【两点】之间【传输】文字、图片、音频、视频等【超文本】数据的约定和规范。 HTTP状态码 1xx 提示信息&#xff0c;表示目前是协议处理的中间状态&#xff0c;还需要后续的操作&#xff1b;2xx 200 204 026 成功3xx 重定向&#xff…

动静态库的理解

其实我们平常写一些C或C的代码的时候&#xff0c;在链接过程都会用到动静态库&#xff0c;因为一些基础的代码我们是不用写的&#xff08;比如输入输出函数&#xff09;&#xff0c;我们只需要包个头文件&#xff0c;这些库和我们的编译好的代码一起链接后才会形成可执行程序 那…

当Vue项目启动后,通过IP地址方式在相同网络段的其他电脑上无法访问前端页面?

当Vue项目启动后&#xff0c;通过IP地址方式在相同网络段的其他电脑上无法访问前端页面&#xff0c;可能是由以下几个原因造成的&#xff1a; 服务监听地址&#xff1a;默认情况下&#xff0c;许多开发服务器&#xff08;如Vue CLI的vue-cli-service serve&#xff09;只监听lo…