文章目录
IP多播协议
要在因特网上进行IP多播,就必须要考虑IP多播数据报经过多个多播路由器进行转发的问题。多播路由器必须根据IP多播数据报首部中IP多播地址,将其转发到有该多播组成员的局域网。
网际组管理协议IGMP
网际组管理协议(Internet Group Management Protocol,IGMP
)是 TCP/IP 体系结构网际层中的协议,其作用是让连接在本地局域网上的多播路由器知道本局域网上,是否有主机(实际上是主机中的某个进程)加入或退出了某个多播组。
IGMP
仅在本网络有效,使用 IGMP
并不能知道多播组所包含的成员数量,也不能知道多播组的成员都分布在哪些网络中。
IGMP的三种报文类型
网际组管理协议 IGMP
目前的最新版本是2002年10月公布的 IGMPv3
[RFC 3376]
。
IGMP
有三种报文类型:
- 成员报告报文
- 成员查询报文
- 离开组报文
IGMP 报文被封装在 IP 数据报中传送,TCP/IP 的网际层会为其添加一个 IP 首部,使之成为 IP 数据报:
-
协议字段的值=2,表示数据载荷部分是 IGMP 报文
-
目的地址字段的值根据其所封装 IGMP 报文类型各有不同,但都属于IP多播地址。
-
生存时间TTL字段的值=1,避免封装 IGMP 报文的 IP 多播数据报被路由器转发到其他网络。
-
封装有 IGMP 报文的 IP 数据报都是 IP 多播数据报
IGMP的基本工作原理
加入多播组
加入多播组:希望加入多播组的主机(即希望接收多播数据的设备)向以太网发送IGMP成员报告报文。
假设 主机B 首先以太网发送 IGMP 成员报告报文,主机A 也要发送 IGMP 成员报告报文,接收到 主机B 发送的成员报告报文后,就取消发送自己的成员报告报文:
-
主机B发起请求:
- 主机B首先决定它想要加入一个具有 IP 地址
226.0.9.26
的多播组。 - 它通过发送一个 IGMP 成员报告报文来表达这一意图。这个报文被封装在 IP 多播数据报中,再进一步封装在以太网多播帧里。
- 报文中指定了目标多播地址
226.0.9.26
,以及对应的以太网多播地址01-00-5E-00-09-1A
。
- 主机B首先决定它想要加入一个具有 IP 地址
-
路由器R1接收到请求:当路由器 R1 收到这个 IGMP 成员报告报文时,它解析出相关信息,并将其添加到内部维护的多播组列表中。此时,R1 知道至少有一台主机(B)对该多播组有兴趣。
-
其他主机的行为:其他主机(如 A, C 和 D)也可能尝试加入不同的多播组。
-
主机A 同样希望加入
226.0.9.26
组,但它发现 B 已经发送了请求,于是选择不发送自己的 IGMP 成员报告报文。 -
主机C 想加入另一个多播组
228.1.1.1
,但它的请求在 MAC 层就被丢弃了,可能是由于某种原因(例如,该组不在其配置范围内)。 -
主机D 不打算加入任何多播组,因此不会发送 IGMP 成员报告报文。
-
-
结果:
- 最终,路由器 R1 的多播组列表中记录了两个组:226.0.9.26 和 228.1.1.1。
- 对于每个组,R1 会根据成员情况调整其多播数据的转发策略,确保仅将数据发送给已知的感兴趣成员所在的子网。
监视多播组的成员变化
监视多播组的成员变化:多播路由器默认每隔125秒就向其直连网络发送一个封装有 IGMP 成员查询报文的 IP 多播数据报
多播路由器发送IGMP成员查询报文
-
IGMP成员查询报文中的内容也可以是
0.0.0.0
,表示全部多播组 -
224.0.0.1
是特殊的IP多播地址,在本网络中所有参加多播的主机和路由器的网际层都会接受该多播数据报 -
以太网多播帧的目的地址,是由IP多播数据报的目的地址映射而来的多播MAC地址
-
IGMP成员查询报文的封装:查询报文被封装在 IP 多播数据报中,然后再封装在以太网多播帧中。IP 多播数据报的目标地址通常是
224.0.0.1
(所有系统组),这是标准的多播地址,用于向网络中的所有主机发送消息。 -
查询报文的内容:查询报文中包含多播组的IP地址
226.0.9.26
,说明路由器正在询问是否有主机想要加入这个特定的多播组。 -
主机响应查询:
-
主机A 和 主机B 分别在收到查询后的 2 秒和 8 秒内回应了
IGMP
成员报告报文,表明它们有意加入指定的多播组。 -
主机C没有回应,这意味着它不想加入该多播组。
-
主机D也不在任何多播组中,因此也不会回应查询。
-
-
MAC层处理:
-
主机A 和 主机B 的 MAC 层接受了查询报文,并向上层传递。
-
主机C 和 主机D 的 MAC 层丢弃了查询报文,因为它们没有加入相关的多播组。
-
-
多播组列表更新:根据主机的响应,路由器R1更新了其多播组列表,记录下了哪些主机对哪个多播组感兴趣。
通过这样的周期性查询和响应机制,多播路由器能够保持最新的多播组成员信息,从而更有效地管理和转发多播数据。
多播组成员发送IGMP成员报告报文
-
收到IGMP成员查询报文的被查询多播组的任何成员,将会发送IGMP成员报告报文作为应答,为了减少不必要的重复应答,每个多播组只需要有一个成员应答就可以了。
-
因此,采用了一种延迟响应的策略,收到IGMP成员查询报文的主机并不是立即响应,而是在1~10秒的范围内,等待一段随机的时间后再进行响应。如果在这段随机的时间内,收到了同组其他成员发送的IGMP成品报告报文,就取消响应。
多播路由器移除多播组成员
假设 主机C 不再是多播组 228.1.1.1
的成员,多播路由器长时间收不到该多播组成员的响应,则将其从多播组列表中删除。
注意事项
-
同一网络中的多播路由器可能不止一个,但没有必要每个多播路由器都周期性地发送IGMP成员查询报文。
-
只要在这些多播路由器中选择一个作为查询路由器,由查询路由器发送IGMP成员查询报文,而其他的多播路由器仅被动接收响立并更新自己的多播组列表即可。
-
选择查询路由器的方法:每个多播路由器若监听到源IP地址比自己的IP地址小的IGMP成员查询报文,则退出选举。最后,网络中只有IP地址最小的多播路由器成为查询路由器。
退出多播组
IGMPV2
在 IGMPv1
的基础上增加了一个可选项:当主机要退出某个多播组时,可主动发送一个离开组报文,而不必等待多播路由器的查询。这样可使多播路由器能够更快地发现某个组有成员。
-
224.0.0.2
是特殊的IP多播地址,在本网络中的所有多播路由器的网际层都会接受该多播数据报。 -
有成员离开该多播组,暂时不删除该多播组,立即发送针对该多播组的特殊的IGMP成员查询报文,探测该多播组是否还有其他成员。封装该报文的IP多播数据报的目的地址,为该多播组的地址
228.1.1.1
,而不是特殊的多播地址224.0.0.1
.