背景:网络中存在点对多点的业务需求,使用单播和广播进行承载时,都会出现不同的问题
使用单播进行承载时,相同的数据流较多,服务器端压力过大
使用广播进行承载时,收费内得不到安全保障
组播数据报文结构:
D.MAC + S.MAC + S.IP + D.IP + payload
D.MAC:为组播MAC地址,通过计算得出
S.IP:为组播服务器的IP地址,是个单播IP地址
D.IP:为组播组的IP地址,用于标识流量接收者的组
组播IP地址分类:
有类IP地址中,D类为组播使用IP地址范围
224.0.0.0-224.0.0.255 | 给路由协议永久预留组播组地址 |
224.0.1.0-231.255.255.255 233.0.0.0--238.255.255.255 | 任意源临时组播组地址 |
232.0.0.0--232.255.255.255 | 指定源临时组播组地址 |
239.0.0.0--239.255.255.255 | 本地管理任意源临时组播组地址 |
组播MAC地址的计算:
组播MAC地址前24bit固定为01-00-5e,第25bit位固定为0
再将IP地址中后23bit位映射到组播MAC地址后23位上,此时会丢失中间5bit位的映射,导致出现32个组播IP地址映射到同一个组播MAC地址上
但是IANA组织认为冲突性不大,不影响使用
组播网络结构:
源端网络:组播源设备到达第一跳路由中间的网络称之为源端网络
组播转发网络:第一跳路由器到达最后一跳路由之间的网络称之为组播转发网络,需要运行组播路由协议保障组播转发网络中无环,并且为最优路径
成员端网络:由组播数据接收到到达最后一跳路由之间的网络,最后一跳路由器需要运行对应协议判断网络中存在哪些组播接收者
组播的服务模型:
ASM:任意源组播模型
接收者不能指定组播源设备,只能接收对应组播组IP地址的流量
SSM:指定源组播模型
接收者可以指定组播源设备,接收对应组播组流量时,还需要指定对应的组播源发送的数据
组播路由:
为组播数据生成的路由表,路由表中包含组播源地址(单播地址),组播组地址(组播地址),入接口(通过RPF检测得到的接口),出接口(下游存在组播接收者的接口)
入接口:用于接收组播数据,当组播数据不是从入接口进入,则执行丢弃操作
出接口:收到正确组播数据后,出所有的出接口执行转发操作
RPF检测机制:
从对应接口收到组播数据后,读取报文中的源IP地址,查看单播路由表,去往源IP地址的单播路由出接口是否与接收组播数据的入接口一致,如果一致则通过RPF检测,如果不一致则丢弃
RPF路由选举:
1、收到组播数据后,如果路由器上存在去往组播源的单播路由、MBGP路由、静态组播路由
2、在三种路由中分别选出最优的路由
3、在三种最优路由中,选出一条最优路由,将出接口作为RPF接口
选举规则:
1、比较掩码,最长掩码匹配原则(与单播路由类似)
2、掩码都相同时,比较路由优先级,优先级以小为优
3、当优先级也相同时,此时静态组播路由>MBGP路由>单播路由
IGMP:互联网组管理协议
属于TCP/IP协议簇中的网络层协议,协议号为2
作用:用于得到组播网络中的组成员位置信息
组播网络感知组播组成员位置:
1、通过手工静态方式:
将每个组播组成员所在网络的最后一跳路由器实现静态加组,使得路由向上将组播流量进行引流操作,但是当网络中存在较多的组播组成员时,配置工作量较大,并且不易维护
2、通过IGMP动态加组的方式
通过组播组成员与成员端网络中的路由器进行交互IGMP报文,使得路由感知到组播组成员的加组请求,动态的完成加组操作(生成IGMP组表项和IGMP的路由表)
IGMP组表项:
组播成员的IP地址、组播组信息
IGMP路由表项:
出接口信息、出接口IP地址、任意源组播组
通过PIM协议接管IGMP生成的组表项结合组播流量得到PIM路由表项
PIM路由表项:
从IGMP表项中得到:组播组信息
从组播流量中得到:组播源IP地址、上游接口(入接口)
结合PIM路由表和IGMP路由表可以生成组播路由表:
从IGMP路由表中得到:出接口信息
从PIM路由表中得到:入接口信息、组播源IP地址、组播组信息
IGMPv1的报文:
普遍组查询报文:
查询器使用此报文查询哪些组播组还存在组播接收者
成员关系报告报文:
组成员使用此报文进行加组操作
报文格式:普遍组查询报文与成员关系报告报文采用相同报文格式
version:版本,在IGMPv1中,该值为1
type:标识该报文为具体类型
0x11:为普遍组查询报文
0x12:为成员关系报告报文
unused:未使用字段,进行保留
checksum:校验和,在进行校验和计算时,该值为0,需要发送数据时将校验和进行填充
Group address:组地址
1、在普遍组查询报文中,该字段固定为0.0.0.0
2、在成员关系报告报文中,该字段为成员需要加组的组播组地址
查询器:
当成员所在二层网络中存在多个路由器可以发送普遍组查询报文时,会选举出一个成员端的查询器,在IGMPv1版本中,需要通过PIM协议进行选举,IGMP没有选举查询器的能力
查询器的作用:
1、朝网络中周期发送普遍组查询报文,当非查询器收到普遍组查询报文时,将会抑制发送普遍组查询报文,减少网络中的普遍组查询报文
2、朝二层网络中发送组播数据,抑制非查询器发送组播数据
3、当二层网络中,非查询器在周期时间内未收到查询器发送的普遍组查询报文,则会认为查询器故障,发送自己的普遍组查询报文,同时由自己发送组播数据
IGMPv1组成员加组机制:
当查询发送普遍组查询报文后,二层网络中的所有组成员都能够接收到普遍组查询报文,同时为自己启动一个随机计时器,取值为0--10s,当设备的计时器结束后,将直接回应成员关系报告报文,用于感知查询器对应组中还存在接收者,由于IGMP报文采用组播形式发送,会导致同组的其他设备都收到成员关系报告报文,如果收到同组的其他设备的成员关系报告报文,则将自身的计时器取消,不在回应成员关系报告报文(此机制也称之为同组抑制机制)
IGMPv1:离组机制(静默离开)
查询器会周期发送普遍组查询报文,用于查询所在网络中的组播组成员,当某个组播组中不存在成员时,查询器将不会得到该组播组的成员关系报告报文的回应,查询器在默认两次未收到成员的回应,则会将对应组播的表项进行删除,
离组时间 = 查询器发送普遍组查询报文的周期时间(默认为60) * 健壮系数(默认为2)+ 最大响应时间(默认为10s),所以v1的离组时间默认最大为130s
IGMPv2:
大部分机制沿用v1的功能,针对v1的缺点做了改良
IGMPv2的报文格式:
version:IGMP的版本号,IGMP的值为2
type:标识具体的报文类型
0x11:查询报文,包含普遍和特定
0x12:v1的成员关系报告报文
0x16:v2的成员关系报告报文
0x17:离组报文
Max response time:最大响应时间,为报文发出后,成员需要在最大响应时间内做出回应
checksum:校验和,与v1的一致
Group address:组播组地址
1、在普遍组查询报文中,为0.0.0.0,用于查询所有的组播组成员
2、在特定组查询报文中,为需要查询的组播组地址
3、在成员关系报告报文中,为成员需要加组的或者所在组播组的地址
4、在离组报文中,为成员需要离开组播组的地址
IGMPv2的离组机制:使用离组报文 + 特定组查询报文
1、当查询器收到组成员的离组报文后,报文中携带需要离组的组播组地址
2、查询器通过发送特定组查询报文,将group address地址设置为成员离组的组播组地址,用于判断成员离组后,该组播组中是否存在其他组播成员
3、如果查询器收到成员关系报告报文的回应,则认为还由其他组员存在,继续将组播数据朝下游发送
4、如果在最大响应时间结束后,查询器未收到成员关系报告报文,则认为该组播组成员全部离组,将不在朝下游发送组播数据,并且将该接口从组播表项中删除
IGMPv2的查询器选举:
V2具有独立选举查询的能力
1、在同一个二层网络中存在多台组播路由器时,初始情况下,都认为自己是查询器角色,发送自己的普遍组查询报文,源IP地址为自身接口IP地址,目的IP地址为224.0.0.1所有三层设备监听
2、所有的路由都会收到其他路由发送的普遍组查询报文,通过比较报文中的源地址选举出查询器
IP地址以小为优,选举成为查询器角色的路由将履行查询角色的功能
IGMPv2版本兼容IGMPv1版本:
当IGMPv2的查询器收到网络中成员发送的IGMPv1版本的成员关系报告报文,则会将自己设置为v1版本,后续将发送v1版本的普遍组查询报文,用于兼容v1版本的客户端,如果查询器收到网络中v2版本的离组报文,将不会进行回应
IGMPv3:
大部分机制沿用v2版本机制,针对v1和v2版本无法适应SSM模型而进行的改进
V3版本不存在同组抑制机制,当查询器发送普遍组查询报文后,所有的成员设备在收到后启动随机计时器,计时器结束后,自行回应成员关系报告报文,无论是否收到同组成员的成员关系报告报文
IGMPv3的查询报文:
1、普遍组查询报文:对二层网络中的所有组成员进行查询
2、特定组查询报文:针对特定组播组的成员进行查询
3、特定源组查询报文:针对接收特定组播源发送的特定组播组的成员进行查询,为适应SSM使用
查询报文格式:
version:版本,IGMPv3为3
type:具体的报文类型,0x11
Max resp code:发送查询报文后的最大响应时间,默认为10s
Checksum:校验和
Group address:组播组地址
1、在普遍组查询报文中,为0.0.0.0,用于查询所有的组播组成员
2、在特定组查询报文中,为需要查询的组播组地址
3、在特定源组查询报文中,为需要查询的组播组地址
Number of source:组播源地址的数量
Source address:组播源地址
成员关系报告报文:
type:为0x22,成员关系报告报文
checksum:校验和
Number of group records:携带组播组地址的数量
Group records:具体的组播组接收信息
Records type:表示报文具体的类型
include:表示需要接收该组播源发送的组播数据
exclude:表示需要过滤该组播源发送的组播数据
Change_to_include:表示需要从exclude模型转变为include模式
Change_to_exclude:表示需要从include模式转变为exclude模式
Allow_new_sources:不管处于何种模型,都需要接收该组播源发送的数据
如果原来模式为include,则向include中添加携带的组播源信息
如果原来的模式为exclude,则将exclude中对应的组播源信息删除
Block_old_source:不管处于何种模型,都需要将该组播源发送的数据过滤
如果原来模式为include,则将include中对应的组播源信息删除
如果原来模式为exclude,则将对应的组播源信息放入到exclude中
Number of source:该报文为该组播组地址携带了多个组播源的地址
Multicast address:组播组地址
Source address:组播源地址,可以存在多个
IGMPv3离组机制:V3中由于没有定义专门的离组报文,故需要借助成员关系报告报文和特定源组查询报文实现离组机制
1、当成员需要退出组播组时,发送改变源组对应关系的成员关系报告报文
2、当查询器接收到成员不需要接收组播组数据后,会发送特定源组查询报文,会携带组播组地址及组播源地址,用于查询是否还存在对应源组的接收者
3、如果查询没有收到成员关系报告报文的回应,则认为不存在成员,将对应组播表项删除
4、如果查询器收到成员关系报告报文,则认为还存在对应的组播接收者,继续朝该网络中发送组播数据
IGMP各版本之间的差异:
区别 | IGMPv1 | IGMPv2 | IGMPv3 |
查询器的选举 | 借助PIM协议进行选举 | 自行选举 | 自行选举 |
离组机制 | 静默离开 | 通过离组报文 | 通过成员关系报告报文 |
特定源组查询报文 | 不支持 | 不支持 | 支持 |
特定组查询报文 | 不支持 | 支持 | 支持 |
兼容版本 | 支持兼容v1版本 | 支持兼容v1和v2版本 | |
同组抑制机制 | 存在 | 存在 | 不存在 |
指定源加组(支持SSM模型) | 不支持 | 不支持 | 支持 |
查询器故障切换机制 | 由于查询器与非查询器之间运行的协议为PIM协议,建立的PIM邻居关系,当查询器故障后,非查询器能够感知到查询器的故障进行切换 | 缺省状态下,v2版本的查询器切换时间为125s 切换时间 = 周期周期(默认60)* 健壮系数(默认为2) + 1/2的最大响应时间 | 缺省状态下,v2版本的查询器切换时间为125s 切换时间 = 周期周期(默认60)* 健壮系数(默认为2) + 1/2的最大响应时间 |
IGMP snooping:
背景:由于交换机接收到组播数据后,会执行泛洪操作,导致所有的成员都会收到所有的组播数据
原理:通过在交换机上构建二层组播转发表项,使得特定的组播数据,从对应的接口进行转发,不在执行泛洪操作
二层组播转发表项 形成过程:
1、在交换机上开启IGMP snooping功能,使得交换机监听转发的组播协议报文,如果从一个接口收到普遍组查询报文,则将该接口列为路由器接口或者上游接口,如果在一个接口上收到成员关系报告报文,则将该接口列为下游接口或者成员接口
2、后续收到组播数据后,通过二层转发表项指导组播数据进行转发操作
二层表项中的接口角色:
1、路由器接口(上游接口):交换机通过路由器接口接收组播数据等
路由器接口的形成:
1、通过静态手工配置得到:不推荐使用
2、通过监听其他协议报文得到,例如IGMP的普遍组查询报文、PIM的hello报文等
2、成员接口:通过监听成员关系报告报文得到
监听成员关系报告报文时,会查询加入的组播组地址,与接口形成映射
二层转发表项的维护:
当交换机从某个成员接口收到离组报文后,会将离组报文朝上游接口进行转发,路由器收到后,会朝交换机发送特定组查询报文,用于查询特定组下的成员,交换机将该特定组查询报文进行泛洪操作,成员收到后,回应成员关系报告报文,交换机未从成员接口收到成员关系报告报文,会将对应的表项中删除对应映射关系
IGMP SSM mapping:
背景:网络中如果存在IGMPv1和IGMPv2的客户端,此时客户端无法指定组播源地址,但是由于SSM的需求
原理:通过在查询器上将组播组和组播源地址进行静态绑定,生成静态的mapping表项(S,G),使得在成员发送成员关系报告报文后,当组播流量被推送至查询器后,只能由mapping表项中的组播源地址将下游接口列入到组播路由表中。
配置命令:
[Huawei-igmp]ssm-mapping 230.1.1.1 255.255.255.255 192.168.1.1
IGMP proxy:IGMP代理
背景:由于同一二层网络中成员较多,所有的成员发送的报文都需要通过查询器进行处理,此时会导致查询器负载较大
原理:通过在查询器和成员之间部署代理设备(通常使用三层交换机进行部署),所有的成员报文都通过代理设备处理
代理设备的接口角色:
1、主机接口:面向查询器的接口,用于接收查询器发送的报文及组播流量(对于查询器来讲为成员端)
2、路由器接口:面向用户的接口,用于接收成员发送 的成员关系报告报文和离组报文(对于用户来讲为路由器端)
IGMP环境下的加组:
1、组播组成员发送成员关系报告报文,用于请求接收某组播组的数据
2、IGMP代理设备收到成员关系报告报文后,查看自身是否存在对应组播组的转发表项
1、如果存在,则说明查询连接代理设备的接口已经为下游接口,不将成员关系报告报文发送给查询器设备
2、如果不存在,则说明查询器连接代理设备的接口下没有接收者,需要将成员关系报告报文发送给查询器,使得查询将接口列为下游接口,引流组播流量
IGMP环境下的离组:
1、组播组成员发送离组报文或者成员关系报告报文用于离组
2、代理设备收到后,将发送特定组查询报文或者特定源组查询报文,查询对应组播组下是否还存在接收者
1、如果有成员回应,则下游还存在组播接收者,不将离组报文或成员关系报告报文发送给查询器
2、如果没有成员回应,则代理设备会将离组报文或成员关系报告报文发送给查询器。查询收到后,发送特定组查询报文或者特定源组查询报文,用于查询是否存在组播接收者
1、存在则保留此下游接口
2、不存在则将此接口从组播表项中进行删除操作