组播

组播地址结构

组播IP地址

一个组播组就是一个IP地址,不表示具体的主机,而是表示一系列系统的集合,主机加入某个组播组
即声明自己接收目的为某个IP地址的报文
IP组播组地址224.0.0.0–239.255.255.255,D类地址空间,第一个字节的高四位为“1110

组播IP模型分类

  1. ASM:任意源组播
    任意发送者都可以成为组播源,向某组播组地址发送信息。接收者无法预知组播源的地址,接收者可以在任意时间加入或者离开该主机组。
  2. SFM:过滤源组播
    从发送者角度来看,组播组成员关系完全相同。SFM在功能上对ASM进行了扩展,接收者只能接收来自部分组播源的数据。从接收者角度来看,只有部分组播源是有效的,组播源经过了筛选。
  3. SSM:指定源组播
    针对特定源和组的绑定数据流提供服务,接收者主机在加入组播组时,可以指定只接收哪些源的数据,加入组播组以后,主机只会收到指定源发送到该组的数据。对组地址不再要求全网唯一,只需要每个组播源保持唯一。这里的“唯一”指的是同一个源上不同的组播应用必须使用不同的SSM地址来区分,但不同的源之间可以使用相同的组地址。

组播IP地址分类

  1. 永久组地址
    1. 所有开启组播的设备(224.0.0.1)
    2. 所有开启组播的路由器(224.0.0.2)
    3. OSPF(224.0.0.5)
    4. OSPF的DR(224.0.0.6)
    5. RIPv2(224.0.0.9)
    6. EIGRP(224.0.0.10)
    7. dhcp(224.0.0.12)
    8. PIM(224.0.0.13)
    9. VRRP(224.0.0.18)
    10. IGMPv3(224.0.0.22)
  2. 临时组地址
    为用户组播组临时分配的IP地址,组成员的数量一旦为零,即取消。
    常见的永久组地址列表
    组播IP地址分类
    专用地址(224.0.0.0-224.0.0.255)用于网络协议组的广播
    公用地址(224.0.1.0-238.255.255.255)用于全球网络组播
    私用地址(239.0.0.0-239.255.255.255)用于本地测试、局域网使用
    ASM地址(224.0.1.0-231.255.255.255、233.0.0.0.0-238.255.255.255.255)
    SSM地址(232.0.0.0.0-232.255.255.255.255)
    全网用在IPv6协议中,第一个字节必须是0xFF。

组播MAC地址

组播MAC地址
组播MAC地址的高24bit为0x01005e,第25bit固定为0,低23bit为组播IP地址的低23bit,就以太网而言,IP组播帧为以01-00-5E-xx-xx-xx

IP地址到MAC地址的映射

为什么需要组播IP到组播MAC的映射?单播可以通过ARP获得MAC,但是组播无法根据组播IP得到组播MAC,只能通过人为的方式规定一个地址
MAC地址的低23bit为组播IP地址的低23b,丢失组播ip地址的前9bit,因为所有的组播IP均为D类,即前4bit为1110,实际丢失的是5bit信息
IP地址到MAC地址的映射

映射导致的问题

存在当第3层IP地址映射成第2层MAC地址时导致32:1的地址不明确问题(原因:第25bit固定为0,IP地址32bit,只映射后23bit),如下图:
映射导致的问题
因此在规划组播网络的时候,为防止出现相同的组播MAC,需要组播IP的后23bit不相同

组播分发树

用来描述IP组播报文在网络中经过的路径。

1. 源路径树SPT

PIM-DM和PIM-SM中都用
组播源作为树根,将组播源到每一个接收者的最短路径结合起来构成的转发树。
每一个组播源与接收者之间建立一棵独立的SPT
这个机制的作用是实现组播流量的最优转发路径
源路径树
特点:路径最优,延迟最小,占用内存较多

2. 共享树RPT

仅在PIM-SM中才会使用,即适合规模较大、组成员相对比较分散的网络
在网络的某些节点的单独的公用根(RP),共享树即RPT
对应某个组,网络中只有一棵树
共享树
特点:路径不是最优的,引入额外的延迟,占用内存较少(单个表项)

组播数据转发

组播路由和单播路由是相反的,单播路由关心数据报文要到哪里去,组播路由关心数据报文从哪里来(防环)。组播路由使用 “反向路径转发”机制(RPF, Reverse Path Forwarding)

RPF检查(反向路径转发检查)

避免重复收到组播流和组播流量的环路,同时也能解决次优路径和确定建立共享树的出接口
路由器收到组播数据报文后,只有确认这个数据报文是从自身连接到组播源的接口上收到的,才进行转发,否则丢弃。
这个机制的作用是防止组播流量转发环路
RPF检查:在单播路由表中查找到组播报文源地址的路由,如果该路由的出接口就是组播报文的入接口【即确保组播流的入接口是单播路由的出接口】,RPF检查成功;否则RPF检查失败,报文丢弃

  • RPF举例
    RPF举例
  • 组播转发RPF举例
    组播转发RPF举例1
    组播转发RPF举例2

华为RPF检查过程

除单播路由外,MBGP路由、组播静态路由也是RPF检查的依据。当路由器收到一份组播报文之后,如果这三种路由表都存在,具体检查过程如下:

  1. 首先,通过报文源地址,分别从单播路由表、MBGP路由表和组播静态路由表中各选出一条最优路由。单播路由、MBGP路由的出借口为RPF接口,下一跳为RPF邻居组播静态路由实际上属于手工配置的组播路由,已经明确指定了RPF接口与RPF邻居
  2. 然后,根据以下原则从这三条最优路由中选择一条作为RPF路由
    1. 如果配置了按照最长匹配选择路由
      1. 从这三条路由中选出最长匹配的那条路由
      2. 如果这三条路由的掩码一样,则选择优先级最高的那条路由
      3. 如果优先级也相同(即手工修改了协议优先级),则按照组播静态路由>MBGP路由>单播路由的顺序进行选择
      4. 如果都是单播路由,则比较下一跳IP地址,越大越优
    2. 如果没有配置最长匹配选择路由默认
      1. 从者三条路由中选出优先级最高的那条路由(默认参考原则)
      2. 如果优先级相同,则按照组播静态路由>MBGP路由>单播路由的顺序进行选择
      3. 如果都是单播路由,则比较掩码长度,即最长匹配
      4. 如果单播路由的掩码长度一样,则比较下一跳IP地址,越大越优
  3. 最后,路由器会将报文的入接口与RPF路由的RPF接口进行比较。如果一样则RPF检查通过,表明报文来源路径正确,会将其向下游转发;如果不一致即RPF检查失败,表明该报文来源路径错误,就将其丢弃。
  4. 组播静态路由的优先级为1,MBGP默认为255

RPF检查在组播数据转发中的应用

在实际组播数据转发过程中,如果对每一份接收到的组播数据报文都通过单播路由表进行RPF检查,会给路由器带来很大负担。因此,路由器在收到一份来自源S发往组G的组播数据报文之后,首先会在组播转发表中查找有无相应的(S,G)组播转发表项:

  1. 如果不存在(S,G)转发表项,则对该报文执行RPF检查,将检查到的RPF接口作为入接口,创建组播路由表项,下发到组播转发表中。其中,对RPF检查结果的处理方式为:
    1. 如果检查通过,表明接收接口为RPF接口,向转发表项的所有出接口转发
    2. 如果检查失败,表明报文来源路径错误,丢弃该报文
  2. 如果存在(S,G)转发表项
    1. 接收该报文的接口与转发表项的入接口一致,则向所有的出接口转发该报文
    2. 接收该报文的接口与转发表项的入接口不一致,则对此报文进行RPF检查。对RPF检查结果的处理方式为:
      1. 若RPF检查选取出的RPF接口与转发表项的入接口一致,则说明(S,G)表项正确,报文来源路径错误,将其丢弃
      2. 若RPF检查选取出的RPF接口与转发表项的入接口不符,则说明(S,G)表项已过时,于是把表项中的入接口更新为RPF接口。然后再根据RPF检查规则进行判断:如果接收该报文的接口正是其RPF接口,则向转发表项的所有出接口转发该报文,否则将其丢弃。

组播相关协议

组播协议包括用于主机注册的组播组管理协议,和用于组播选路转发的组播路由协议。组播相关协议有IGMP、PIM、MSDP、MBGP
组播相关协议

IGMP互联网组管理协议

运行在接收者与叶路由器之间,用于维护组播网络中叶路由器是否需要向特定接口转发组播流。3个版本 ,v2比较常用,v1、v2、v3 均支持ASM,v3主要是针对SSM模型做有力支撑。

