IGMP协议

本文详细介绍了IGMP(Internet Group Management Protocol)协议的不同版本及其报文格式,并解释了IGMP如何帮助主机与组播路由器交互多播成员关系管理信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IGMP 是Internet Group Management Protocol(互联网组管理协议)的简称。它是TCP/IP 协议族中负责IP 组播成员管理的协议,用来在IP主机和与其直接相邻的组播路由器之间建立、维护组播组成员关系。 
  IGMP协议(IPv4) 和MLD协议(IPv6)用来帮助主机指定对那些组感兴趣(加入哪一些多播组),以及确定来自某些特定源的报文应该被接收还是过滤掉。为了实现这一目标,主机需要向本地子网的组播路由器发送一些报文来向组播路由器交互一些多播成员关系管理的信息。 
  IGMP协议到目前已经有三个版本。 
+ IGMPv1(由RFC 1112 定义) 
+ IGMPv2(由RFC 2236 定义) 
+ IGMPv3(由RFC 3376 定义)

1. 报文

  IGMP协议涉及到2种报文, 
+ 查询报文 
+ 报告报文(包括加入报文和离开报文) 
  IGMP协议报文的具体格式,与IGMP版本有关,不同的版本格式也会不一样。 
  IGMP在IP层是分装成IP数据报进行传输的。IGMPv1和IGMPv2报文具有固定长度8字节。IGMPv3查询报文和报告报文不一样,且报文没有固定长度(因为要包含指定源地址)

(1) IGMPv1报文 与 IGMPv2 报文

IGMPv1报文首部 
这里写图片描述 
IGMPv2报文首部: 
这里写图片描述 
  IGMPv2报文首部兼容IGMPv1报文首部 
* Type:* 
0x11-成员查询; 
0x12-IGMPv1成员报告; 
0x16-IGMPv2成员报告 
0x17-IGMPv2成员离开。 
* Max Rsp Code:* 
最大响应时间,缺省10s(以0.1s为单位) 
* Checksum:* 
校验和 
* Group Address: * 
组播组地址 
IGMPv2普通查询:组地址为0.0.0.0,目的地址为224.0.0.1 
IGMPv2特定组查询:组地址和目的地址为要查询的特定组地址 
IGMPv2成员报告:组地址和目的地址为要报告的组地址 
IGMPv2离开报文:组地址为要离开的组地址,目的地址为224.0.0.2

(2) IGMPv3 查询报文

这里写图片描述 
* Type:* 0x11 表示成员关系查询报文 
Max Rsp Code:最大响应代码 
S标志:(禁止路由器处理),禁止任何接收路由器更新它们在收到查询时要更新 的那些 定时器(通常设为0) 
QRV:查询者健壮变量(<=7) 
QQIC:查询者查询间隔代码 
注: 
IGMPv3普通查询源地址和组地址为0.0.0.0,目的地址为224.0.0.1 
IGMPv3特定组查询源为0.0.0.0 ,组地址和目的地址为为查询组组地址。 
IGMPv3特定组和源查询组地址和目的地址为查询组地址,源地址含有指定源地址。

(3) IGMPv3 报告报文

这里写图片描述

  IGMPv3的报告报文兼容IGMPv1、和IGMPv2的报告报文。 
Type: 报告类型: 
0x22-V3成员报告 
0x12-V1成员报告 
0x16-V2成员报告 
0x17-V2离开报告 
Reserved: 保留 
CheckSum: 检验和 
Reserved: 保留 
* Num of Grp Records:* 多播组记录的数目。 
* Group Record:* 多播组记录,其格式如下所示: 
这里写图片描述 
Records Type: 记录类型

Record Type 名称 含义 何时发送
0x01 IS_IN MODE_IS_INCLUDE:来自相关源地址的报文不应该被过滤掉 用于应答多播路由器的查询报文
0x02 IS_EX MODE_IS_EXCLUDE:来自相关源地址的报文应该被过滤掉 用于应答多播路由器的查询报文
0x03 TO_IN CHANGE_TO_INCLUDE_MODE:来自相关源地址的报文不应该被过滤掉 本地应用程序过滤状态发生变化
0x04 TO_EX CHANGE_TO_EXCLUDE_MODE:来自相关源地址的报文应该被过滤掉 本地应用程序过滤状态发生变化
0x05 ALLOW ALLOW_NEW_SOURCES:来自相关源地址的报文不应该被过滤掉 多播源地址列表发生变化
0x06 BLOCK BLOCK_OLD_SOURCES:来自相关源地址的报文应该被过滤掉 多播源地址列表发生变化

  我们可以看到 Record Type为 0x01、0x02时,记录表示的是一种当前的状态,即主机当前对某种组播感兴趣;0x03、0x04主要是翻译了对某种组播是否感兴趣的状态发生的变化;0x05,0x06则是表示源地址列表发生了变化。 
  我们知道,多播路由器会定时发送查询报文,这是主机在应答时发送的报告报文的记录类型就是0x01、0x02这两种记录。 如果主机因自身对多播组的兴趣发生变话,而主动发送报告报文,那么报文的记录类型就是0x03、0x04、0x05、0x06这几种,具体是哪一种取决于主机对多播组的兴趣发生了怎么样的变化。

