组播之IGMP(2)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了组播之IGMP(2)相关的知识,希望对你有一定的参考价值。
参考技术A IGMP(Internet Group Management Protocol)互联网组管理协议负责组播组成员注册管理的协议,用来在接收者主机和与其直接相邻的组播路由器之间建立和维护组播组成员关系;主机通过IGMP直接通知本地组播路由器想要接收特定组的组播流量或不再接收特定组的组播流量;
组播路由器根据已知的组播组成员存在与否决定是否转发组播流量;
IGMP有三个版本:IGMPv1、IGMPv2和IGMPv3,基本区别如下:
IGMPv1定义了基本的组成员查询和报告机制;
IGMPv2添加了查询器选举和组成员离开机制;
IGMPv3可以指定接收或不接收指定组播源的流量;
一、IGMPv1
IGMPv1只有普遍组查询和成员报告两种报文;
主机通过成员报告报文,通知本地组播路由器希望加入哪个组播组;
路由器通过普遍组查询报文,周期性查询网段上是否仍有已知组成员存在;
1、version:IGMP版本,值为1;
2、Type:报文类型只有两种取值:
(1)0x1表示普遍组查询报文;
(2)0x2表示成员报告报文;
3、Checksum:IGMP报文的校验和;
4、Group Address:组播组地址;
(1)在普遍组查询报文中,该字段为0;
(2)在成员报告报文中,该字段为成员加入的组播组地址;
普遍组查询报文General-Query
普通组查询报文是组播路由器周期性(60s)向网段上所有主机及路由器(224.0.0.1)以组播形式发送的查询报文,查询报报文中组地址字段为0.0.0.0,代表查询的是任意组,本地网段上的所有路由器和主机都能识别和接收,任何组播组的成员都回应成员报告报文;
收到该报文的主机回应成员报告报文,告知路由器自己所属的组播组;
如果网段上同时有多台组播路由器R1和R2(都启用了PIM和IGMPv1),因为IGMPv1没有定义查询器,查询功能由PIM的DR负责,每60s发送普遍组查询报文;R1和R2在建立PIM邻居时,先比较DR优先级,若优先级一样,则IP地址大的路由器为PIM DR;
成员报告报文Report
组地址字段是D类非224.0.0.X地址,发送成员报告报文的两种情况:
(1)主机在加入组时会立即发送成员报告,告知路由器自己想要接收的组播数据;
(2)收到普遍组查询报文后,被动响应请求;
成员报告抑制机制
网段上存在同一组播组的多个接收主机,主机接收到普遍组查询报文后,启动定时器,定时器取值0-10s范围内的一个随机值;
定时器最先超时的主机发送针对该组的成员报告报文;
其他主机收到后,成员报告报文会被抑制,可以减少网段上的流量。
当主机主动离开组播组的时候,如用户关掉正在观看的发给组229.1.2.3的视频或者当主机突然离线时,主机不会产生任何离开组通知,组播路由器依然会转发组播数据到该网段;
IGMPv1只有加组的成员报告报文和查询报文,没有定义组成员的离开机制,只能依靠周期性发送普遍组查询报文,如果3个查询周期中没有收到成员报告报文,则认为成员不存在;
组成员关系超时时间默认130s,IGMP查询器在130s内没有收到任何指定组的成员报告报文,组播路由器删除接口上指定组的对应关系,组播数据不再转发到该接口;
组成员关系超时时间计算方法,IGMP普遍组查询报文间隔x健壮系数+最大查询响应时间;
igmp robust-count命令用来在接口上设置IGMP查询器的健壮系数,默认值为2;
igmp timer query接口命令或timer query全局命令用来在查询器路由器上设置普遍组查询报文发送间隔,默认值为60s,接口命令比全局命令优先;
IGMPv1没有查询器选举和组成员离开机制,在IGMPv2中实现;
二、IGMPv2
IGMPv2在IGMPv1基础上添加了查询器选举和组成员离开机制,除此以外其他机制和IGMPv1基本相似,IGMPv2变化如下:
1、查询器选举 不依赖组播路由协议选举查询路由器;
2、离开消息 主机告知路由器离开组播组
3、特定组查询 只查询指定组,而非查询网段上所有组
4、最大响应时间字段
IGMPv2除了查询报文(增加特定组查询)、成员报告报文,还增加了成员离开报文;
(1)Type字段
IGMPv2将IGMPv1的version和type字段合并成Type字段,不再定义version字段,Type报文类型字段有以下四种取值:
0x11表示查询报文,包括普遍组查询报文和特定组查询报;
0x12表示IGMPv1成员报告报文;
0x16表示IGMPv2成员报告报文;
0x17表示成员离开报文;
(2)Max Response Time字段
在普遍组查询报文中,该字段默认值为10s;
在特定组查询报文中,该字段默认值为1s;
(3)Checksum字段 IGMP报文的校验和;
(4)Group Address字段
普遍组查询报文中,该字段设为全0;
特定组查询报文中,该字段为要查询的组播组地址;
在成员报告和离开报文中,该字段为想要加入或离开的组播组地址;
查询报文
普遍组查询和特定组查询的组地址字段、最大响应时间字段和报文头目的地址不同;
1、普遍组查询报文
普遍组查询报文是查询器周期性向共享网段所有主机及路由器以组播方式发送的查询报文,用于查询哪些组播组存在成员;
组地址字段为0.0.0.0,报文头目的地址为224.0.0.1;
查询器每60s发送查询报文,初次成为查询器时,前2次报文间隔15s,其他间隔60s;
2、特定组查询报文
特定组查询报文是查询器向网段上特定组播组成员发送的报文,用于查询该组播组是否存在成员;
组地址字段和报文头目的地址字段都是想要查询的组播组IP地址;
仅当查询器收到离组报文后,才发送特定组查询报文;
报告报文
成员报告报文是主机向组播路由器发送的报告报文,用于加入某个组播组或者应答查询的响应报文;
组地址字段和报文目的地址字段都是主机想要加入的组播组地址;
离开报文
离开报文是主机主动离开组播组时向组播路由器(224.0.0.2)发送的报文,用于宣告自己离开了某个组播组;
组地址字段要离开的组播组地址,报文目的地址为224.0.0.2;
查询器选举
接口IP地址最小的IGMPv2路由器将被选举为查询器;
如果非查询器在其他IGMP查询者的存活时间内,收不到查询者发送的查询报文,就认为当前查询器R1已失效,从而重新发起查询者选举,并认定自己是查询者;
igmp timer other-querier-present接口命令或timer other-querier-present全局命令用来设置其他IGMP查询器的存活时间,缺省情况下,其他ICMP查询者的存活时间=健壮系数xIGMP普遍查询报文发送间隔+(1/2)x最大查询响应时间,即125s;
igmp max-response-time命令在IGMPv2中用来调整最大响应时间,最大值25s;
离开机制
相比于IGMPv1,IGMPv2增加了一种离开组报告,允许主机告诉路由器它要离开组播组,这样当最后一个成员离开组时,离网延迟减少,路由器可以立即停止转发组播报文到该网段;
但是由于路由器一般不记录当前网段有多少相应组的组员,所以每收到一份离组报告,都会触发查询器发送特定组查询报文,确认是否还有其他成员;
如果该网段上还存在该组成员,主机收到特定组查询报文后,会在报文指定的最大响应时间内发送成员报告报文,组播路由器收到后,将继续维护该组成员关系;
如果该网段上不存在该组成员,查询器将不会在Timer-Membership超时前,收到改组的成员报告报文,在Timer-Membership超时后,查询器将删除接口和该组的对应关系;
Timer-Membership时长=特定组查询报文发送间隔x报文发送次数;
使用igmp lastmember-queryinterval接口命令或lastmember-query interval全局命令配置发送IGMP特定组查询报文的时间间隔,取值1-5,缺省1s;
使用igmp robust-count接口命令或robust-count全局命令配置查询器在收到离组报文后,特定组查询报文发送次数;
IGMPv2中,组播组最后一个主机正常离开时,组播路由器在2s后,停止转发组播流量;
但最后一个主机异常离线,则组播路由器在没有收到离组报文的情况下,仍需要使用130s来判定有没有必要再转发流量到当前网段;
三、IGMPv3
IGMPv3添加了对源过滤功能的支持,主机可以通告路由器仅接收来自特定源的组播流量;
IGMPv1及v2报告报文中仅通告加入的组播组,IGMPv3为实现组播源过滤功能,对成员报告报文做了修改,IGMPv3添加了一种能够表达组和源的组记录,通过三元组(组地址、过滤模式、源地址列表)来表达仅接收来自特定源的组播流量;
IGMPv1、v2的接口的数据结构也相当简单,IGMPv3开始,接口开始使用(组、过滤模式和组播源)这种表达,每个接口维护组播组、组播源和过滤模式;
IGMPv3仅有两种报文类型:
(1)类型为0x11的查询报文;
(2)类型为0x22的成员报告报文:
但出于兼容,支持并识别其他三种以前版本的报文:
(1)类型为0x12的IGMPv1成员报告报文;
(2)类型为0x16的IGMPv2成员报告报文;
(3)类型为0x17的IGMPv2离开组报文;
查询报文
(1)Type
0x11代表查询报文;
(2)Max Resp Code 最大响应时间
成员主机在收到普遍组查询报文后,需要在最大响应时间内做出回应;
(3)Checksum
ICMP报文的校验和;
(4)Group Address
在普遍组查询报文中,该字段设为0;
在特定组查询报文和特定源组查询报文中,该字段为要查询的组播组地址;
(5)Resv 保留字段
(6)S(suppress router-side processing)
该比特置1时,收到此查询报文的其他路由器不启动定时器刷新过程,但是此查询报文并不一抑制查询器选举过程和路由器的主机侧处理过程,默认未置位;
(7)QRV(Querier’s Robustness Variable)
查询器普遍查询的健壮系数,若该字段非0,非查询器收到后调整为该值,缺省2;
(8)QQIC(Querier’s Robustness Variable)
查询器普遍查询的查询间隔,若该字段非0,非查询器收到后调整为该值,缺省60s;
(9)Number of Sources
组播源数量,对于普遍组查询报文和特定组查询报文,该字段为0;对于特定源组查询报文,该字段非0;
(10)Source Address 组播源地址,数量受Number of Sources字段限制;
IGMPv3查询报文分为三种
(1)普遍组查询报文 General Query
普遍组查询报文是查询器周期性向共享网段内所有主机及路由器(224.0.0.1)以组播方式发送饿查询报文,用于发现组播组成员并维护组播组与源列表的对应关系;
组地址字段和Number of Sources字段都为0,报文目的地址为224.0.0.1;
(2)特定组查询报文 Group-Specific Query
特定组查询报文是查询者向网段上特定组播组成员发送的报文,用于查询该组播组是否存在成员;
组播组字段和报文目的地址都是想要查询的组播组IP地址,Number 0f Sources字段为0;
(3)特定组及源查询报文 Group-and-Source-Specific Query
特定组查询报文是查询器向网段上特定组播组成员发送的报文,用于查询该组成员是否接收特定源发送的数据;
组播组字段和报文目的地址都是想要查询的组播组IP地址,Number of Sources字段非0,Source Address字段为该组播组的源列表;
成员报告报文
IGMPv1及v2报告报文中仅通告加入的组播组,IGMPv3为实现组播源过滤功能,对成员报告报文做了修改,IGMPv3添加了一种能够表达组和源的组记录,通过三元组(组地址、过滤模式、源地址列表)来表达仅接收来自特定源的组播流量;
IGMPv1/v2一份报告报文只能携带一个组播组,IGMPv3一份成员报告可携带多个组记录,可同时通告多个组及源的对应;
(1)Type 0x22代表IGMPv3的成员报告报文;
(2)Checksum IGMP报文的校验和;
(3)Number of Group Records 组记录数量;
(4)Group Record
每个组记录是一块字域,通过三元组(组地址、过滤模式、源地址列表)来表达仅接收来自特定源的组播流量;
组记录字域格式如下:
(1)Record Type 有两种记录类型,当前状态记录和状态变化记录;
当前状态记录包括MODE_IS_INCLUDE、MODE_IS_EXCLUDE;
状态变化记录包括过滤模式变化记录、源列表变化记录;
过滤模式变化记录又包括CHANGE_TO_INCLUDE_MODE、CHANGE_TO_EXCLUDE_MODE;
源列表变化记录又包括ALLOW_NEW_SOURCE、BLOCK_OLD_SOURCES;
(2)Aux Data Len 目前未使用该字段;
(3)Number of Sources 组播源数量
(4)Multicast Address 组播组地址
(5)Source Address 组播源地址
(6)Auxiliary Data 目前没有使用该字段;
六种记录类型如下:
(1)MODE_IS_INCLUDE
(2)MODE_IS_EXCLUDE
(3)CHANGE_TO_INCLUDE_MODE
表示过滤模式由EXCLUDE转换到INCLUDE,开始接收源地址列表包含的新组播源发往该组播组的数据;如果源地址列表为空,主机将离开组播组;
(4)CHANGE_TO_EXCLUDE_MODE
表示过滤模式由INCLUDE转换到EXCLUDE,不接收源地址列表包含的新组播源发往该组播组的数据;
(5)ALLOW_NEW_SOURCE
表示在现有基础上,需要再接收源地址列表包含的组播源发往该组播组的组播数据;
(6)BLOCK_OLD_SOURCES
表示在现有基础上,不再接收源地址列表包含的组播源发往该组播组的组播数据;
查询响应机制
IGMPv3中查询响应机制及查询者的选举机制与IGMPv1/v2相同;
加入机制
在IGMPv1/v2中,用户加入到某组播组G后,能够接收到所有组播源发往该组播组的数据;
如果采用IGMPv3,用户可以选择仅接收特定组播源发送到给组播组的数据;
组播路由器会在每个接口维护组播组、组播源和过滤模式;
如果多个接收者都发送加入报告,Report(G,IS_INCLUDE,(S1))和Report(G,IS_INCLUDE,(S2)),则路由器接口维护组对应关系:G,过滤模式INCLUDE,源列表(S1,S2);
如果路由器收到多份加入同一个组的组记录,只要有一个组记录的类型为EXCLUDE模式,路由器接口对应的G组的过滤模式就是EXCLUDE,不论收到多少INCLUDE模式组记录;
离开机制
在IGMPv2中添加的离开组报文在IGMPv3中不再使用,IGMPv3主机会发送带有特定含义组记录的成员报告来表达离开组播组或不希望再收到组播组中来自特定源的组播流;
离开组播组
如果不希望收到组播组G的任意流量,主机发送(G,TO_IN,NULL);
当查询器接收到离开某组播组的报告(G,TO_IN,NULL)时,发送指定组查询消息,判断网段中是否还存在该组成员;
如果当前网段上没有其他组成员,修改接口的组和成员对应关系,相应接口被从相应的组播路由表的下游接口移除;
如果当前网络仍有其他主机是该组的成员,则成员会响应等(G,IS_IN,S1)当前状态报告;
不再接收组播组中来自特定源的组播流
当查询器接收到改变组播组与源列表对应关系的报告(G,BLOCK_OLD_SOURCE,SOURCE),发送特定源组查询报文,查询特定组及源的的成员是否存在;
如果该源的组成员存在,将响应成员报告报文;
如果没有接收者响应,则在查询两次后,每次间隔1s,从源列表中移除该源;
什么是IGMP协议?
文章目录
IGMP协议
定义
- 组播组管理协议
功能
- 管理主机加入和离开组播组
- 维护本地组播组信息表
IGMPv1
主机加入
- 路由器向开启了IGMP的端口发送查询报文,询问该接口下有没有组播接收者
- 收到查询报文的主机,如果希望接收某个组的组播,则向路由器回复report报文,把希望加入的组播组地址通告给路由器;如果不希望接收任何组播,则不回复
- 收到report报文后,路由器就会在本地建立组播组信息表,记录该组的(*、G)表项,后续将会转发该组组播
主机离开
- 默默离开
- 当路由器在后续的查询报文中没有收到某个组的Report报文时,路由器将会把该组的(*、G)表项删除,不再转发该组组播
查询器选举
- 一个网段中只能有一个路由器负责处理组播,该路由器就是查询器
- IGMPv1没有查询器选举机制,只能依靠上层组播路由协议选举
成员报告抑制机制
- 主机以组播224.0.0.1的地址发送report报文,该报文也会发送至其他主机
- 收到该report报文的主机会启动计时器(10秒);在该计时器时间内,如果本机也希望加入该组播组,不会重复发送report报文
主机希望加入某个组播组,不用等到路由器发送查询报文,会直接向路由器发送Report报文
IGMPv2
主机加入
- 路由器会周期性向开启了IGMP的接口发送普遍查询报文
- 其他和IGMPv1一致
主机离开
- 主机主动向路由器发送Leave报文,通告希望离开的组播组地址
- 路由器收到leave报文后,会发送指定组查询报文,询问该网段内是否还有主机希望接收该组的组播
- 如网段内还有该组接收者,则该接收者会向路由器回复membership-report报文,通告路由器本机还希望接收该组播;如果不希望接收该组播,则不回复
- 如接收到membership-report报文,则不对组播组信息表做任何操作;如没有接收到任何报文,则删除该组播组信息
查询器选举
- 自动选举
- IP地址小的优先
成员报告抑制机制
- 与IGMPv1一致
IGMPv3
主机上维护的组播信息
- 组地址 、过滤模式 、源列表
- 主机通过发送membership-report报文向路由器通告本机当前组播信息状态、过滤模式变化、源列表变化
路由器维护的组播信息
- 组状态(组地址、组定时器、过滤模式、源列表)
- 源列表(源地址、源定时器)
主机加入
- 路由器发送普遍查询报文
- 收到普遍查询报文的主机,如果希望加入某个组播组,就会发送membership-report报文;报文格式会包含组地址、源过滤模式、源列表
- 路由器收到report报文后,会根据报文的汇总信息,生成相应的组播信息表项
主机离开
-
离开某个组播源
1.主动向路由器发送membership-report报文、报文会包含希望变更的组播组地址、离开的源地址 2.路由器收到该报文后,会发送指定组查询报文,询问是否还有其他主机希望继续接受该组播源在该组播地址发送的组播 3.如果未收到回复,路由器则在组状态中删除该组播源;如果收到,则不做任何操作
-
离开某个组播组
1.主动向路由器发送membership-report报文;报文包含希望离开的组播组和TO_IN(NULL)消息 2.路由器收到该报文,会发送指定组查询报文,询问是否还有其他主机希望继续接收该组播 3.如果未收到回复,路由器则删除该组播组的信息记录;如果收到,则不做任何操作
取消成员报告抑制机制
IGMP Snooping
-
用于在交换机上建立二层组播信息
-
二层交换机在不使能IGMP Snooping的情况下,默认把组播报文当做广播处理
-
工作原理:
1.开启IGMP Snooping后,交换机会把收到普遍查询报文的接口设置为路由器接口 2.交换机只会把从路由器接口收到的组播报文转发至成员端口;从非路由器端口收到的组播报文丢弃 3.交换机从某个端口收到IGMP Report报文后,就自动吧该端口加入到组播转发表的成员端口 4.交换机只会把Report报文从路由器端口转发,所以其他主机不会收到Report报文,不会触发成员报告抑制机制
组播VLAN
- 路由器只在组播VLAN内复制数据,减轻路由器负担,节省网络带宽资源
- 二层交换机在该组播Vlan的所有子Vlan中复制组播报文
相关命令
[h3c]igmp //进入IGMP视图
[h3c]igmp version 'version' //配置IGMP版本
[h3c-GigabitEthernet0/0]igmp enable //接口开启IGMP
组播概述
定义
- 点到多点的通讯模式
组播关注的问题
- 如何标识接收者:组播地址
- 组播数据如何转发:组播分发树
- 组播转发路径如何建立:组播路由
- 终端设备如何加入/离开组播组:IGMP
- 组播组成员信息如何维护:IGMP
解决方案
- 组播地址:标识组播接收者
- 组播分发树:定义组播数据转发方式
- 组播路由协议:建立组播转发路径
- IGMP:定义终端设备加入/离开组播组,维护组播组成员信息
组播地址
地址范围
- 224.X.X.X-239.X.X.X
地址分类
- 本地协议预留地址:224.0.0.0-224.0.1.255
- 用户组播地址:224.0.2.0-238.255.255.255
- 本地管理地址:239.0.0.0-239.255.255.255
- 组播MAC地址:01-00-5E-XX-XX-XX
因为组播IP地址第5-9位不映射到组播MAC地址,所以某些组播IP对应的组播MAC会有重复,通过组播IP来判断是否是本机所需要的组播报文
组播模型
ASM
- 任意信源组播
- 不区分组播源,所有组播源共享同一个组播信息表
SSM
- 指定信源组播
- 区分组播源,每个组播源维护独立的组播信息表
IRF
定义
- 智能弹性架构
- H3C的堆叠技术
- 通过把多台交换机虚拟成一台逻辑设备来提高可靠性和性能
优势
- 大幅简化配置管理
- 提高整体设备性能
- 设备扩展简便
- 大幅提高设备可靠性
- 消除逻辑环路,不需要运行任何防环机制
工作流程
- 建立物理连接
- 通过向所有逻辑堆叠口发送Hello报文来收集堆叠组的拓扑信息
- 选举Master设备:选举失败的设备会自动重启,重启完成后成为Slave设备
- 进入到IRF的维护阶段
Master设备选举规则
- 优先级大的优先,优先级默认为1
- 系统运行时间长的优先
- MAC地址小的优先
IRF堆叠协议热备份
- 堆叠组内的所有交换机会自动同步配置文件,但是成员交换机允许过程中产生缓存表项并不包含在配置文件中
- 热备份机制会自动吧运行过程中的缓存表项进行同步,比如邻居表、协议路由表、ARP表等。
IRF形成的必要条件
- 堆叠口中的物理接口必须使万兆以上的接口
- 一台设备上最多有2个堆叠口
- 一台设备的1号堆叠口必须连接到另一台设备的2号堆叠口
- 一台设备上的2号堆叠口对应的物理口的ID必须大于1号堆叠口对应的物理口的ID
- 所有堆叠的物理设备的操作系统必须一致
配置步骤
- 更改设备编号
- 保存配置,手动重启更改了设备ID的交换机
- 手动Shutdown要加入到堆叠口中的物理口
- 创建虚拟堆叠口,并加入相应的物理口
- 手动开启物理口
- 保存配置
- 激活IRF配置
相关命令
[h3c]irf-port 'member-id/port-id' //创建IRF堆叠口
[h3c-irf-port1/1]port group interface 'port-id' //物理口加入到堆叠口
[h3c]irf member 'member-id' renumber 'new-member-id'//更改IRF设备ID
[h3c]irf-port-configuration active //激活IRF配置
以上是关于组播之IGMP(2)的主要内容,如果未能解决你的问题,请参考以下文章
数通面试私房菜之组播专题第四期: IGMP Snooping