注:本文为“ICMP / IGMP 协议及报文” 相关文章合集。
ICMP 协议以及报文讲解(ICMP 查询报文、ICMP 差错报文)
静下心来敲木鱼 已于 2023-12-15 20:13:50 修改
ICMP 协议
ICMP 协议的作用
ICMP(Internet Control Messages Protocol)因特网控制协议,主要用来在网络设备间传递各种差错、控制和查询等消息(在收集网络信息、诊断、排查故障等方面具有重要的作用)
ICMP 是网络层协议,协议号为 1
为什么需要 ICMP 差错报文
IP 协议的缺点
1、IP 协议没有差错报文或差错纠正机制
2、IP 协议缺少一种为主机和管理查询的基址
所以 ICMP 协议就是为了补充 IP 协议的这两个缺点而设计的,配合 IP 协议使用
ICMP 报文格式
通过 Type 和 Code 定义 ICMP 的报文类型
ICMP 报文主要分为查询报文和差错报文两大类
查询报文:主要用于在主机和路由器之间传输控制信息,也用来探测网络连通性和路径等信息
差错报文:用于报告数据传输过程中的错误
Type Code 描述 0 0 回显应答(ping 应答) 8 请求回显(ping 请求) 9 路由器通告 10 路由器请求 13 时间戳请求(目前已不使用) 14 时间戳应答(目前已不使用) 15 信息请求(目前已不使用) 16 信息应答(目前已不使用) 17 地址掩码请求 18 地址掩码应答 3(目的不可达报文) 0 网络不可达 1 主机不可达 2 协议不可达 3 端口不可达 6 目的网络不认识 7 目的主机不认识 9 目的网络被强制禁止 10 目的主机被强制隔离 11 由于 TOS,网络不可达 12 由于 TOS,主机不可达 13 由于过滤,通信被强制禁止 4(源抑制报文) 0 源端被关闭 1 对主机重定向 2 对服务类型和网络重定向 3 对服务类型和主机重定向 11(TTL 为 0 报文) 0 传输期间生存时间为 0 1 在数据报组装期间生存时间为 0 12(报文格式问题) 0 坏的 IP 首部 1 缺少必须的选项
ICMP 回显请求 / 应答报文
作用
通过 ping 工具发送 ICMP 回显请求消息探测网络的连通性(对端回应 ICMP 回显应答请求)
通过 tracert 工具发送 ICMP 回显请求来探测去往某目的网路的路径信息(修改 ICMP 回显请请求的 TTL 的值,通过对端回应的 Type 为 11 的 ICMP 差错报文来得到路径信息)
报文格式
Type
8 为请求
0 为应答
Identifier
标识符,标识 ICMP 该回显应答对应的是哪个回显请求(通过该字段使得请求和应答一一对应)
BE 和 LE 是通过不同的编码格式得到的值,解码后的信息都是一样的
可以理解为 BE 是针对于 windows 系统的编码格式,LE 是针对于 Linux 系统的编码格式
Sequence Number
序列号,发送报文的序列号,每次发送序列号就 + 1
Data
可选,包含要发送的数据(回显应答通常返回与回显请求所收到的数据相同)
ping 命令
通过发送 Internet 控制消息协议(ICMP)验证与其他 TCP/IP 计算机的 IP 级连接回显请求消息
Ping 的错误提示
无法解析域名(查询不到该域名对应的 IP 地址)
是否配置 DNS 服务器地址
检查是否能够该访问 DNS 服务器
如果是内网的 DNS 服务器,可能是 DNS 服务器没有该域名对应的记录(也有可能是该域名不存在)
请求超时(我们的 ping 报文到达了对端,但是目标没有回应)
目标主机禁止 ping 服务(可能防火墙将 ping 服务限制了)
该 IP 地址不存在
传输失败
可能是我们主机网卡的问题
无法访问目标网络(一般是访问不同网段会出现此情况,表示我们的报文没有发给网关)
本地没有关于网关的 ARP 表项,检查网关地址是否正确
Ping 网关是否能够通信(不能的话再去深入检查)
tracert 命令(Windows 的命令; Linux 对应的命令为 traceroute)
tracert 是通过试图以最小的 TTL 发出 ICMP 探测包,然后监听回应的 ICMP 的应答,依次来跟踪获取到数据包到达目的主机所经过的网关(发送数据包的大小默认为 32 字节)
ICMP 差错报文
ICMP 差错报文都有一个的字段(IP 头部 + 原始数据包的前 64 bits)
该字段的内容包含出错数据包的 IP 头部以及出错数据包的前 64 位数据(端口号、序列号、其它协议报文头部等)
该字段的作用就是将产生该错误的报文附带在差错报文中,当管理员看到差错报文时知道是什么原因产生的错误,有利于排查错误
以下情况不会产生 ICMP 差错报文
1、对于携带 ICMP 差错报文的数据包,不会在产生 ICMP 差错报文
2、对于分片的数据包,如果不是第一个分片,则不会产生 ICMP 差错报文
3、对于具有组播地址的数据报文,不会产生 ICMP 差错报文
4、对于具有特殊地址的数据报文(如 127.0.0.0 和 0.0.0.0),不会产生 ICMP 差错报文
ICMP 宿主机不可达差错报文
一般是本地没有去往报文目的 IP 地址的路由,就会向报文的源 IP 地址回应 ICMP 差错报文(宿主机不可达)
网络不可达差错报文(当路由器上没有去往目的网段的路由时就会发送网络不可达差错报文)
从数据包中可以看出来
-
当 ICMP Echo Request 报文到达 192.168.10.254 这台设备时
-
这台设备(10.254)发现自己没有去往该报文目的地址 100.0.0.1 的路由
-
此时这台设备(10.254)就发送 ICMP 差错报文 - 网络不可达消息给 ICMP Echo Request 报文的源 IP 地址(10.129)
端口不可达 IP 报文(一般在 tracert 跟踪路由场景下会出现此差错报文)
Tracert 主要是用来跟踪路径,在跟踪路径的过程中如果某个路由器或目标主机上的应用程序没有在相应的端口上监听,此时收到 ICMP 回显请求时会回应端口不可达的 ICMP 差错报文、或者当网络管理员阻止了 ICMP 回显请求时也会发送端口不可达的 ICMP 差错报文(端口不可达信息不止因为 Tracert 产生,还会因为其它操作产生,只是 Tracert 是比较常见的)
从数据包中可以看出来
-
当 172.22.105.211 访问 172.22.105.254 的 137 端口时
-
这台设备(105.254)发现自己并没有开启该端口的监听(或者拒绝接收 ICMP 回显请求)
-
此时这台设备(105.254)就发送 ICMP 差错报文 - 端口不可达消息给 172.22.105.211
ICMP 重定向差错报文
产生重定向报文的场景
1、从一个接口接收到的报文再从同一个接口发出去,一般就会产生 ICMP 重定向(不一定是环路)
2、当设备从某个接口收到发往远程网络的数据时,发现源 IP 地址与下一跳属于同一网段时也会产生 ICMP 重定向
ICMP 重定向报文的作用
当主机收到 ICMP 重定向差错报文后,会将自己去往目的 IP 地址(该目的 IP 地址为 ICMP 差错报文中携带的 IP 头部的目的 IP 地址)的网关设置为该地址
即 ICMP 重定向报文会通知该主机修改自身的路由表(将去往目的 IP 地址的下一跳修改为 ICMP 重定向报文携带的最佳下一跳的 IP 地址)
报文格式
从数据包中可以看出来
-
当 192.168.10.129 这台设备去访问 192.168.10.1 时,将此数据包发给了 192.168.10.254
-
此时 192.168.10.254 发现自身去往 192.168.10.1 的下一跳接口为自己接收此报文的入接口,并且也发现源 IP10.129 与目的 IP10.1 为同一网段
-
此时 10.254 这台设备就认为 10.129 可以直接去往 10.1
-
于是 10.254 就向 10.129 发送 ICMP 重定向报文(Gateway 字段设置为 10.1),让 10.129 访问 10.1 可以直接将报文交给 10.1,不需要再交给自己
ICMP TTL 超时差错报文
当 IP 数据包在传输过程,在还没有到达目的 IP 地址的时候 IP 层的 TTL 变为 0(路由器收到时为 1 的报文就会认为 TTL 超时),此时该路由器就会发送 ICMP 差错超时报文(Tracert 就是通过差错报文来跟踪路径的)
报文格式
从数据包中可以看出来
-
当 172.22.105.211 这台设备去访问 1.1.1.1,封装数据包
-
当 172.22.105.254 收到该数据包是发现该报文的 TTL 为 1,但是本设备又不是报文的目的地址
-
于是 105.254 就向 105.211 发送 ICMP TTL 超时报文,让其增加 TTL 值
组播 ——IGMP 协议讲解
静下心来敲木鱼已于 2023-10-09 15:04:39 修改
IGMP 基本概念
IGMP 因特网组管理协议,负责 IPv4 组播成员注册管理的协议,用来在接收者和与其直接相连的组播路由器之间建立、维护组播成员关系
IGMP 是运行在最后一跳路由器和组成员之间的控制协议,路由器通过 IGMP 协议来了解每个接口连接的网段上是否存在组播组的接收者,以此将组播组在对应接口转发(如果组播源和组成员之间为二层网络,则不需要配置 IGMP 协议)
主机侧:通过 IGMP 协议向路由器通告组成员关系
路由器侧:通过 IGMP 协议维护组成员关系
IGMP 版本
IGMP 目前有三个版本,其基本区别如下
IGMPv1
普遍组查询报文、成员关系报告报文、响应抑制机制
IGMPv2-- 相比 v1
新增特定组查询报文、增加成员离开报文、可以选举查询器、最大响应时间可更改
IGMPv3— 相比 v2
新增特定组播源查询报文、删除了单独的成员离开报文、删除了响应抑制机制
注意:
v1、v2、v3 都支持 ASM 模型
v3 可以直接支持 SSM 模型,v1、v2 需要通过 SSM-Mapping 技术来支持 SSM 模型
IGMP 报文类型
### IGMP 表项
报文类型
作用
主机发送
Membership Report
主机加入组播组
Leave Group
主机离开组播组
IGMP查询器发送
General Query
普遍组查询;维护组播表项
Group-Specific Query
特殊组查询;维护组播表项
IGMP 的表项老化时间大概是 3 分钟
–
IGMP v1
两种协议报文
1、普遍组成员关系查询报文 —— 报文中的组播地址字段为 0.0.0.0
-
组播路由器周期向局域网段内通过 224.0.0.1 发送查询报文(周期 60s)
-
向网段内的所有主机发送的查询报文,用来查询哪些组播组存在成员
-
网段内的所有主机、路由器都可以接收
2、成员关系报告报文 —— 报文中的组播地址字段为 D 类非 224.0.0.X 地址
报告成员加入了哪个组播组,发送此报文有两种情况
-
主动报告:当主机加入某个组播组时,主动发送此报文
-
被动报告:当主机收到查询报文后,必须在最大响应时间内随机取一个值,进行计时,计时结束后被动发送成员关系报告报文。(最大响应时间 10s)
-
最大响应时间结合响应抑制机制,可以节约网络带宽
注意:
路由器周期性发送普遍组查询报文(缺省 60s)
成员关系报告报文格式
响应抑制机制
在被动报告时,会触发相应的响应抑制机制,节约带宽
当多台主机属于同一组播组时,计时器(最大响应时间)先超时的主机发送成员报告报文后,其余主机收到该成员报告报文后停止计时,不再发送成员报告报文
IGMPv1 问题
1、当成员离开组播组时,静默离开。IGMPv1 中没有单独的离开报文。
当查询 130s 没有收到响应时,则组播路由器就会认为该成员离开
130s 来源:查询报文周期 (60s)× 健壮系数 (2)+ 最大响应时间 (10s)
健壮系数 —— 指的是特定组查询连续发送的次数(v2 有特定组查询)
2、查询器选举
当网段内只有一台组播路由器时,则此组播路由器来发送查询报文。
当网段内有多台组播路由器时,通过选举出来一个组播路由器充当查询器来发送查询报文。
-
IGMPv1 没有定义选举查询器的功能,需要依赖组播路由协议 PIM 来进行选举
-
在 v1 版本中,查询器由 PIM 的 DR 充当。其负责周期性的发送普遍组查询报文
-
DR 选举:R3 和 R4 在建立 PIM 邻居时。先比较 DR 优先级,大的为 DR。再比较连接主机端的 IP 地址,大的为 DR。
3、IGMPv1 中路由器无法控制成员的最大响应时间(10s)
–
IGMPv2
查询器选举 —— 不依赖组播路由协议
当网段内有多台组播路由器时,选举 IP 地址最小的 IGMPv2 路由器为查询器。
注意:
-
初次成为查询者时,前两次发送的普遍组查询报文间隔 15s,之后再每隔 60s 发送一次普遍组查询报文
-
非查询者在 125s 内收不到查询者发的查询报文,则会认为查询器失效,重新失效
-
125s 是 “其它 IGMP 查询者的存活时间”,可以修改。此时间 = 健壮系数 * 普遍组报文发送间隔 + 一半的最大响应时间
三种协议报文
1、查询报文 —— 细分为两种报文
普遍组查询报文
特定组查询报文 —— 报文的组播地址字段为被查询的组播组 IP 地址
-
向网段内特定组播组的主机发送的查询报文,用于查询该组播组是否存在成员
-
仅当查询者收到主机的离组报文后,才发送特定组查询报文
-
当连续 2 次特定组查询报文都无响应时,代表成员已经从此组播组离开
2、成员关系报告报文 —— 与 v1 相比最大响应时间有变化
-
主机收到普遍组查询报文的最大响应时间为 10s(0~10 取一个随机值),计时结束时发送此报文。(此最大响应时间可调 – 最大调为 25s)
-
主机收到特定组查询报文的最大响应时间为 1s(0~1 取一个随机值),计时结束时发送此报文。(此最大响应时间可调 – 最大为 5s)
3、成员离开报文 —— 报文的组播地址字段为被查询的组播组 IP 地址
-
成员离开组播组后主动向网段内所有组播路由器发送离开报文
-
发送的目的地址是 224.0.0.2
注意:
- v2 依旧拥有响应抑制机制(普遍组查询和特定组查询都有效)
成员关系报告报文格式
–
IGMPv3
两种协议报文
1、查询报文 —— 细分为三种
普遍组查询报文
特定组查询报文
特定组及源查询报文 —— 报文的组播地址字段为被查询的组播组 IP 地址
- 向网段内特定组播组的主机发送的查询报文,用于查询该组成员是否愿意接收特定源发送的数据
2、报告报文(目的地址为 224.0.0.22)
IGMPv3 主要使用 224.0.0.22 地址来进行成员关系报告
不同于 v1 和 v2 的报告报文
v3 使用组记录来表达组播组和组播源的对应关系
v3 并且一份报文可以携带多个组记录(v1、v2 一份报文只能携带一个组播组)
组记录类型
当前状态记录 | MODE_IS_INCLUDE | 过滤模式为 INCLUDE 形式:组播组 G,INCLUDE,(S1、S2、S3) 表示接收组播组 G 中组播源为 S1、S2、S3 的数据 |
MODE_IS_EXCLUDE | 过滤模式为 EXCLUDE 形式:组播组 G,EXCLUDE,(S1、S2、S3) 表示接收组播组 G 中除了组播源 S1、S2、S3 之外的组播源的数据 | |
状态变化记录类型 | CHANGE_TO_INCLUDE_MODE | 将当前的过滤模式更改为 INCLUDE |
CHANGE_TO_EXCLUDE_MODE | 将当前的过滤模式更改为 EXCLUDE | |
源列表变化记录 | ALLOW_NEW_SOURCES | 如果现在的过滤模式为 INCLUDE,则向现有源列表中添加这些组播源 如果现在的过滤模式为 EXCLUDE,则从现有源列表中删除这些组播源 |
BLOCK_OLD_SOURCES | 如果现在的过滤模式为 EXCLUDE,则向现有源列表中添加这些组播源 如果现在的过滤模式为 INCLUDE,则从现有源列表中删除这些组播源 |
注意:
v3 无响应抑制机制了
并且成员离开不再发送特定的报文,而是使用含有组记录的成员报告来表达
报文格式
特定组及源查询报文的格式
报告报文的格式
via:
-
ICMP 协议以及报文讲解(ICMP 查询报文、ICMP 差错报文)_icmp 报文 - CSDN 博客 静下心来敲木鱼 已于 2023-12-15 20:13:50 修改
m,https://blog.csdn.net/m0_49864110/article/details/134885390
-
组播 ——IGMP 协议讲解 - CSDN 博客 静下心来敲木鱼已于 2023-10-09 15:04:39 修改