Aux Data Type:辅助数据类型 
Num of Sources: 多播源地址列表的数据。 
Multicast Address: 多播组地址 
Sources Address: 多播源地址列表 
Auxiliary Data:辅助数据

2. 轻量级IGMPv3

  在前面介绍IGMPv3的报文时,在Group Record时,可以看到,Record Type有许多中类型,IS_IN、IS_EX、TO_IN、TO_EX、ALLOW、BLOCK。这里我们关注下IS_IN、IS_EX、TO_IN、TO_EX这四种Mode(其实是两对)。我们先看IS_IN、IS_EX这一对模式,它们分别表示有主机针对某个组播来自特定源的流量感兴趣,以及本地子网对某个组播来自特定源的流量不感兴趣。事实上,任何可以用IS_EX组播表示的成员关系,也都可以用对应的IS_IN表示。 比如:IS_EX(ALL)相当于IS_IN(NULL), IS_EX(NULL)相当于IS_IN(ALL), IS_EX(src1,src2)相当于IS_IN(src3,src4…)。同理,所有能以TO_EX表示的成员关系,可以都可以用TO_IN表示。 
  出于上面的结论,为了使得IGMPv3更加简洁易用,轻量级的IGMPv3遍出现了。首先,IGMPv3应该支持ASM和SSM。先考虑SSM的情况,我们如果要指定组播源,那么这个组播源大多数情况下是属于全体组播源中的少数,所以在指定组播源时,轻量级的IGMPv3不再使用IS_EX(a,b,c…)和TO_EX(a,b,c…), 而都用IS_IN和TO_IN表示。在考虑ASM的情况,由于不指定组播源,如果我们使用IS_IN和TO_IN,那要包含所有的组播源,这样就会导致Report消息太繁重。因此,我们仍然支持IS_EX(NULL)和TO_EX(NULL)来表示ASM。

### IGMP协议的工作原理 IGMP(Internet Group Management Protocol,互联网组管理协议)是用于IPv4网络中主机和路由器之间通信的协议,主要用于管理和控制组播数据的传输。以下是IGMP协议的工作原理及相关内容: #### 1. 协议功能 IGMP协议的主要功能是让主机能够加入或离开特定的组播组,并通知路由器哪些组播组在子网内有活跃成员。这使得路由器可以有效地将组播流量转发到需要它的子网,而不会浪费带宽向没有成员的子网发送流量[^2]。 #### 2. 工作流程 IGMP协议通过以下机制实现其功能: - **查询报文**:多播路由器会定期发送IGMP查询报文到所有主机,以了解是否有任何主机包含属于某个组播组的进程。这些查询报文会被发送到特殊的组播地址(如224.0.0.1),并且组地址字段通常被设置为0[^2]。 - **成员报告**:当主机接收到查询报文时,如果它属于某个组播组,则会发送一个成员报告给路由器,表明自己仍在该组中。这样,路由器可以保持对活跃组播组的跟踪[^2]。 - **离开组**:当主机希望离开某个组播组时,它可以发送一个离开组的消息。路由器接收到此消息后,会进一步确认是否还有其他主机留在该组中。如果没有其他成员,则停止向该子网转发该组播组的数据。 #### 3. 版本差异 IGMP有多个版本,每个版本的功能有所不同: - **IGMPv1**:仅支持基本的查询和报告机制,不支持显式的离开组操作。 - **IGMPv2**:增加了离开组消息的支持,允许路由器更快地检测到主机离开组的情况。 - **IGMPv3**:扩展了源过滤功能,允许主机指定接收或拒绝来自特定源的组播流量[^1]。 #### 4. IGMP Snooping 除了IGMP本身的功能外,IGMP Snooping是一种二层技术,用于优化局域网中的组播流量。通过监听主机和路由器之间的IGMP报文,交换机可以建立和维护二层组播转发表,从而确保组播数据帧只转发到需要的端口,避免不必要的广播流量[^1]。 ```python # 示例代码:模拟IGMP查询与响应过程 class IGMP: def __init__(self): self.groups = {} def query(self, interface): print(f"Router sends IGMP query on {interface}") return "Group Address: 0" def report(self, group, interface): if group not in self.groups: self.groups[group] = [] self.groups[group].append(interface) print(f"Host reports membership for group {group} on {interface}") # 测试 igmp = IGMP() query_result = igmp.query("eth0") igmp.report("224.1.1.1", "eth0") ``` #### 5. 应用场景 IGMP广泛应用于视频流媒体、在线会议、远程教育等需要高效传输大量数据的应用场景中。通过减少不必要的数据传输,IGMP显著提高了网络资源的利用率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值