组播——IGMP各版本浅析+IGMP特性
验证理论
IGMP特性
IGMP Snooping
IGMP Proxy
实验拓扑
初始配置
配置接口地址,使能路由器组播功能和接口pim dm
配置电脑IP地址为PC1:10.1.1.10;PC2:10.1.1.20
[AR1]multicast routing-enable
[AR1-GigabitEthernet0/0/0]ip add 10.1.1.1 24
[AR1-GigabitEthernet0/0/0]pim dm
[AR2]multicast routing-enable
[AR2]int g 0/0/0
[AR2-GigabitEthernet0/0/0]ip add 10.1.1.2 24
[AR2-GigabitEthernet0/0/0]pim dm
初始结果
实验步骤
第一步: IGMPv1查询,加组,离组,查询器选举
首先看单边PC1和AR1,关闭AR2和PC2.设置AR1接口下的IGMP版本为版本1(默认是版本2)
[AR1-GigabitEthernet0/0/0]igmp enable
[AR1-GigabitEthernet0/0/0]igmp version 1
[AR1]dis igmp interface GigabitEthernet 0/0/0
Interface information of VPN-Instance: public net
GigabitEthernet0/0/0(10.1.1.1): //接口类型与编号(接口的IP地址)
IGMP is enabled //接口已使能IGMP,通过igmp enable配置
Current IGMP version is 1 //接口配置的IGMP版本,通过igmp version配置
IGMP state: up //IGMP接口状态,up或down
IGMP group policy: none //IGMP组策略的ACL编号,用于限制该接口上可以加入的组。可通过igmp group-policy命令配置。“none”表示该接口上没有应用ACL。
IGMP limit: - //当前接口可以维护IGMP组成员关系的最大个数。可通过igmp limit命令配置。
Value of query interval for IGMP (negotiated): - //非查询器通过协商得到的查询报文的发送时间间隔。该协商值只存在于IGMPv3中。
Value of query interval for IGMP (configured): 60 s //接口上配置的发送IGMP查询报文的时间间隔。可通过igmp timer query命令配置
Value of other querier timeout for IGMP: 0 s //其他IGMP查询器存活时间。可以通过igmp timer other-querier-present进行配置。作为查询器的接口上取值为0。
Value of maximum query response time for IGMP: - //IGMP查询报文中包含的最大响应时间,可通过igmp max-response-time命令配置。
Querier for IGMP: 10.1.1.1 (this router) //IGMP查询器。在IGMPv1中,查询器的选择由组播路由协议决定;在IGMPv2中,共享网段上IP地址最小的组播路由器充当查询器。
1.查询——普遍组查询报文(general Query)
- IGMPv1每隔60s周期发送查询报文
- 目的MAC地址是固定的前25位0100.5e(0)+IP地址后23位(0).00.01,目的IP地址是所有主机都可以收到的224.0.0.1,multicast address为0.0.0.0表示为查询任意源组播
所有主机都默认加入了224.0.0.1;所有路由器都默认加入了224.0.0.2
- IGMP查询报文TTL为1,不能跨路由器转发
- IGMP基于IP,协议号为2
2.加组——成员关系报告报文(Report)
- 只要有用户加入终端就会自动发送report报文,加入之后终端每收到一次query就回复一次report报文
- 目的MAC地址是组播地址0100.5e(0)+目标IP地址239.1.1.2的后23位(1).01.02,三层目的IP地址为要加入的组239.1.1.2,multicast address为要加入的组239.1.1.2
- 成员关系报告报文的TTL也为1,不能跨路由器转发
加组报告抑制机制:同一网络内,交换机收到目的地址是组播地址,根据交换机转发原理进行泛洪,其他终端收到这个报文之后发现这个网络内有终端已经发送了加组报告了,他就没有必要再发送加组报告了,反正只需要最后一跳路由器保持接口和这个组ID的表象嘛。基于回退时间加组(MRT)0-10s
思科默认有加组报告抑制机制,华为没有,所以华为是有多少个终端,不管加入是不是相同组,都发加组报告
启用PC2加入相同组
3.离组
点击离组后不会触发任何报文,等到expires计时器超时后,最后一跳路由器上记录的该IGMP表项即删除
超时时间=健壮系数默认2*通用组查询周期默认60+最大响应时间默认10=130s
4.IGMP查询器选举,开启AR2
IGMPv1的查询器依赖于PIM的DR选举
PIM DR选举原则:接口优先级越大越优先,接口优先级相同(默认优先级都是1),比较使能PIM的接口IP,越大越优先
开启AR2之后再看AR1,由于AR2接口IP大,AR2被选举为查询器
[AR1]display pim interface GigabitEthernet 0/0/0
VPN-Instance: public net
Interface State NbrCnt HelloInt DR-Pri DR-Address
GE0/0/0 up 1 30 1 10.1.1.2
[AR2]display pim interface GigabitEthernet 0/0/0
VPN-Instance: public net
Interface State NbrCnt HelloInt DR-Pri DR-Address
GE0/0/0 up 1 30 1 10.1.1.2 (local)
[AR1]dis igmp interface GigabitEthernet 0/0/0
Interface information of VPN-Instance: public net
GigabitEthernet0/0/0(10.1.1.1):
IGMP is enabled
Current IGMP version is 1
IGMP state: up
IGMP group policy: none
IGMP limit: -
Value of query interval for IGMP (negotiated): -
Value of query interval for IGMP (configured): 60 s
Value of other querier timeout for IGMP: 0 s
Value of maximum query response time for IGMP: -
Querier for IGMP: 10.1.1.2
第二步:IGMPv2查询,加组,离组,查询器选举
1.查询——普遍组查询报文(general Query)
- 其他路由器使用查询超时监控查询者(超时时间120s)2分钟收不到查询信息,另一个路由器会起来
- 组成员响应随机回退时间(最小单位0.1s)避免加组冲突,IGMPv1是1s
- 普遍组查询增加最大响应时间,并可以手动调整,IGMPv1是默认0-10s之间,不能手动调整
- 其他与IGMPv1相同,也是60s发一次,TTL为1
2.加组——成员关系报告报文(Report)
- 普遍组查询增加最大响应时间,并可以手动调整,IGMPv1是默认0-10s之间,不能手动调整
- 其他与IGMPv1相同
3.离组——成员离开报文(Leave)+特定组查询报文(Group-Specific Query)
最后一跳路由器对于成员接口下有多少个成员并不清楚,只要有一个成员在,就需要转发组播
[AR1]dis igmp group
Interface group report information of VPN-Instance: public net
GigabitEthernet0/0/0(10.1.1.1):
Total 1 IGMP Group reported
Group Address Last Reporter Uptime Expires
239.1.1.2 10.1.1.20 00:08:00 00:01:25
不是last reporter离开:不会触发特定组查询报文,目的地址应该是224.0.0.2,使得所有路由器都会监听到离组信息,包括正在转发组播报文的路由器(ENSP bug,目的地址是错误的,正确的应该是224.0.0.2;另外不是last reporter离开他也触发了特定组查询,这个是不应该的)
last reporter离开:触发特定组查询报文(Group-Specific Query),路由器询问一下,这个组还有没有成员
[AR1]dis igmp int g 0/0/0 verbose
Interface information of VPN-Instance: public net
GigabitEthernet0/0/0(10.1.1.1):
IGMP is enabled
Current IGMP version is 2
IGMP state: up
IGMP group policy: none
IGMP limit: -
Value of query interval for IGMP (negotiated): -
Value of query interval for IGMP (configured): 60 s
Value of other querier timeout for IGMP: 0 s
Value of maximum query response time for IGMP: 10 s
Value of last member query time: 2 s //默认特定组查询时间2s,1s发送一个特定组查询报文。特定组查询时间=发送周期*健壮系数(发送特定组查询次数次数,默认为2),健壮系数可通过igmp robust-count修改
Value of last member query interval: 1 s
Value of startup query interval: 15 s
Value of startup query count: 2
General query timer expiry (hours:minutes:seconds): 00:00:04
Querier for IGMP: 10.1.1.1 (this router)
IGMP activity: 7 joins, 3 leaves
Robustness (negotiated): -
Robustness (configured): 2
Require-router-alert: disabled
Send-router-alert: enabled
Ip-source-policy: disabled
Query Ip-source-policy: disabled
Prompt-leave: enabled
SSM-Mapping: disabled
Startup-query-timer-expiry: off
Other-querier-present-timer-expiry: off
- 成员离组报文和特定组查询报文的TTL都是1,无法通过三层转发
- last reporter离组会触发两个特定组查询报文。极端情况下,如果说路由器下面只连接了一个终端,这个终端离组没有必要触发特定组查询报文,可以手动设置收到Leave直接离组
[AR1-GigabitEthernet0/0/0]igmp prompt-leave
[AR1]dis igmp group
[AR1] - 引入特定组查询和离组报文可以加速IGMP收敛
4.查询器选举
IGMPv2增加了查询器选举机制,接口IP地址越小越优先,此时查询器选举与pim无关
[AR2-GigabitEthernet0/0/0]pim hello-option dr-priority 10 //设置AR2的0/0/0口的Pim优先级增大到10
[AR2]dis igmp interface GigabitEthernet 0/0/0
Interface information of VPN-Instance: public net
GigabitEthernet0/0/0(10.1.1.2):
IGMP is enabled
Current IGMP version is 2
IGMP state: up
IGMP group policy: none
IGMP limit: -
Value of query interval for IGMP (negotiated): -
Value of query interval for IGMP (configured): 60 s
Value of other querier timeout for IGMP: 76 s
Value of maximum query response time for IGMP: 10 s
Querier for IGMP: 10.1.1.1
Total 1 IGMP Group reported
第三步:IGMPv3查询,加组,离组,查询器选举
1.查询——普遍组查询报文(general Query)
- 通用组查询60s/180s
- 特定组查询,查询者发送2次特定组查询
- 增加了组播源组查询
- 增加了组播源数量选项,其他与IGMPv2相同
2.加组——成员关系报告报文(Report)
- num group records是加入了多少个组
- 因为V3考虑到了组播源,接口下不同终端的组播源可能不同,无需成员关系报告报文抑制机制
- V3加组要提供组播源信息
- 组播组数表示要加入多少个组,设置组数为2增量为3表示加入2个组分别是239.1.1.1,239.1.1.3
- 组播源地址数表示要加入多少个组播源,增量含义与上面类似
- 通告组播源主要有两种模式(限制的是加入这个组播组IP但是是否接收某个组播源IP)
- INCLUDE:希望接收来自特定组播源的组播流量
- EXCLUDE:希望过滤来自特定组播源的组播流量。ex标识为离组信息,若ex=null,标识加入任意组;block也可以离组
3.离组——普遍组查询报文(general Query)
- 离组发的也是发加组报文。IGMPv3没有专门的成员离开报文,成员离开通过特定类型的报告报文来传达。性质和加组报告相同,离组时发送,另外只要有query就发送
- IGMPv3新增特定源组查询报文(Group-and-Source-Specific Query),用于查询该组成员是否愿意接收特定源发送的数据。特定组查询通过在报文中携带一个或多个组播源地址来达到这一目的
4.查询器选举
查询器选举机制一致,IP地址小的为查询器
[AR1]dis igmp int g 0/0/0
Interface information of VPN-Instance: public net
GigabitEthernet0/0/0(10.1.1.1):
IGMP is enabled
Current IGMP version is 3
IGMP state: up
IGMP group policy: none
IGMP limit: -
Value of query interval for IGMP (negotiated): 60 s
Value of query interval for IGMP (configured): 60 s
Value of other querier timeout for IGMP: 0 s
Value of maximum query response time for IGMP: 10 s
Querier for IGMP: 10.1.1.1 (this router)
Total 1 IGMP Group reported
第四步:IGMP特性
1.IGMP Snooping
如果最后一跳路由器下面接了交换机,根据交换机转发机制,如果收到组播流量是泛洪处理的。为了避免这一情况,配置IGMP Snooping,建立二层组播转发表象,使得交换机上仅路由器端口和成员端口可以转发组播报文
二层组播转发表象中存在两类接口:
路由器端口:二层组播设备上朝向三层组播设备(DR或IGMP查询器)一侧的接口,二层组播设备从此接口接收组播数据报文
成员端口:又称组播组成员端口,表示二层组播设备上朝向组播组成员一侧的端口,二层组播设备往此接口发送组播数据报文
增加一个PC3,不开启组播,未配置IGMP Snooping之前,可以接收到组播流量
配置IGMP Snooping
[LSW1]multicast routing-enable
[LSW1]igmp-snooping enable
[LSW1]vlan 1
[LSW1-vlan1]igmp-snooping version 2
[LSW1-vlan1]igmp-snooping enable
此时根据监听PIM的hello,IGMP查询包找到了路由器端口为1,2;根据监听加组,离组报文,找到了成员端口为3,4
此表象监听报文,动态维护,比如将PC2离组,再查看成员端口,就没有0/0/4了
此时再到PC3连接着的交换机接口上进行抓包,不管PC1,2怎么加组离组,他都不会有数据包了
2.IGMP Proxy
IGMP Snooping开启后会自动关闭加组报告抑制(因为只有发了加组报告的终端对应在交换机上的接口才能转发组播包),此时成员如果太多,最后一跳路由器压力比较大。为了降低路由器压力,建议配置IGMP Proxy
为了实现以上功能,IGMP Proxy定义了两类接口:
主机接口:IGMP Proxy设备上配置IGMP Proxy功能的接口,该接口一般面向IGMP查询器
路由器接口:IGMP Proxy设备上配置IGMP功能的接口,该接口一般面向组成员
IGMP Proxy减少成员关系报告报文的工作机制如下:
路由器接口作为IGMP接口,对下呈现为IGMP查询器,发送查询报文,处理成员关系报告报文,形成IGMP表项,并将成员关系报告从主机接口发送给上游的IGMP查询器
当新用户加入同一个组播组时,IGMP Proxy设备不会再向IGMP查询器反馈成员关系报告报文,因此减少了成员关系报告报文数量
当组成员离开时,IGMP Proxy通过IGMP离组机制确定是否有特定组播组的组成员,当确定已经没有组成员后才发送离开报文给上游IGMP查询器