ICMP 和 IGMP 的区别

ICMP 和 IGMP 协议 IP 层分支图


ICMP 和 IGMP 的区别

ICMP(Internet Control Message Protocol,因特网控制信息协议)

用于补充 IP 传输数据报的过程中,发送主机无法确定数据报是否到达目标主机。

ICMP 报文分为出错报告报文和查询报文两种。

若数据报不能到达目标主机,ICMP 出错报告报文可以以回送信息的方式,向源主机发去信息,并不能纠正数据报中的任何出错。

除了出错报告,ICMP 还可以诊断出某些网络问题,这就是 ICMP 的查询报文。

ICMP 源抑制消息:当 TCP/IP 主机发送数据到另一主机时,如果速度达到路由器或者链路的饱和状态,路由器发出一个 ICMP 源抑制消息。

ICMP 数据包结构

类型:一个 8 位类型字段,表示 ICMP 数据包类型。

代码:一个 8 位代码域,表示指定类型中的一个功能。如果一个类型中只有一种功能,代码域置为 0。

检验和:数据包中 ICMP 部分上的一个 16 位检验和。

指定类型的数据随每个 ICMP 类型变化的一个附加数据。

IGMP (Internet Group Management Protocol,因特网组管理协议)

用于建立和管理多播组,对 IP 分组广播进行控制。

internet 控制消息协议 ICMP 是用于报告错误并代表 IP 对消息进行控制。

IP 运用互联组管理协议 IGMP 来告诉路由器,某一网络上指导组中的可用主机。

IGMP 信息传给别的路由器以使每个支持多路广播的路由器获知哪个主机组和哪个网络中。

IGMP 包结构

版本:IGMP 的版本,值一般为 0x1h。

类型:IGMP 消息的类型。

  • 0x1h 类型称为主机成员请求,在多路广播路由器上用于指定多级组中的任何成员轮询一个网络。

  • 0x2h 类型称为主机成员报告,在主机上用于发布指定组中的成员情况或对一个路由器的主机成员请求进行回答。

未用:未用的域名被发送者置零且被接收者忽略。

检验和:IGMP 头的一个 16 位检验和。

组地址:主机用该组地址在一个主机成员请求中存储 IP 多路广播地址。在主机成员请求中,组地址被全置零,而且硬件级的多路广播地址被用来标示主机组。

ICMP 和 IGMP 的比较

编号   ~   ICMP IGMP
1 ICMP 代表 Internet 控制消息协议。 IGMP 代表 Internet 组消息协议。
2 ICMP 具有 PING 功能。 IGMP 具有多播功能。
3 Internet 控制消息协议是单播的。 互联网组消息协议是多播的。
4 ICMP 可以在主机到主机或主机到路由器或路由器到路由器之间运行。 IGMP 可用于客户端到多播路由器之间。
5 ICMP 第 3 层协议。 IGMP 第 3 层协议。
6 控制单播通信,用于报错。 IGMP 控制多播通信。
7 ICMP 可以是主机和网关用来将数据报下行通知发送回发送者的机制。 IGMP 用于促进将消息同步传输到一堆接收者。
8 ICMP 用于测试主机或网络的可达性。 IGMP 用于 DTS 服务等分组数据传输。

注:节选部分原文。

via:


ICMP/IGMP 协议原理

一、ICMP 协议原理

ICMP 主要的功能包括:确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等。

在 IP 通信中如果某个 IP 包因为某种原因未能达到目标地址,那么这个具体的原因将由 ICMP 负责通知。

img

如上图例子,主机 A 向主机 B 发送了数据包,由于某种原因,途中的路由器 2 未能发现主机 B 的存在,这时,路由器 2 就会向主机 A 发送一个 ICMP 目标不可达数据包,说明发往主机 B 的包未能成功。ICMP 的这种通知消息会使用 IP 进行发送 。

因此,从路由器 2 返回的 ICMP 包会按照往常的路由控制先经过路由器 1 再转发给主机 A 。收到该 ICMP 包的主机 A 则分解 ICMP 的首部和数据域以后得知具体发生问题的原因。

1.1 ICMP 大致可以分为两大类:

  • 一类是用于诊断的查询消息,也就是查询报文类型。

  • 另一类是通知出错原因的错误消息,也就是差错报文类型

img

1.2 目标不可达类型的代码

  • 网络不可达代码为 0

  • 主机不可达代码为 1

  • 协议不可达代码为 2

  • 端口不可达代码为 3

  • 需要进行分片但设置了不分片位代码为 4