v1

报文格式

报文格式
  • Version:表示版本标识,版本1为1,版本2没有这个字段
  • Type:版本1只有
    • 成员关系查询(membership query,0x11
    • 成员关系报告(membership report,0x12
    • 没有特定的组关系查询,也没有主机发送的离开报告
  • 组地址:当一个成员关系报告正被发送时,组地址字段包含组播地址;当用于成员关系查询时,本字段为0,并被主机忽略

版本1不能设定响应时间,所有的响应时间都是默认的10秒,这容易引起响应突发
版本1成员离开的时候是默默离开的,不发送离开报告,这样离开延迟比较大,也不会引起特定的组查询,因此v1版本的路由器会周期性(60秒)的查询(源地址是路由器地址,目标地址是224.0.0.1,组地址为0.0.0.0)是否还有接收者。
组播表的老化时间为130秒(=60x2+10)

组成员加入

当一个主机希望接收一个组播组的数据,则发送成员加入报告给组播组,该报文中组地址为主机想加入的组播组的地址
组成员加入过程

组成员离开

华为周期为130秒,成员悄悄离开组播组,不发送任何报文。
组成员离开

组播路由器的查询与响应

  1. IGMP查询器周期性的向共享网段内所有主机以组播方式(目的地址为224.0.0.1)发送成员关系查询消息(组地址为0)
  2. 网络内所有主机都接收到该查询消息,如果某主机对某一组播组(比如,组播组G)感兴趣,则以组播方式发送“成员关系报告”报文(其中携带组播组G的地址)来宣告自己将加入该组播组,假设PC2首先发送此报告
  3. 经过查询/响应过程后,IGMP路由器了解到本网络内存在组播组G对应的接收者,生成(*,G)【*表示任意组播源,G表示某个组播组】组播项并依据此作为组播信息的转发依据
    组播路由器的查询
    IGMPv1规定,当共享网络中有多台路由器时,由组播路由协议选举查询器。不同的组播路由协议有不同的选举机制。IGMP查询器选举,由组播协议决定,如果是PIM协议,PIM的DR将做为查询器
    224.0.0.1-代表所有的组播节点;224.0.0.2-代表所有的组播路由器
响应抑制机制

原因:组播路由器只关心某个组播组中是否还有接收者,只要有一个接收者就仍然需要转发组播流量,即只需要有一个人回复组播路由器即可
IGMP成员关系查询报文的目的地址为224.0.0.1,就是说网段内所有的设备都会收到该查询报文。但并不是所有收到该报文的主机都会响应查询请求的。下图中只有一个主机会以成员关系报告报文响应,而其它主机则抑制成员关系报告的发送。
响应
实际上主机收到IGMP成员关系查询时,会对它已经加入的每个组播组启动一个倒计数报告计时器。IGMPv1中计时器固定使用10s。计时器到时的主机则主动发送成员关系报告,组地址为该组播组地址,目的地址为224.0.0.1。于是网段内其他主机都会收到该成员关系报告报文,接收到成员关系报告报文的主机抑制成员关系报告的发送,并删除计时器。当路由器周期性的发送成员关系查询报文时,每个主机都会再次启动计时器进行查询\响应\抑制。

举例

举例
多台IGMP路由器的情况下会选举IGMP查询者,v1没有选举机制,使用PIM的DR充当查询者,DR选举:1.优先级越大越优,2.IP地址越大越优。即v1中IP地址大的充当查询者,而查询者的老化时间为125秒(=60x2+0.5x10,小于130秒,即这个值必须小于组播表的老化时间,不然会出现查询者的翻动)
主机加入组播组的基本过程如下:

  1. IGMP 查询器(RouterB)周期性地向共享网段内所有主机以组播方式(目的地址为组播地址)发送普遍组查询消息。该报文的目的地址为224.0.0.1,表示该网段上的所有主机和路由器。
  2. 网段内所有主机都接收到该普遍组查询消息。如果主机(如HostB 和HostC)希望加入某组播组G1,则以组播方式发送Report报告。该报文的目的地址为224.0.0.1,报文中携带组播组G1的地址信息。
  3. 网段中所有主机和路由器都接收到该Report报告,并获知组播组G1地址信息,此时网段中其它也希望加入该组播组G1的主机将不再发送针对相同组播组的Report报告。同时,网段中预备加入另一组播组G2的主机发送针对组播组G2的Report报告以响应普遍组查询消息。
  4. 经过查询和响应过程后,IGMP路由器了解到本网段内存在组播组G1对应的组播组成员,则由组播路由协议生成(*,G1)组播转发项并以此作为组播数据的转发依据。之后,组播路由协议将发起上游路由更新以维护组播转发树。
  5. 组播源发出的组播数据经过组播路由到达IGMP路由器,如果IGMP路由器上存在(*,G1)组播转发项,则转发该组播数据到此共享网段,G1组播组成员主机接收该数据。
  6. IGMPv1中没有专门定义离开组播组的消息。当主机离开某组播组后,将不再发送以此组播组地址为目的地址的Report报告。当网段中不再存在该组播组成员后,IGMP路由器将不能收到任何针对此组播组的Report报告,则IGMP路由器删除该组播组对应的转发项。

v2

报文格式

报文格式
IGMPv2报文相比IGMPv1报文,取消了版本字段而相应增加了最大响应时间的字段
IGMPv2支持特定组查询、增加了离组消息(增加了触发查询机制)、报告抑制机制优化了

  • 最大响应时间:仅用于组成员关系查询时主机可以响应查询,返回报告的时间范围,可以适当调高,给主机足够的响应时间。以0.1秒为单位,默认值是100,即10秒
  • 组地址:
    • 在成员查询消息中,发送一个常规查询报文时组地址为0,当发送一个特定组的查询报文时,则设置为该组的地址。
    • 在成员报告或离开组的消息中,目的地址是224.0.0.2则为所有的组播路由器,但华为设备上实现为特定组
  • 类型:IGMPv2报文中有三种报文类型:
    • Type=0x11:成员关系查询报文,分为两种子类型:
      • 常规查询:用于确定哪些组播组是有效的,即该组是否还有成员在使用,常规查询组地址全零
      • 特定查询:用于查询特定的组播组是否还有组成员,组地址为特定的组播地址
    • Type=0x16:IGMPv2组成员关系报告
      • 为了和IGMPv1兼容,还有另外的一个附加消息类别:0x12为IGMPv1成员报告
    • Type=0x17:离开组消息,主机发送的离开报告

组成员加入

当一个主机加入一个组播组,则应该立即发送一个或多个成员关系报告给组播组和v1相同
组成员加入

查询与响应

与IGMPv1相同,都存在抑制机制。
增加了最大响应时间来指定延时值来规定所有主机的查询响应延时的上限,此外最大响应时间在IGMP查询器上配置,只应用在成员关系查询信息。
在常规查询之外增加了特定组查询,这种查询报文的目的IP地址为某个组播组的IP地址,报文中的组地址字段也为该组播组的IP地址,网络中属于该组播组成员的主机才会进行响应,这样就避免了属于其他组播组成员的主机发送响应报文
查询与响应
PC2发送响应报文:
其他接收者收到之后会抑制发送响应报文,刷新定时器
查询者收到之后会刷新该组的老化时间为130秒,同时记录last reporter(每一轮查询中倒计时第一个到时的设备,所以last reporter不是固定不变的)为PC2的IP地址
为什么要有last reporter?减少离组报文、特定组查询报文以及报告报文的泛洪

查询器选举

选举原则:IP地址最小的设备
查询器选举
查询器也会有失效的时间,当查询器失效时,另一个路由器成为查询器,所以非查询路由器会启动一个查询计时器,周期检查IGMP查询路由器的状态,缺省情况下为120秒,但是查询路由器的死亡时间为125秒

组成员离开

只有last reporter离组才会发送离组报文,其他接收者离组并不会发送离组报文,因为其他接收者离组时知道自己不是这个组的唯一接收者,而last reporter离组时不知道组内还有其他成员,因为他没有收到其他成员的响应报文
组成员离开
当一个主机决定离开一个组播组时,他会向所有组播路由器以组播的形式(224.0.0.2)发送离开组消息,为了明确该组播组中是否还包含其他成员主机,该组播路由器会向网络中发送特定组查询消息
在查询的最大响应时间内(默认为1s)没有收到该组的报告,则再次发特定组查询。2次特定组查询之后仍然没有收到成员报告,则认为该组播成员全部离开。

v1和v2的互操作性

以查询者的版本优先,如果查询者之间版本不同,则以低版本的优先

v2主机与v1路由器

协商使用v1
 v2主机与v1路由器
v1路由器把v2报告看作无效的IGMP信息类型并且忽略它
当v1路由器作为有效的IGMP查询器时,v2的主机必须发送v1报告。
当v2的的主机检测出IGMP查询器时v1的路由器时,他必须始终用v1报告作出响应。在这种情况下,v2的主机也可以抑制发送离开组消息。
为了维护接口的状态,无论何时v1查询在接口处被收到,v2主机会启动一个400秒的倒数计时器向下兼容v1),当另一个v1查询被收到时,计时器被复位。如果计时器到时,此接口恢复成为v2接口并且v2信息被再次发送。

v1主机与v2路由器

只会运行v2版本,v1主机后续无法收到组播流量
v1主机与v2路由器
局域网中v1的主机也是同一组成员,那么该组的v1报告总是被收到,因为v2报告在v1的主机中不会被抑制,v1的主机不兼容v2的报告,因此忽略它们。无论何时,只要v1的主机成为组成员,v2离开过程都将被搁置

混合版本

只要有1的查询者存在,只会运行v1
混合版本
如果一些运行v1的路由器存在于子网中,那么必须强制性地为子网中的所有路由器配置v1以便正常使用

v3

服务于SSM模型;允许主机指定接收某些网络发送的某些组播组;增加了主机的控制能力,不仅可以指定组播组,还能指定组播的源

报文格式

IGMPv3报文包含两大类:查询报文和成员报告报文。

  1. 查询报文(0x11)
    1. 普遍组查询报文
    2. 特定组查询报文
    3. 特定源组查询报文(离组通过该报文实现,离组之后,查询器发送该报文进行查询)
      IGMPv3查询报文格式
    • Type
      等于0x11
    • Max Response Code(最大响应时间)
      成员主机在收到IGMP查询器发送的普遍组查询报文后,需要在最大响应时间内做出回应
    • Group Address(组播组地址)
      在普遍组查询报文中,该字段设为0;在特定组查询报文和特定源组查询报文中,该字段为要查询的组播组地址
    • S
      为1时,所有收到此查询报文的其他路由器不启动定时器刷新过程,但是此查询报文并不抑制查询器选举过程和路由器的主机侧处理过程
    • QRV
      即在v2中计算查询者老化时间中的那个2,在v3中默认为2
      非0,则表示查询器的健壮系数,将自己的健壮系数调整为该字段的值;为0,则表示查询器的健壮系数大于7,则不做处理
    • QQIC(IGMP查询器的查询间隔)
      单位为秒,非查询器收到查询报文时,如果发现该字段非0,则将自己的查询间隔参数调整为该字段的值;如果发现该字段为0,则不做处理
    • Number of Sources(报文中包含的组播源的数量)
      对于普遍组查询报文和特定组查询报文,该字段为0;对于特定源组查询报文,该字段非0,此参数的大小受到所在网络MTU大小的限制
    • Source Address(组播源地址)
  2. 成员报告报文(0x22)目的地址为224.0.0.22(代表所有运行v3的路由器,即主机不监听,因此v3也就没有响应抑制机制)
    不仅包含主机想要加入的组播组,而且包含主机想要接收来自哪些组播源的数据
    IGMPv3成员报告报文格式
  • Type
    等于0x22
  • Number of Group Records(报文中包含的组记录的数量)
  • Group Record(组记录)
    Group Record
    • Record Type(组记录的类型),共分为3类
      1. 当前状态报告:用于对查询报文进行响应,通告自己目前的状态,共两种:
        1. MODE_IS_INCLUDE,表示接收源地址列表包含的源发往该组的组播数据
        2. MODE_IS_EXCLUDE,表示不接收源地址列表包含的源发往该组的组播数据
      2. 过滤模式改变报告:当组和源的关系在INCLUDE和EXCLUDE之间切换时,会通告过滤模式发生变化,共两种:
        1. CHANGE_TO_INCLUDE_MODE,表示过滤模式由EXCLUDE转换到INCLUDE,接收源地址列表包含的新组播源发往该组播组的数据
        2. CHANGE_TO_EXCLUDE_MODE,表示过滤模式由INCLUDE转换到EXCLUDE,拒绝源地址列表包含的新组播源发往该组的组播数据
      3. 源列表改变报告:当指定源发生改变时,会通告源列表发生变化,共两种:
        1. ALLOW_NEW_SOURCES,表示在现有的基础上,需要接收源地址列表包含的组播源发往该组播组的组播数据
        2. BLOCK_OLD_SOURCES,表示在现有的基础上,不再接收源地址列表包含的组播源发往该组播组的组播数据

工作机制

工作机制
v3响应消息的目的地址为224.0.0.22(代表所有运行v3的路由器),其中可以携带至少一个组记录,在每个组记录中,包含组播组地址、数目不等的源地址信息。

  1. 特定源组加入
    网络中存在S1和S2两个组播源,均向组播组G发送组播数据,Host仅希望接收从组播源S1发往组播组G的信息
    如果Host和组播路由器之间运行的是IGMPv1或IGMPv2,Host加入组播组G时无法对组播源进行选择,无论其是否需要,都会同时接收到来自组播源S1和S2的数据。如果采用IGMPv3,成员主机可以选择仅接收S1组播数据。
    1. Host发送IGMPv3报告(G,INCLUDE,(S1)),仅接收源S1向组播组G发送的数据
    2. Host发送IGMPv3报告(G,EXCLUDE,(S2)),不接收指定源S2向组播组G发送的数据,从而仅有来自S1的组播数据才能传递到Host
  2. 特定源组查询
    当接收到组成员发送的改变组播组与源列表的对应关系的报告时(CHANGE_TO_INCLUDE_MODE、CHANGE_TO_EXCLUDE_MODE、ALLOW_NEW_SOURCES、BLOCK_OLD_SOURCES),IGMP查询器会发送特定源组查询报文。如果组成员希望接收其中任意一个源的组播数据,将反馈报告报文。IGMP查询器根据反馈的组成员报告更新该组对应的源列表。

改进之处

改进之处
v3不仅支持v1的普遍组查询、v2的特定组查询,还支持v3的指定源/组查询。在IGMP消息中携带组播源地址和多种控制字段(如查询器强壮性系数、查询间隔等)。
对于普遍组查询,既不携带组地址(0.0.0.0),也不携带源地址;对于特定组查询,携带组地址,但是不携带源地址;对于指定源/组查询,既携带组地址,而且还携带至少一个源地址

IGMP三个版本的比较

1. 版本服务的组播模型

IGMPV1和V2服务于ASM模型,只能指定组播组,不能指定组播源,可以使用的组播地址范围:224.0.1.0到238.255.255.255,除去232.0.0.0/8(用于SSM)
IGMPV3可以同于服务于ASM和SSM,可以同时指定需要加入的组播组和组播源,并且在报文中可以同时通告多个组。

2. 报文类型

IGMPV1: 成员关系查询0x11、成员关系报告0x12
IGMPV2: 成员关系查询0x11普遍组查询、特定组查询 、成员关系报告0x16、离组报文0x17
IGMPV3: 成员关系查询0x11普遍组查询、特定组查询、特定源组查询、成员关系报告0x22当前状态报告:MODE_IS_INCLUDE、MODE_IS_EXCLUDE;过滤模式改变报告:CHANGE_TO_INCLUDE_MODE、CHANGE_TO_EXCLUDE_MODE;源列表改变报告:ALLOW_NEW_SOURCE、BLOCK_OLD_SOURCE

v1和v2所有组播路由其监听224.0.0.2;v3成员报告报文目的地址为224.0.0.22,即所有运行v3的路由器监听地址,但是主机不监听,因此v3也就没有响应抑制机制

3. 报文结构

  1. V1:版本、类型、组播组
    报文格式
  2. V2:类型、最大响应时间、组播组
    报文格式
  3. V3:分为查询报文和成员报告报文
    查询报文:继承v2的前8B,即类型、Max Response Code(最大响应时间)和组播组地址,之后又添加4B,主要针对的是查询者,主要包含S(抑制查询者定时器)、QRV(查询器的健壮系数)、QQIC(查询间隔),除此之外还有组播源地址个数和地址
    IGMPv3查询报文格式
    成员报告报文:类型、组记录的数量和类型
    IGMPv3成员报告报文格式

4. 版本工作流程

  1. 组成员加组
    v1和v2只能加入指定的组播组,无法指定组播源;
    v3不仅能够指定组播组,还能够选择组播源
  2. 组成员离组
    v1离组没有离组报文,需要等待130秒之后,组播表才会删除;
    v2离组时会发送离组报文,但只有last reporter才会发送离组报文,其他接收者不会发送离组报文,查询者收到离组报文之后,会发送特定组查询报文,1秒/次,连续发2次;
    v3离组时因为没有离组报文,通过发送成员关系报告报文触发查询者的特定源组查询,这个成员关系报告报文中的组记录里面组播源数目设置为0,代表不接受任何组播源的组播流,从而实现离组
  3. 组成员报告抑制
    v1和v2都有组成员报告抑制;
    v3路由器监听地址为224.0.0.22,但主机不监听此地址,因此v3没有响应抑制机制
  4. 查询者的选举
    v1没有选举查询者机制,使用PIM的DR充当查询者,优先级相同时选择IP地址较大的;
    v2和v3均选举IP地址最小的为查询者,选举时间125秒;
  5. 查询者的维护
    3个版本默认值均为125秒,
    v1无法改变也无法协商参数;
    v2可以修改参数,但是无法协商参数;
    v3可以修改参数,也可以协商,包括S、QRV和QQIC

IGMP Snooping

背景

在很多情况下,组播报文要不可避免地经过一些二层交换设备,由于组播报文的目的地址为组播组地址,在二层设备上是学习不到这一类MAC表项的因此组播报文就会在所有接口进行广播,和它在同一广播域内的组播成员和非组播成员都能收到组播报文,这样不但浪费了网络带宽,而且影响了网络信息安全。

应用

配置IGMP Snooping后,二层组播设备可以侦听和分析组播用户和上游路由器之间的IGMP报文,根据这些信息建立二层组播转发表项组播转发表项包含组播mac+组播地址+成员端口+路由器端口,控制组播数据报文转发,防止了组播数据在二层网络中的广播。
应用

基本概念

基本概念
  • 路由器端口:二层组播设备上朝向三层组播设备(DR或IGMP查询器)一侧的接口,二层组播设备从此接口接收组播数据报文
    • 动态路由器端口:收到源地址不为0.0.0.0的IGMP普遍组查询报文(老化定时器为180秒)或PIM Hello报文(老化定时器为105秒)
    • 静态路由器端口:手动配置
  • 成员端口:二层组播设备上朝向组播组成员一侧的端口,二层组播设备往此接口发送组播数据报文
    • 动态成员端口:收到IGMP Report报文
    • 静态成员端口:手动配置

工作机制

针对不同的报文进行不同的处理:

  1. 普遍组查询:
    (目的地址为224.0.0.1)向VLAN内除接收接口外的其他所有接口转发,并对接收接口做如下处理:
    1. 如果路由器端口列表中尚未包含该接口,则将其添加进去,并启动老化定时器默认为180秒
    2. 如果路由器端口列表中已包含该动态路由器端口,则重置老化定时器
  2. 成员报告:
    一是成员回复查询者的普遍组查询报文,二是成员加入组播组的报文。向VLAN内所有路由器端口转发,从报文中解析出主机要加入的组播组地址,并对接收接口做如下处理:
    1. 如果不存在该组对应的转发表项,则创建转发表项,将该接口作为动态成员端口添加到出接口列表中,并启动老化定时器动态成员端口的老化定时器=健壮系数x普遍组查询间隔+最大响应时间,默认130秒
    2. 如果已存在该组对应的转发表项,但出接口列表中未包含该接口,则将该接口作为动态成员端口添加到出接口列表,并启动老化定时器
    3. 如果已存在该组所对应的转发表项,且出接口列表中已包含该动态成员端口,则重置其老化定时器
  3. 成员离开组播组
    (针对v2和v3)成员发送离组报文,查询器收到之后发送特定组查询或者特定源组查询报文
    1. 针对离组报文
      1. 判断离开的组是否存在对应的转发表项,以及转发表项出接口列表是否包含报文的接收接口
        1. 如果不存在该组对应的转发表项,或者该组对应转发表项的出接口列表中不包含接收接口,二层组播设备不转发该报文,将其直接丢弃
        2. 如果存在该组对应的转发表项,且转发表项的出接口列表中包含该接口,二层组播设备会将报文向VLAN内所有路由器端口转发
      2. 对于IGMP离开报文的接收接口,二层组播设备在其老化时间内:
        1. 如果从该接口收到了主机响应IGMP特定组/源组查询的报告报文,表示接口下还有该组的成员,于是重置其老化定时器
        2. 如果没有从该接口收到主机响应IGMP特定组/源组查询的报告报文,则表示接口下已没有该组成员,则在老化时间超时后,将接口从该组的转发表项出接口列表中删除
    2. 针对特定组(源组)查询报文:向有特定组成员的接口转发

【总结】:

  1. 成员端口(即接收者一侧)的维护时间默认为130秒,路由器端口的维护时间默认是180秒
  2. v1没有离组报文,需要等待130秒之后才能删除表项中离组的端口
  3. 开启IGMP Snooping之后就没有成员响应抑制功能了,交换机收到主机成员关系报告,只将该报文转发到路由器端口,不再向成员端口转发【因为交换机通过定时器维护端口,同时建立组播表需要知道哪些端口是成员端口,所有需要所有的成员端口都能够发送成员关系报告,因此每台接收者都是last reporter】
  4. IGMP Snooping维护端口依赖定时器,所以成员离组报文实际上已经没有任何意义,交换机将特定源组查询报文转发到成员单口之后,没有接收者响应并不会立即删除该端口,需要等到130秒计时器超时之后才会删除该端口

IGMP Snooping Proxy(二层)和IGMP Proxy(三层)

IGMP Snooping Proxy

IGMP Snooping Proxy配置在交换机上,主要是为了代理路由器处理IGMP报文,减轻查询者路由器的压力。从查询者路由器角度看,这个交换机相当于接收者;从接收者主机角度看,这个交换机相当于发送者
IGMP Snooping Proxy
IGMP Snooping Proxy功能在IGMP Snooping的基础上添加两项功能:

  1. 代替查询者向接收者发送IGMP查询报文
  2. 代替接收者向查询者发送IGMP成员关系报告和离组报文
工作机制
  1. 普遍组查询报文
    向本VLAN内除接收接口以外的所有接口发送IGMP普遍组查询报文;同时根据本地维护的组成员关系生成报告报文,向所有路由器端口发送为什么还会转发普遍组查询报文?为了复位成员端口定时器
  2. 成员关系报告报文
    1. 不存在该组对应的转发表项,则创建转发表项,将接收接口作为动态成员端口添加到出接口列表中,并启动其老化定时器,然后向所有路由器端口发送该组的报告报文
    2. 若已存在该组对应的转发表项,且其出接口列表中已包含该动态成员端口,则重置其老化定时器
    3. 若已存在该组对应的转发表项,但其出接口列表中不包含该接收接口,则将该接口作为动态成员端口添加到出接口列表中,并启动其老化定时器
  3. 离开报文
    1. 向接收接口发送针对该组的特定组查询报文。只有当删除某组播组对应转发表项中的最后一个成员端口时,才会向所有路由器端口发送该组的离开报文
    2. IGMP特定源组查询报文
      如果该组播组还有成员,则回复成员关系报文,否则直接丢弃
  1. 收到成员关系报告后,只有交换机上没有该组播mac地址表时才会向路由器发送成员关系报告;已经存在组播mac地址表项,则不需要再向路由器发送成员关系报告,只需要将成员端口加入组播mac地址表即可
  2. 收到成员离组报文,会代替路由器发送特定组查询。只有一个组播组中没有成员之后,交换机才会向路由器发送离组报文
  3. 交换机收到通用组查询报文之后,会向所有成员端口转发,并根据组播mac地址表项生成响应报文,回复查询者

IGMP Proxy

IGMP Proxy配置在最后一跳路由器上(接入设备和成员主机之间的三层设备),工作原理和IGMP Snooping Proxy相同
IGMP Proxy
在接入设备RouterA看来,RouterB就是一台主机;在下游成员主机看来,RouterB就是IGMP查询器

  1. IGMP Proxy设备可以收集下游成员主机的IGMP报告/离开报文,将报告/离开报文汇聚后代理下游成员主机统一上送给接入设备
  2. IGMP Proxy设备也可以代理IGMP查询器向下游成员主机发送查询报文,维护组成员关系,基于组成员关系进行组播转发

两种类型的接口:

  1. 上游接口(主机接口):配置IGMP Proxy功能的接口,执行主机行为
  2. 下游接口(路由器接口):配置IGMP功能的接口,执行路由器行为

IGMP SSM Mapping

作用:让只能运行IGMPv1或IGMPv2的接收者也能指定组播源,即能够使用SSM服务
实现原理:启动了mapping后,要手动绑定一个源信息,让路由器知道源的信息,从而建成SPT树

工作过程

配置了SSM Mapping规则后,当IGMP查询器收到来自成员主机的IGMPv1或IGMPv2报告报文时,检查该报文中所携带的组播组地址G:

  1. 如果G在ASM地址范围内,则只提供ASM服务
  2. 如果G在SSM组地址范围内:
    1. 如果路由器上没有G对应的SSM Mapping规则,则无法提供SSM服务,丢弃该报文
    2. 如果路由器上有G对应的SSM Mapping规则,则依据规则将报告报文中所包含的(*, G)信息映射为(G, INCLUDE, (S1, S2...))信息,提供SSM服务

IGMP SSM Mapping不处理IGMPv3的报告报文,但为了保证同一网段运行任意版本IGMP的主机都能得到SSM服务,需要在与成员主机所在网段相连的组播路由器接口上运行IGMPv3
工作过程
SSM网络中HostA运行IGMPv3、HostB运行IGMPv2、HostC运行IGMPv1。HostB和HostC无法升级到IGMPv3,如果要为该网段中的所有主机提供SSM服务,需要在IGMP查询器(Router)上使能IGMP SSM Mapping并配置相应的映射规则在图中,查询器与主机相连的接口上需要运行IGMPv3

PIM

PIM称为协议无关组播,表示组播依靠的单播路由可以由静态路由、RIP、OSPF、ISIS、BGP等提供,组播路由和单播路由协议无关,只要单播路由协议产生所需路由表项能够完成RPF检查即可。
协议号为103(0x67),目前使用的是v2版本,PIM路由器目的组播地址为224.0.0.13
在组播路由器之间建立PIM的邻居关系,能够根据规则产生组播路由表。用于组播路由器之间。PIM协议包括PIM-SM(稀疏模式)和PIM-DM(密集模式)

  1. PIM-DM适合规模较小、组播组成员相对比较集中的网络。不需要区分ASM模型和SSM模型
  2. PIM-SM适合规模较大、组成员相对比较分散的网络。根据组播地址区分ASM模型和SSM模型,如果在SSM组播地址范围内,则按照PIM-SM在SSM中的实现流程进行处理,PIM-SSM不但效率高,而且简化了组播地址分配流程,特别适用于对于特定组只有一个特定源的情况。如果在ASM组播地址范围内,则按照PIM-SM在ASM中的实现流程进行处理

概念介绍

概念介绍

组播分发树MDT

PIM网络以组播组为单位在路由器上建立一点到多点的组播转发路径

  1. SPT:以组播源为根,组播组成员为叶子,适用于PIM-DM或PIM-SM
    如图:RouterE→RouterD→RouterA(RouterB),就是一棵以Source为根,以HostA、HostB为叶子的SPT
  2. RPT:以RP为根,组播组成员为叶子,RPT适用于PIM-SM网络

PIM路由器

  1. 叶子路由器:与用户主机相连的PIM路由器,但连接的用户主机不一定为组成员,如图:RouterA、RouterB、RouterC
  2. 第一跳路由器:组播转发路径上,与组播源相连且负责转发该组播源发出的组播数据的PIM路由器,如图:RouterE
  3. 最后一跳路由器:组播转发路径上,与组播组成员相连且负责向该组成员转发组播数据的PIM路由器,如图:RouterA、RouterB
  4. 中间路由器:组播转发路径上,第一跳路由器与最后一跳路由器之间的PIM路由器,如图:RouterD

PIM路由表项

PIM网络中存在两种路由表项:S表示组播源,G表示组播组,*表示任意

  1. (S,G)路由表项:用于在建立SPT,适用于PIM-DM或PIM-SM
  2. (*,G)路由表项:用于建立RPT,适用于PIM-SM

PIM路由器上可能同时存在两种路由表项,当收到源地址为S,组地址为G的组播报文,且RPF检查通过的情况下,按照如下的规则转发:(S,G)优先级高于(*,G)

  1. 如果存在(S,G)路由表项,则由(S,G)路由表项指导报文转发
  2. 如果不存在(S,G)路由表项,只存在(*,G)路由表项,则先依照(*,G)路由表项创建(S,G)路由表项,再由(S,G)路由表项指导报文转发

PIM路由表项中主要用于指导转发的信息如下:

  1. 组播源地址。
  2. 组播组地址。
  3. 上游接口:本地路由器上接收到组播数据的接口,如图:Int3
  4. 下游接口:将组播数据转发出去的接口,如图:Int1、Int2

PIMv2报文头格式

报文头格式
  • 版本:版本字段标识版本信息,目前为2
  • 报文类型:
    • 0:Hello(周期30秒,死亡时间105秒3.5倍hello时间
    • 1:Register(注册,SM,单播)
    • 2:Register Stop(停止注册,SM,单播)
    • 3:Join/Prune(加入/剪枝)
    • 4:Bootstrap(SM,选取BSR)
    • 5:Assert(断言)
    • 6:Graft(嫁接,DM,单播)
    • 7:Graft Ack(嫁接确认,DM,单播)
    • 8:Candidate RP Advertisement(候选RP公告,SM,单播)
    • 9:State Refresh(状态刷新,DM)
      SM独有的报文:Register、Register Stop、Bootstrap、Candidate RP Advertisement;DM独有的报文:Graft、Graft Ack、State Refresh
      ping一个组播组,有时第一个包通,但是后面的包不通,这是因为第一个包是用来注册的。如果后面的也不通,则说明组播网络有问题
      优先级值大的选举为DR,具备抢占性,组播地址为224.0.0.13,使用hello报文进行选举。

报文

Hello报文

Hello报文
组播路由器需要使用Hello消息来发现邻居,并维护邻居关系。
除了头部,剩下的均为TLV格式

  • type1:hello hold time,默认105秒,时间用2B表示,全1代表永远不过期,全0代表立即断开邻居关系
  • type19:priority,只有SM中才有,通过比较Hello消息上携带的优先级(越高越优)和IP地址(越大越优),各路由器为各网段选举指定路由器DR
  • type21:状态刷新功能
  • type22:双向PIM

Join报文

3个重要比特位:

  1. S:PIM-SM则置位
  2. W:标识该报文来自共享树
  3. R:表明该报文发送给RP

State Refresh状态刷新报文

状态刷新报文
  • R:表示是RP,PIM-DM中设置为0
  • TTL:和IP中的TTL不同,这个TTL表示组播报文能够传输多远,默认为255
  • P:如果状态刷新报文是从处于Prune状态的端口发送除去的,此位置1
  • N:Prune Now flag,每发送3个状态刷新报文会置位1次,用于刷新端口的Prune状态虽然剪枝定时器为210秒,但是每隔120秒就会被刷新一次
  • O:Assert Override flag,置位之后则刷新Assert的端口状态,即维护winner的地位,winner会转发状态刷新报文,而loser不会转发

PIM-DM(Dense_mode,密集模式)

链路一端配置DM,一端配置SM,虽然可以建立邻居,但是无法正常工作,主要是组播分发树不一样

工作机制

采用“推(Push)模式”转发组播报文,因此此模式只关心两件事:哪些接口开启了PIM-DM模式;RPF检查。采用推的机制的目的是在DM中产生组播路由表,先有组播路由表再去推组播流
PIM-DM的关键任务:建立SPT(最短路径树)

1. 邻居发现和DR竞选Neighbor Discovery

邻居发现
PIM路由器上每个使能了PIM协议的接口都会对外发送Hello报文
封装Hello报文的组播报文的目的地址是224.0.0.13(表示同一网段中所有PIM路由器)、源地址为接口的IP地址、TTL数值为1、DR优先级等
Hello报文的作用:发现PIM邻居、协调各项PIM协议报文参数、维持邻居关系
选取DR(在DM模式下仅充当IGMPv1的查询者,无其他作用)
DR选举规则

  1. DR优先级越大越优
  2. DR优先级相同时,IP地址越大越优

DR出现故障,将导致PIM邻居关系超时,其他PIM邻居之间会触发新一轮的DR竞选同时也支持抢占

2. 扩散Flooding

扩散需要两次,第2此为了后来可能出现的需要流量的枝杈,即重新泛洪(180s倒计时)
当PIM-DM网络中出现活跃的组播源之后,组播源发送的组播报文将在全网内扩散,下游PIM路由器接收到组播报文,根据单播路由表进行RPF检查通过后,然后在该路由器上创建(S,G)表项,组播报文继续向下游组播,直至到达叶子路由器,然后会出现以下两种情况:

  1. 叶子路由器上存在组成员,则将相应接口加入(S,G)表项,后续的组播报文会向组成员转发
  2. 不存在组成员,且不需要向其下游PIM邻居转发组播报文,则进行剪枝
扩散
  1. 组播源S向组播组G发送组播报文
  2. RouterC接收到组播报文后,根据单播路由表进行RPF检查。RPF检查通过,创建(S,G)表项,继续向下游接口转发该组播报文
  3. RouterA接收到来自RouterC的组播报文,RPF检查成功,在本地创建对应(S,G)表项,存在组成员HostA,将与HostA相连的接口加入表项中
  4. RouterB接收到来自RouterC的组播报文,由于不存在组成员和PIM邻居,执行剪枝
3. 剪枝Prune

只有下游设备没有接收者之后才会向上游设备发送Prune报文
剪枝是为了优化成SPT,剪枝行为是由下游PIM路由器设备发起,删除不需要转发组播流量的端口。剪枝延迟,上游设备收到剪枝消息,默认延迟3秒再剪枝。剪枝后形成SPT树
剪枝

  1. RouterB向上游RouterC发送Prune报文,通知RouterC不用再转发数据到该下游网段
  2. RouterC收到Prune报文后,停止该下游接口转发,将该下游接口从(S,G)表项中删除只删除接口,不删除(S,G)表,因为后面可能有新的接收者加入,下游接口的状态由Forwarding变为Prune,计时器为210秒由于RouterC上还存在其他处于转发状态的下游接口,剪枝过程停止,后续到达的报文只向RouterA转发
  3. RouterA也会收到剪枝报文,因为它有接收者,所以回复一个剪枝否定报文,即Join报文
  4. RouterC会收到该Join报文,继续向RouterA相连的接口转发;RouterB收到之后知道了还有其他接收者,然后抑制Prune报文的发送(抑制之后再也不会发送Prune报文)
4. 嫁接Graft

针对在剪枝之后出现的接收者向上请求组播流,下游设备向上发嫁接(Graft)消息,上游设备向下发嫁接确认。嫁接之后形成新的SPT树
嫁接

  1. RouterB希望在下一次“扩散-剪枝”扩散--剪枝周期性进行,每3分钟重复一次来临前恢复对HostB组播报文的转发,向上游路由器RouterC发送Graft报文,请求恢复相应出接口转发组播报文
  2. RouterC收到Graft报文后,回复Graft Ack报文,将该接口添加到(S,G)表项中的下游接口列表中。由于RouterC上有组播报文到达,嫁接过程停止,后续到达的报文向RouterB转发
5. 断言Assert

避免流量重复拷贝
触发发送Assert报文的条件:路由器从下游接口收到了自己转发的组播流量
有多个相连的PIM路由器RPF检查通过向该网段转发组播报文时,则需要通过断言机制来保证只有一个PIM路由器向该网段转发组播报文。
PIM路由器在接收到邻居路由器发送的相同组播报文后,会以组播的方式向本网段的所有PIM路由器发送Assert报文,其它PIM路由器在接收到Assert报文后,将自身参数与对方报文中携带的参数做比较,进行Assert竞选。
竞选规则:

  1. 单播路由协议优先级较高者获胜
  2. 如果优先级相同,则到组播源的开销较小者获胜
  3. 如果以上都相同,则下游接口IP地址最大者获胜

根据Assert竞选结果,路由器将执行不同的操作

  1. 获胜一方的下游接口称为Assert Winner,将负责后续对该网段组播报文的转发
  2. 落败一方的下游接口称为Assert Loser,后续不会对该网段转发组播报文,PIM路由器也会将其从(S,G)表项下游接口列表中删除
断言
  1. RouterB和RouterC从各自下游接口接收到对方发来的组播报文,RPF检查都失败,报文被丢弃。同时,RouterB和RouterC分别向该网段发送Assert报文
  2. RouterB将自身的路由信息与RouterC发来的Assert报文中携带的路由信息进行比较,由于自身到组播源的开销较小而获胜,于是后续组播报文仍然向该网段转发
  3. RouterC在接收到组播报文后仍然由于RPF检查失败而丢弃,RouterC将自身的路由信息与RouterB发来的Assert报文中携带的路由信息进行比较,由于自身到组播源的开销较大而落败。于是禁止相应下游接口向该网段转发组播报文,将其从(S,G)表项的下游接口列表中删除

为什么有RPF检查了,还需要断言?
RPF检查是为了防止组播流量转发环路或者收到重复的组播流,而断言机制是收到了重复的组播流之后为了避免流量的重复拷贝而进行的
如上图,RouterD执行RPF检查,与RouterB和RouterC相连的接口都能通过RPF检查,如果没有断言机制,RouterD就会收到重复的组播流

6. 状态刷新State Refresh

发送状态刷新报文的条件:第一跳路由器收到组播源的组播流
状态刷新报文的作用:1. 维护Prune状态;2. 维护Assert状态
为了避免被裁剪的接口因为“剪枝定时器默认210秒”超时而恢复转发,第一跳路由器会周期性(60秒)地触发State Refresh报文在全网内扩散,收到State Refresh报文的PIM路由器会刷新剪枝定时器的状态。被裁剪接口的下游叶子路由器如果一直没有组成员加入,该接口将一直处于抑制转发状态
状态刷新

  1. RouterC触发状态刷新,将State Refresh报文向RouterA和RouterB扩散
  2. RouterC上存在被裁剪接口,刷新该接口的“剪枝定时器”的状态。下一次“扩散-剪枝”来临时,由于RouterB上仍然没有组成员加入,RouterC上被裁剪的接口将被抑制转发组播报文

总结与评价

  • 协议假设:网络中的每个子网都存在至少一个对组播源感兴趣的接受站点,因此组播数据包被扩散到网络中的所有网段,因此对于小型网络来说非常有效
  • PIM-DM对没有组播数据转发的分支进行Prune剪枝操作,只保留包含接收者的分支
  • 为了使剪掉的有组播数据转发需求的分支能够重新接收组播流数据,剪掉的分支周期性的恢复成转发状态
  • 为了减少等待被剪掉的分支恢复成转发状态的延时时间,PIM-DM使用Graft机制主动恢复组播报文的转发
  • PIM-DM域中数据包的转发路径是有源树
    • 以组播源为根,组播组成员为枝叶的一棵树
    • 由于有源树使用的是从组播源到接收者的最短路径,因此也称为最短路径树SPT
  • PIM-DM不依赖于特定的单播路由协议,而是使用现存的单播路由表进行RPF检查
  • 优势:
    • 易于配置,且实现机制简单:邻居发现--扩散--剪枝--嫁接--断言--状态刷新
  • 潜在问题:
    • 扩散剪枝过程不够高效,复杂的Assert机制
    • 不支持共享树【共享树不用于转发数据,其入接口为NULL,仅用于产生(S,G),这是和SM模式的重要区别】
    • 控制和数据平面混合导致网络内部的所有路由器上都由(S,G)表项存在【一旦有任意组播源出现,所有设备会自动生成表项,占用内存】

PIM-SM(ASM模型)

基本原理

  1. 在ASM模型中,PIM-SM使用“拉(Pull)模式”转发组播报文,从接收者开始向RP方向尝试拉取组播流先有组播路由表,后有组播流一般应用于组播组成员规模相对较大、相对稀疏的网络。基于这一种稀疏的网络模型,它的实现方法是:
    1. 在网络中维护一台重要的PIM路由器:汇聚点RP,可以为随时出现的组成员或组播源服务,网络中所有PIM路由器都知道RP的位置
    2. 当网络中出现组成员时,最后一跳路由器向RP发送Join报文,逐跳创建(*,G)表项,生成一棵以RP为根的RPT
    3. 当网络中出现活跃的组播源时,第一跳路由器将组播数据封装在Register报文中单播发往RP,在RP上创建(S,G)表项,注册源信息
  2. 术语
    1. 源:发送组播数据的终端主机或PC
    2. 接收者:接收组播数据的终端主机或PC
    3. 汇聚点RP:接收者从这里获取源信息,并且是共享树的根一个RP可以同时为多个组播组服务,但一个组播组只能对应一个RP
    4. 指定路由器DR(需要向向RP注册):在共享网段上选举优先级最高(数值最大)或者IP地址最大的路由器为DR;
      1. 源端DR:负责向RP发送单播的Register消息,将数据从源转发至RP
      2. 接收者(组成员端)DR:负责向RP发送(*,G)的Join加入消息,将数据从RP转发到接收者或称最后一跳DR
    5. RPT:从接收者DR到RP逐跳建立起来的,以RP为根的共享树。RPT实现了组播数据按需转发的目的,减少了数据泛洪对网络带宽的占用
    6. SPT:从接收者DR到源DR建立起来的,以源DR为根的最短路径树
    7. BSR:自举路由器,负责在PIM-SM网络启动后,收集网络内的RP信息,为每个组选举出RP,然后将RP集(即组-RP映射数据库)发布到整个PIM-SM网络。
  3. PIM-SM的关键任务
    1. 建立RPT:
      1. 接收者通过IGMP向叶路由器报告组播流需求,叶路由器产生(*,G)
      2. SM要求整个组播网络的所有参与路由器都需要知道RP的位置
      3. 叶路由器向RP方向做RPF检查,从RPF邻居接口向上游发送PIM的join消息
      4. 上游路由器产生(*,G) ,同时向上传递join消息,直至RP
    2. 建立SPT:
      1. 第一跳路由器最先感知到组播流和组播源,执行注册,将组播流封装在单播报文中,单播转发至RP,向RP注册组播源地址
      2. RP主动向着组播源方向发起PIM join(S,G),这个过程会形成SPT
      3. 注册停止,当SPT建立完毕,第一跳路由器将能够沿着SPT向下转发组播流,当RP收到来自SPT的组播流,将单播向第一跳路由器发送注册停止消息
      4. 第一跳路由器收到注册停止消息,停止发送注册报文
        此时,SM中RPT也负责转发组播流,但是,目前为止,组播的转发路径依然不是最优的
    3. SPT切换:
      1. 当叶路由器接收到组播流,将感知到组播源地址,默认的情况下,叶路由器会立刻触发一个叫做SPT切换的过程
      2. 叶路由器将根据感知到的组播源地址,针对组播源做RPF检查。向着源方向做(S,G) join,完成后组播流将沿着SPT转发

工作机制

工作机制
1. 邻居发现和DR竞选

与PIM-DM发现和选举过程基本相同,但是DR的作用不同。在PIM-DM中的DR只能充当IGMPv1的查询者,但在PIM-SM中,DR来负责源端(源DR)或组成员端(接收者DR)组播报文的收发
邻居发现和DR竞选

2. RP发现

汇聚点RP用于处理源端DR注册信息及组成员加入请求,网络中的所有PIM路由器都必须知道RP的地址
配置RP方式:

  1. 静态RP:在所有PIM路由器上静态指定RP的地址
  2. 动态RP:在PIM域内选择几台PIM路由器,配置C-RP(候选RP)来动态竞选出RP。同时,还需要通过配置C-BSR(候选BSR)选举出BSR,来收集C-RP的通告信息,向PIM-SM域内的所有PIM路由器发布。

BSR竞选:
每个C-BSR都认为自己是BSR,泛洪Bootstrap报文,携带自己的地址和优先级,其他PIM路由器都收到所有C-BSR发出的Bootstrap报文,通过比较这些C-BSR信息,竞选产生BSR,规则:

  1. 优先级越大越优
  2. 如果优先级相同,IP越大越优
    一个网络内部只有一个BSR,但可以配置多个C-BSR。BSR周期性(60秒,老化时间时130秒)地向组播发送BSR消息(即TTL=1,消息内容包含BSR地址和RP集,其中RP集中主要是C-RP发送给BSR的信息的汇总,包含C-RP的地址、服务范围、优先级等),所有的路由器使用收到的RP集来确定RP,所有路由器都使用相同的RP选择算法,选择的RP也是一致的

RP竞选
RP竞选:
C-RP向BSR发送Advertisement报文通过单播方式发送(目标地址为BSR地址,源地址为C-RP地址),报文中携带C-RP地址、服务的组范围和C-RP优先级,BSR将这些信息汇总为RP集,然后在整个网络中泛洪,各PIM路由器根据RP集竞选出该组RP,竞选规则如下:

  1. 与用户加入的组地址匹配的C-RP服务的组范围掩码最长者获胜
  2. C-RP优先级越小越优,默认优先级为0
  3. 执行Hash值越大越优hash值由3部分组成:组地址、RP地址、hash掩码长度(默认为30,除了用作hash,还可以用来做RP的负载)
  4. C-RP的IP越大越优
    总结:C-RP周期(60秒)性单播发送候选信息,超时时间为150秒,选举规则:服务范围小的、优先级值小的优先级高、hash结果大的、IP地址大的

因此,RP并不是BSR选出来的,是由其他PIM路由器自己选出来的,其他PIM路由器依据BSR发送的RP集进行选举的

3. RPT构建

RPT构建
出现接收者时,从接收者DR开始,逐跳发送Join报文,中间的PIM路由器会进行RPF检查查找到达RP的单播路由,单播路由的出接口为上游接口,下一跳为RPF邻居,直至到RP,在通向RP的路径上逐跳创建(*,G)表项,生成一棵以RP为根的RPT。

4. 组播源注册

组播源注册
新出现的组播源都必须首先在RP处注册,注册过程如下:

  1. 组播源将组播报文发给源端DR
  2. 源端DR(第一跳路由器)接收到组播报文后,将其封装在Register报文中(源地址为源DR连接组播源接口的地址,目的地址为RP地址),单播发送给RP此时在源DR和RP之间的路由器上并不会产生(S,G)
  3. RP接收到Register报文,将其解封装,进行RPF检查,建立(S,G)表项老化时间为210秒
    1. 如果RP上已经有需要该组播源的组播组,那么RP会将组播数据沿RPT发送到达组成员,并向源DR发送(S,G)的Join报文之后会以60秒为周期发送,主要是维护(S,G)表项在源DR与RP之间的路由器收到Join报文之后会建立(S,G)表项,同时源DR也会停止注册过程
    2. 如果没有需要该组播源的组播组,则将该组播数据丢弃,向源DR单播发送停止注册消息,停止注册过程注册停止报文计时器60秒,即停止注册报文只有在组播源注册之后,且没有接受者的情况下才会发送
      PIM-SM中,偶尔会出现的组播初始流量通,后续流量不通的情况:最开始是单播注册转发
5. SPT切换

为了解决所有组播报文都封装在注册报文中经过RP解封之后再按照RPT转发,导致RP压力过大的问题,PIM-SM允许RP或组成员端DR通过触发SPT切换来减轻RP的负担:
RP或者组成员端DR在接收到第一份组播报文时都会触发各自的SPT切换。如果SPT和RPT是一棵树则没必要进行切换

  1. RP触发SPT切换
    1. RP收到源端DR的注册报文后,将封装在注册报文中的组播报文沿RPT转发给组成员,同时RP会向源端DR逐跳发送Join报文。发送过程中在PIM路由器创建(S,G)表项,从而建立了RP到源的SPT
    2. SPT树建立成功后,源端DR直接将组播报文转发到RP,不需要再封装在注册报文中,使源端DR和RP免除了频繁的封装与解封装
  2. 组成员端DR触发SPT切换
    SPT切换
    1. 组成员端DR逐跳向源端DR逐跳发送Join报文并创建(S,G)表项,建立源端DR到接收者DR的SPT
    2. SPT建立后,组成员端DR会沿着RPT逐跳向RP发送剪枝报文,删除(S,G)表项中相应的下游接口。剪枝结束后,RP不再沿RPT转发组播报文到组成员端。此处的剪枝和PIM-DM中略有不同,DM中剪枝之后端口还保留在组播表中,只是状态由转发变为剪枝,但是SM中是直接从组播表中删除的
    3. 如果SPT不经过RP,RP会继续向源端DR逐跳发送剪枝报文,删除(S,G)表项中相应的下游接口。剪枝结束后,源端DR不再沿“源端DR-RP”的SPT转发组播报文到RP。
6. 断言Assert

断言机制与PIM-DM中的相同

特殊场景

特殊场景
这个场景下PC可以接收到组播流量,原因是SPT切换。但是华为在这种情况下不是依赖SPT切换实现,是通过第一跳路由器不断的发送Assert报文实现的。

PIM-SM(SSM模型)

基本原理

SSM模型是借助PIM-SM的部分技术和IGMPv3/MLDv2来实现的,无需维护RP、构建RPT、注册组播源,可以直接在源与组成员之间建立SPT
SSM特点:网络用户能够预先知道组播源的具体位置
在SSM模型中,PIM-SM的关键机制包括邻居发现、DR竞选、构建SPT。

工作机制

1. 邻居发现和DR竞选

此过程和PIM-SM(ASM模型)中的相同

2. SPT构建
SPT构建
  1. RouterD、RouterE借助IGMPv3/MLDv2协议了解到用户主机有到相同组播组,但是不同组播源的组播需要,逐跳向源方向发送Join报文
  2. PIM路由器通过Join报文分别创建(S1,G)、(S2,G)表项,从而分别建立了源S1到组成员HostA、源S2到组成员HostB的SPT
  3. SPT建立后,源端就会将组播报文沿着SPT分发给组成员

SSM与ASM模型比较

SSM模型与ASM模型之间的最大差异就是是否指定了组播源
SSM与ASM模型比较

(*,G)与(S,G)条目关系

条目关系

MSDP

组播源发现协议,解决多个PIM-SM域之间的互连的一种域间组播协议,用来发现其他PIM-SM域内的组播源信息,实现组播报文的跨域转发。只有IPv4网络中PIM-SM使用ASM模型时,才需要使用MSDP
SDP通过在不同PIM-SM域的路由器(通常在RP上)之间建立MSDP对等体,MSDP对等体之间交互SA(Source-Active)消息,共享组播源信息,最终可以使一个域内的组播用户接收到其他域的组播源发送的组播数据

任意播Anycast

任意播地址是从单播地址空间中划分出来的。当一个单播地址分配给多个接口,就变成了任意播地址。

  • 任意播地址是一个标识符对应多个接口的情况。如果一个数据报文要求被传送到一个任意点地址,则将被传送到最近一个接口(路由器决定)
  • 单播就是一对一;任意波就是一对最近;组播就是一对多
  • 任意播是指某组中任意发送方对应拓朴结构中几个最接近的接收方之间的通信
  • 任意播是IPv6 中更新路由表时所采用的一种方法
  • Anycast RP(任播RP)是指在同一PIM-SM域内通过设置两个或多个具有相同地址的RP,并在这些RP之间建立MSDP对等体关系,以实现域内各RP之间的负载分担和冗余备份,同时也能避免次优路径的问题(因为任意播是找最近的)【静态RP备份的原理】

MSDP对等体建立

  1. 使用MSDP实现跨域组播的首要任务是:建立MSDP对等体,MSDP对等体通常建立在RP上
  2. MSDP对等体通过TCP连接建立,使用端口639
  3. 两台设备使能MSDP并互相指定对方为MSDP对等体后,两端先比较IP地址,IP地址较小的一端会启动连接重试定时器,并主动发起TCP连接,通过keepalive维持IP地址较大的一端负责确认是否有TCP连接在端口639建立
  4. 通常在各个PIM-SM域的RP之间配置MSDP对等体关系,MSDP对等体之间交互SA消息,SA消息中携带组播源DR在RP上注册时的(S,G)信息。通过这些MSDP对等体之间的信息传递,任意一个RP发出的SA消息能够被其他所有的RP收到哪些RP必须配置对等体?源RP和接收者RP必须配置msdp,因为这两个RP知道组播源和组播接收者的信息。其他的msdp对等体不一定配置在RP上
  5. 状态机:down、listen、connect、up
  6. MSDP报文:IP头+TCP头+TLV格式内容
MSDP对等体建立
  1. 起始状态下,两台路由器的MSDP会话状态都是Down
  2. 在两端使能MSDP并互相指定对方为MSDP对等体后,两端比较建立连接使用的地址:
    1. RouterA的地址较小,进入Connect状态,向RouterB发起连接,并启动ConnectRetry定时器,该定时器用于定义连接重试的周期
    2. RouterB的地址较大,进入Listen状态,等待对端进行连接
  3. TCP连接建立成功后,两端的MSDP会话进入Up状态
  4. MSDP对等体两端发送KeepAlive消息,通知对方保持MSDP连接状态

组播源信息在域间的传递

组播源信息在域间的传递
  1. 当PIM-SM1域内的组播源Source向组播组G发送第一个组播数据包时,DR1将该组播数据封装在注册报文中,并发给RP1
  2. RP1作为源端RP,创建SA消息,并周期性地向它的对等体RP2发送,SA消息中包含组播源的地址、组播组的地址以及创建该SA消息的源端RP(即RP1)的地址
  3. RP2接收到该SA消息后,向RP3转发,同时检查本域内是否存在组G成员。由于PIM-SM2域内没有组G的接收者,故RP2不做其他动作
  4. RP3接收到该SA消息后,域内存在组G成员,则通过IGMP协议在RP3上生成(*,G)表项,然后创建(S,G)表项,向组播源Source逐跳发送(S,G)加入报文,创建一条从Source到RP3的组播路径SPT
  5. 组播数据沿SPT到达RP3后,再沿RPT向接收者转发,当接收者侧DR3收到Source发出的组播数据后,可以自行决定是否发起SPT切换

应用场景

MSDP实现AS内PIM-SM域间组播

组播源和组成员处于同一AS内不同PIM-SM域间,可以在RP上配置MSDP对等体,实现域间组播
MSDP实现AS内PIM-SM域间组播
在两个PIM-SM域的RP之间配置MSDP对等体,可以共享对方域内的组播源信息。
【注意】:多个RP配置相同地址的情况下(即Anycast RP,避免次优的问题),建立msdp对等体的时候,需要修改msdp报文中RP的内容在msdp进程下:originating-rp g0/0/0,主要是修改SA报文中RP的地址,使用物理接口的地址充当RP的地址,从而避免RPF检查不通过的问题。当然也可以在pim进程下直接配置anycast-rp地址,然后配置邻居地址和本地地址(发报地址)

组播中静态RP的备份方式及原理:使用Anycast技术,并配置MSDP

MBGP

跨AS域的组播转发,适用于组播源与组播接收者在不同AS域的场景

组播双栈技术

MLD

  1. 组播侦听者发现协议,负责IPv6组播成员管理的协议,用在IPv6成员主机和与其直接相邻的组播路由器之间
  2. MLD通过在成员主机和组播路由器之间交互MLD报文实现组成员管理功能,MLD报文封装在IPv6报文中
  3. MLD可以理解为IGMP的IPv6版本,两者的协议行为完全相同,区别仅仅在于报文格式
  4. MLDv1对应IGMPv2,基于查询和响应机制完成对IPv6组播组成员的管理;MLDv2对应IGMPv3。MLDv2在MLDv1的基础上,增加的主要功能是成员主机可以指定接收或不接收某些组播源的报文。MLD向前兼容,即运行MLDv2的组播路由器可以识别MLDv1的协议报文
  5. 所有MLD版本都支持ASM,MLDv2可以直接应用于SSM模型,而MLDv1则需要MLD SSM Mapping技术的支持才可以应用于SSM模型

IPv4、IPv6 组播网络中应用的协议比较

应用的协议比较

什么是嵌入式RP功能

使能了PIM-SM(IPv6)的设备都会默认使能嵌入式RP功能,当设备收到组播报文后,直接从IPv6组播地址中解析出RP地址,而无需再预先知道RP的信息,从而取代静态配置RP或由BSR动态计算的RP使用嵌入式RP的组播组地址范围是FF7x::/16和FFFx::/16

IPv6组播地址与MAC地址映射

组播IPv6报文的目的IP地址是组播IPv6地址,而目的MAC地址则必须是组播MAC地址,并且该地址必须与组播IPv6地址对应。33-33是专门为IPv6组播预留的MAC地址前缀MAC地址的后32bit从对应的组播IPv6地址的后32bit拷贝而来,IPv6地址映射会丢失更多的信息,所以IPv6中会有更多的组地址用同一个MAC地址FF00::/8是IPV6组播地址前缀
如图,IPv6组播地址FF01::1111:1的MAC地址映射
IPv6组播地址与MAC地址映射

补充

组播特点

优势

  • 提高效率:降低网络流量、减轻硬件负荷
  • 优化性能:减少冗余流量、节约网络带宽、降低网络负载
  • 分布式应用:使多点应用成为可能

劣势

  • 组播是基于UDP的
    • 尽力而为
    • 没有拥塞避免机制
    • 报文重复
    • 报文失序

应用

  • 多媒体
  • 培训、联合作业场合的通信
  • 数据仓库、金融应用(股票)
  • 任何的“单到多”数据发布应用

追问

为什么需要组播

可以降低网络流量,减轻服务器负担,减少冗余流量,节约带宽,可以点对多点