img

二、IGMP 协议原理

ICMP 跟 IGMP 是一点关系都没有的,大家不要混淆了。

D 类地址中的地址是组播地址,只有一组的主机能收到数据包,不在一组的主机不能收到数组包。

怎么管理是否是在一组呢?那么,就需要 IGMP 协议了。

img

IGMP 是因特网组管理协议,工作在主机(组播成员)和最后一跳路由之间,如上图中的蓝色部分。

  • IGMP 报文向路由器申请加入和退出组播组,默认情况下路由器是不会转发组播包到连接中的主机,除非主机通过 IGMP 加入到组播组,主机申请加入到组播组时,路由器就会记录 IGMP 路由器表,路由器后续就会转发组播包到对应的主机了。

  • IGMP 报文采用 IP 封装,IP 头部的协议号为 2,而且 TTL 字段值通常为 1,因为 IGMP 是工作在主机与连接的路由器之间。

2.1 IGMPv2 查询与响应原理

img

  1. 路由器会周期性发送目的地址为 224.0.0.1 (表示同一网段内所有主机和路由器) IGMP 常规查询报文。

  2. 主机 1 和 主机 3 收到这个查询,随后会启动「报告延迟计时器」,计时器的时间是随机的,通常是 0~10 秒,计时器超时后主机就会发送 IGMP 成员关系报告报文(源 IP 地址为自己主机的 IP 地址,目的 IP 地址为组播地址)。如果在定时器超时之前,收到同一个组内的其他主机发送的成员关系报告报文,则自己不再发送,这样可以减少网络中多余的 IGMP 报文数量。

  3. 路由器收到主机的成员关系报文后,就会在 IGMP 路由表中加入该组播组,后续网络中一旦该组播地址的数据到达路由器,它会把数据包转发出去。

2.2 IGMPv2 离开组播组工作机制

离开组播组的情况一,网段中仍有该组播组:

img

  1. 主机 1 要离开组 224.1.1.1,发送 IGMPv2 离组报文,报文的目的地址是 224.0.0.2(表示发向网段内的所有路由器)

  2. 路由器 收到该报文后,以 1 秒为间隔连续发送 IGMP 特定组查询报文(共计发送 2 个),以便确认该网络是否还有 224.1.1.1 组的其他成员。

  3. 主机 3 仍然是组 224.1.1.1 的成员,因此它立即响应这个特定组查询。路由器知道该网络中仍然存在该组播组的成员,于是继续向该网络转发 224.1.1.1 的组播数据包。

离开组播组的情况二,网段中没有该组播组:

img

  1. 主机 1 要离开组播组 224.1.1.1,发送 IGMP 离组报文。

  2. 路由器收到该报文后,以 1 秒为间隔连续发送 IGMP 特定组查询报文(共计发送 2 个)。此时在该网段内,组 224.1.1.1 已经没有其他成员了,因此没有主机响应这个查询。

  3. 一定时间后,路由器认为该网段中已经没有 224.1.1.1 组播组成员了,将不会再向这个网段转发该组播地址的数据包。


via:

相关推荐

  1. 计算机网络层之ICMPIGMP

    2024-07-21 12:38:01       47 阅读
  2. ICMPtype字段、code字段

    2024-07-21 12:38:01       21 阅读
  3. 计算机网络-ICMPARP协议——沐雨先生

    2024-07-21 12:38:01       32 阅读
  4. ICMP控制消息 汇总

    2024-07-21 12:38:01       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-21 12:38:01       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-21 12:38:01       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-21 12:38:01       45 阅读
  4. Python语言-面向对象

    2024-07-21 12:38:01       55 阅读

热门阅读

  1. 如何使用C++中的字符串类(如std::string)

    2024-07-21 12:38:01       15 阅读
  2. Ubuntu 20安装JDK17和MySQL8.0

    2024-07-21 12:38:01       16 阅读
  3. OpenJudge | 约瑟夫问题

    2024-07-21 12:38:01       14 阅读
  4. 在Jupyter Notebook中进行大数据分析:集成Apache Spark

    2024-07-21 12:38:01       16 阅读
  5. webpack

    2024-07-21 12:38:01       21 阅读
  6. 算法剩余部分

    2024-07-21 12:38:01       15 阅读
  7. 【SQL】百万千万级最大表如何添加字段

    2024-07-21 12:38:01       18 阅读
  8. 谓词 & lambda & bind()

    2024-07-21 12:38:01       14 阅读