组播相对单播和广播有如下优势: 相比单播,由于被传递的信息在距信息源尽可能远的网络节点才开始被复制和分发,所以用户的增加不会导致信息源负载的加重以及网络资源消耗的显著增加。相比广播,由于被传递的信息只会发送给需要该信息的接收者,所以不会造成网络资源的浪费,并能提高信息传输的安全性。 组播(Multicast)可以很好的解决点到多点的数据传输。IP 组播技术在 ISP 提供的互联网信息服务中已经得到了应用。例如:在线直播、网络电视、远程教育、远程医疗、网络电台和实时视/音频会议等。
永久组地址:224.0.0.0--224.0.0.255
ASM组地址:224.0.1.0--231.255.255.255、233.0.0.0--238.255.255.255
SSM组地址:232.0.0.0--232.255.255.255
常见的永久组地址
224.0.0.1 所有节点 224.0.0.2 所有路由器 224.0.0.5 OSPF 224.0.0.6 OSPF(DR/BDR) 224.0.0.9 RIP 224.0.0.13 PIM 224.0.0.18 VRRP 224.0.0.22 IGMPV3
ASM 模型仅针对组地址提供组播分发。一个组播组地址作为一个网络服务的集合,任何源发布到该组地址的数据得到同样的服务。接收者主机加入组播组以后可以接收到任意源发送到该组的数据。ASM 模型要求组地址必须整个组播网络中唯一。“唯一”指的是同一时刻一个ASM 地址只能被一种组播应用使用。如果有两种不同的应用程序不能使用同一个 ASM 组地址发送数据。
SSM 模型针对特定源和组的绑定数据流提供服务,接收者主机在加入组播组时, 可以指定只接收哪些源的数据或指定拒绝接收来自哪些源的数据。加入组播组以后, 主机只会收到指定源发送到该组的数据。SSM 模型对组地址不再要求全网唯一,只需要每个组播源保持唯一。这里的“唯一”指的是同一个源上不同的组播应用必须使用不同的 SSM 地址来区分。不同的源之间可以使用相同的组地址。
组播地址不能配置给主机使用。
二层组播地址和三层组播地址的映射: IANA 规定,IPv4 组播 MAC 地址的高 24 位为 0x01005e,第 25 位为 0,低 23 位为 IPv4 组播地址的低 23 位,映射关系如下图所示。例如组播组地址 224.0.1.1 对应的组播 MAC 地址为 01-00-5e-00-01-01。IPv4 组播地址的前 4 位是固定的 1110, 对应组播 MAC 地址的高 25 位,后 28 位中只有 23 位被映射到 MAC 地址,因此丢失了5 位的地址信息,直接结果是有 32 个 IPv4 组播地址映射到同一 MAC 地址上。
IPv6 组播 MAC 地址的高 16 位为 0x3333,低 32 位为 IPv6 组播地址的低 32 位。下图是 IPv6 组播地址 FF01::1111:1 的 MAC 地址映射举例。
IGMP 用来在接收者主机和与其直接相邻的组播路由器之间建立和维护组播组成员关系。IGMP 通过在接收者主机和组播路由器之间交互 IGMP 报文实现组成员管理功能,IGMP 报文封装在 IP 报文中,协议号是2
一、普遍组查询和响应机制
通过普遍组查询和响应,IGMP查询器可以了解到该网段内哪些组播组存在成员。
过程如下:
二、新组成员加入机制
过程如下:
三、成员离组机制
IGMPv1没有专门定义离开组的报文。主机离开组播组后,便不会再对普遍组查询报文做出回应。
普通组查询是查询器发送的。
IGMPV1 的查询器是由组播路由协议 PIM 选举出唯一的组播信息转发者(Assert Winner 或 DR)。
普遍组查询报文缺省是每 60 秒发一次。报文的目的 IP 是 224.0.0.1。
成员抑制功能是为了减少网络中的流量。MRT 的最大值为 10S,无法灵活控制接收者对查询报文响应的速度。
主机离组不会发送任何报文,静悄悄离开。
IGMPV2 中,查询器为 IP 地址小的设备。默认是 125 秒备查询器能够感知到主查询器消失。
MRT 可以配置。IGMPV2 新增了离组报文和特定组查询报文。特定组查询报文每秒发一次,共发两次。这样做可以迅速确定还有没有同组的其它接收者。
IGMPV2 有普遍组查询报文,报文目的 IP 为 224.0.0.1
报告报文,目的 IP 为要加入的组地址
离组报文,报文的目的 IP 是 224.0.0.2
特定组查询报文,目的 IP 为要查询的组地址
路由器上记录了最后一次发送报告报文的主机,该主机就是 last repoter。在该组中,只有 last repoter 要离组时才会向路由器发送离组报文,同组的其它接收者离组时不发送离组报文,也是为了减少网络中的流量。
在具体实现中,如果主机没有足够的资源来记录谁是 last repoter,它在离组时还是会发送离组报文。eNSP 上看到就是这样的效果。有 laste report 机制, 成员抑制功能还存在,它们之间不相互影响。
IGMPv1 的查询器如果发生故障,另一个组播路由器需要 105 秒才能成为新的查询器。由于 IGMPv1 的查询器是靠 PIM 来选取的,PIM 的邻居关系 hold time 为105 秒。
运行了 IGMPv1 的接口一定要开启 PIM 协议才能正常工作。
如果主机是组播组的最后一个成员,但是由于主机掉电,无法发送离开报文时,组播路由器会等待组成员关系定时器超时,也就是最长会等 130 秒后,删除组成员关系。
IGMPv3 有普遍组查询报文、特定源组查询报文、特定组查询报文、成员报告报文。
取消了离组报文,可以使用加入的组播组为空的报告报文来实现离组。
主机在接收组播数据的时候可以选择组播源。
IGMPv3 组记录的格式包括:组记录的类型。共分为三大类。 一、当前状态报告,用于对查询报文进行响应,通告自己目前的状态,共两种:
二、过滤模式改变报告,当组和源的关系在 INCLUDE 和 EXCLUDE 之间切换时,会通告过滤模式发生变化,共两种:
三、源列表改变报告,当指定源发生改变时,会通告源列表发生变化,共两种:
IGMPv3 取消了成员抑制功能,原因如下: 出于统计的目的,路由器可能需要跟踪每个接收主机的状态,所以不能抑制主机发送报告报文。 交换机开启了 IGMP Snooping 后,交换机不会向其它端口转发成员报告报文,所以无法实现抑制功能。 取消成员抑制功能主机需要处理的信息更少,可以简化状态机的实现。 在 V1 和 V2 版本中,一条报告消息只携带一个组记录,可以很好的实现抑制功能,而 V3 中一条报告消息里携带了多个组记录,无法针对某个组进行抑制。
IPv6 使用 MLD 协议实现。组播侦听者发现协议 MLD(Multicast Listener Discovery)是负责 IPv6 组播成员管理的协议,用来在 IPv6 成员主机和与其直接相邻的组播路由器之间建立和维护组播组成员关系。
到目前为止,MLD 有两个版本:MLDv1 版本对应 IGMPv2,MLDv2 版本对应 IGMPv3。
它是通过 ICMPv6 报文实现的。MLDv1 查询报文的目的 IP 是 FF02::1,特定组查询和报告报文的目的 IP 是要加入的组地址,离组报文的目的 IP 为 FF02::2。 MLDv2 的查询报文的目的 IP 为 FF02::1,报告报文的目的 IP 为 FF02::16。
当 Router 将组播报文转发至 Switch 以后,Switch 负责将组播报文转发给组播用户。由于组播报文的目的地址为组播组地址,在二层设备上是学习不到这一类MAC 表项的,因此组播报文就会在所有接口进行广播,和它在同一广播域内的组播成员和非组播成员都能收到组播报文。这样不但浪费了网络带宽,而且影响了网络信息安全。
IGMP Snooping是二层组播的基本功能,可以实现组播数据在数据链路层的转发和控制。当主机和上游三层设备之间传递的IGMP协议报文通过二层组播设备时,IGMP Snooping分析报文携带的信息,根据这些信息建立和维护二层组播转发表,从而指导组播数据在数据链路层按需转发。
端口角色包括:路由器端口和成员端口。 路由端口可以手工配置,或者收到源地址不为 0.0.0.0 的 IGMP 普遍组查询报文或 PIM Hello 报文(三层组播设备的 PIM 接口向外发送的用于发现并维持邻居关系的报文)的接口动态生成。 成员端口可以手工配置或者根据收到成员报告报文的接口动态生成。
收到查询查询器发的普遍组查询报文会向 VLAN 内除接收接口外的其他所有接口转发
收到成员报告报文后,交换机根据报文的组地址构建或刷新二层组播表项, 同时向路由器端口转发,确保路由器收到报告报文。不需要向其它成员端口转发, 如果转发至其它成员端口,相应的接收者收到报告报文后,同组抑制功能会使接收者不再发送报告报文,从而无法正确构建二层组播转发表项。
收到 leave 报文,如果二层交换机不存在该组对应的转发表项,或者该组对应转发表项的出接口列表中不包含接收接口,二层交换机不转发该报文,将其直接丢弃。否则,二层交换机会向路由器端口转发报文。
收到特定组查询报文后向有特定组成同的端口转发。
开启 snooping 功能后无法进行成员抑制。
消耗交换机性能指的是交换机要用更多的资源去读取 IGMP 报文,构建二层组播转发表项。
对查询器没有影响。 开启 snooping 功能后,交换机收到组播流量后,不是按照传统的 MAC 地址表转发的。是按照二层组播转发表项(组播 MAC 地址表或者组播 IP 地址)来转发组播数据的。
二者的作用不同:IGMP Snooping 的使用是为了减轻组播数据在二层交换泛洪带来的压力,IGMP Snooping proxy 而为了减少用户主机所在网段内的 IGMP 协议报文数量,使交换机其能够代理上游三层设备向下游主机发送 IGMP 查询报文,同时代理下游主机来向上游三层设备发送成员关系报告报文。对接收者来说,它相当于查询器,对查询器来说它相当于接收者。
开启了 IGMP Snooping proxy 后,交换机收到普查报文除了向本 VLAN 内除接收接口以外的所有接口发送 IGMP 普遍组查询报文外,还会根据本地维护的组成员关系向所有路由器端口发送报告报文。
收到报告报文,若不存在该组对应的转发表项,则创建转发表项,然后路由器端口发送该组的报告报文;若已存在该组对应的转发表项,则重置其老化定时器;若已存在该组对应的转发表项,但其出接口列表中不包含该接收接口,则将该接口作为动态成员端口添加到出接口列表中,并启动其老化定时器。
收到离组报文,向接收接口发送针对该组的特定组查询报文。只有当删除某组播组对应转发表项中的最后一个成员端口时,才会向所有路由器端口发送该组的离开报文。
收到特定组查询报文直接丢弃。当交换机下某个组最后一个接收者离开后,交换机会删除相应的转发表项,然后向路由器端口发送该组的离开报文,此时路由器才会发送特定组查询报文,这时交换机已经没有任何关于该组的接收者,所以它直接丢弃该特定组查询报文。
设备根据 IP 头的协议号来判断,如果协议号为 2,说明里面封装的是 IGMP 报文。
SSM(Source-Specific Multicast)称为指定源组播,要求路由器能了解成员主机加入组播组时所指定的组播源。如果成员主机上运行 IGMPv3,可以在 IGMPv3
报告报文中直接指定组播源地址。但是某些情况下,成员主机只能运行 IGMPv1 或IGMPv2,为了使其也能够使用 SSM 服务,路由器上需要提供 IGMP SSM Mapping 功能2、实现机制:通过在路由器上静态配置SSM 地址的映射规则,将IGMPv1 和IGMPv2报告报文中的(*, G)信息转化为对应的(G, INCLUDE, (S1, S2...))信息,以提供SSM 组播服务。
不支持
ASM 模型: ASM 模型仅针对组地址提供组播分发。一个组播组地址作为一个网络服务的集合,任何源发布到该组地址的数据得到同样的服务。接收者主机加入组播组以后可以接收到任意源发送到该组的数据。 ASM 模型要求组地址必须整个组播网络中唯一。“唯一”指的是同一时刻一个ASM 地址只能被一种组播应用使用。如果有两种不同的应用程序不能使用同一个 ASM 组地址发送数据 SSM 模型: SSM 模型针对特定源和组的绑定数据流提供服务,接收者主机在加入组播组时, 可以指定只接收哪些源的数据或指定拒绝接收来自哪些源的数据。加入组播组以后, 主机只会收到指定源发送到该组的数据。 SSM 模型对组地址不再要求全网唯一,只需要每个组播源保持唯一。这里的“唯一”指的是同一个源上不同的组播应用必须使用不同的 SSM 地址来区分。不同的源之间可以使用相同的组地址。
PIM(Protocol Independent Multicast)称为协议无关组播。这里的协议无关指的是与单播路由协议无关,即 PIM 不需要维护专门的单播路由信息。作为组播路由解决方案,它直接利用单播路由表的路由信息,对组播报文执行 RPF(Reverse Path Forwarding,逆向路径转发)检查,检查通过后创建组播路由表项,从而转发组播报文
使用 PIM 协议构建组播转发表,转发组播数据。
Hello 报文的作用:发现 PIM 邻居、协调各项 PIM 协议报文参数、维持邻居关系。
默认 30 秒发一次,目的 IP 为 224.0.0.13。
当 PIM-DM 网络中出现活跃的组播源之后,组播源发送的组播报文将在全网内扩散。
当叶子路由器发现下游有接收者要加入某个组的时候,它就会向上游发送嫁接报文。
剪枝不一定是向上游剪枝,在剪枝的场景中就不是向上游剪枝。
当 PIM 路由器接收到组播报文后,RPF 检查通过,如果下游网段没有组播报文需求,也就是没有接收者,它就会向上游发送剪枝报文。
由于断言的loser 端口不能确定本网段是否还有其它设备需要接收组播数据, 所以它会试图去剪枝 winner 的下游接口。
路由器收到一份组播报文后,会根据报文的源地址通过单播路由表查找到达“报文源”的路由,查看到“报文源”的路由表项的出接口是否与收到组播报文的入接口一致。如果一致,则认为该组播报文从正确的接口到达,从而保证了整个转发路径的正确性和唯一性。这个过程就被称为 RPF 检查。RPF 的作用是防止组播数据出现环路和次优。
检查依据:除单播路由外,MBGP 路由、组播静态路由也是 RPF 检查的依据。
最长掩码匹配默认不开启。
静态组播路由的配置命令:ip rpf-route-static 10.1.8.0 255.255.255.0 (路由) 10.1.13.2(下一跳)
MP-BGP 是对 BGP-4 进行了扩展,来达到在不同网络中应用的目的,BGP-4 原有的消息机制和路由机制并没有改变。MP-BGP 在IPv6 单播网络上的应用称为BGP4+, 在 IPv4 组播网络上的应用称为 MBGP(Multicast BGP)。
RPF 可以只靠单播路由表工作,并不是收到每一份组播流量都会进行 RPF 检查。
汇聚点 RP 为网络中一台重要的 PIM 路由器,接收源端 DR 注册信息及组成员加入请求,网络中的所有 PIM 路由器都必须知道 RP 的地址,类似于一个供求信息的汇聚中心。
当网络中有接收者加入某个组的时候,从成员端 DR 就会向 RP 建 RPT 树。
静态 RP:在网络中的所有 PIM 路由器上配置相同的 RP 地址,静态指定 RP 的位置。需要在每台设备上进行配置。命令: static-rp 10.1.1.1 动态 RP:利用 BSR 机制来实现 RP 的动态通告。动态需要配置:c-bsr 和 c-rp. 4、在 PIM 进程下,分别使用命令:C-BSR loopback0,C-RP loopback0
使用 Bootstrap 报文来选择 BSR,Bootstrap 报文中携带 C-BSR 地址、C-BSR 的优先级。每一台 PIM 路由器都收到所有 C-BSR 发出的 Bootstrap 报文,通过比较这些 C-BSR 信息,竞选产生 BSR。竞选规则如下: (1)优先级较高者获胜(优先级数值越大优先级越高)。
(2)如果优先级相同,IP 地址较大者获胜。
Bootstrap 报文 60 秒发送一次。目的 IP 为 224.0.0.13,向所有 PIM 邻居发送,发送报文的源 IP 为出接口的 IP。
对BSR消息进行RPF校验,查看RPF接口是否是报文的接收接口以及这个BSR消息是否是自己PIM邻居发送过来的。
C-RP 收到 BSR 消息后,会向 BSR 发送 Advertisement 单播注册报文,报文中携带 C-RP 地址、服务的组范围和 C-RP 优先级,消息的目的 IP 为 BSR 的 IP 地址。BSR 将这些信息汇总为 RP-Set,封装在 Bootstrap 报文中,发布给全网的每一台PIM-SM 路由器。
各 PIM 路由器根据 RP-Set,使用相同的规则进行计算和比较,从多个针对特定组的 C-RP 中竞选出该组 RP。规则如下: 与用户加入的组地址匹配的 C-RP 服务的组范围掩码最长者获胜。 如果以上比较结果相同,则 C-RP 优先级较高者获胜(优先级数值越小优先级越高)。 如果以上比较结果都相同,则执行 Hash 函数,计算结果较大者获胜。
如果以上比较结果都相同,则 C-RP 的 IP 地址较大者获胜。
建立 RPT 树向 RP 发送(*,G)Join 报文。根据 RPF 检查确定 RPF 接口和下一跳,下一跳为自己的 RPF 邻居,如果有多个邻居,会向 IP 地址大的邻居发送(,G) Join 报文。
上游收到(*,G)Join 报文,报文中包含 Upstream-neighbor 字段,如果自己接收到报文的 Upstream-neighbor 字段中的IP 地址和自己端口的 IP 相同,说明报文是发给自己的。
RP 上(*,G)表项的上游接口是注册接口
源端 DR 收到组播流量会将组播数据封装成单播注册报文发给 RP。
源端 DR 根据静态配置或者通过接收 BSR 消息判断出谁是 RP。
注册报文是单播的,目的 IP 是 RP 的地址。最里面封装原组播数据,然后封装 PIM 的头部,外面再封装 IP 头,源 IP 为 DR 上与源相连的接口 IP,目的 IP 为 RP 的 IP。
RP 收到注册报文会向源发送(S,G)Join 报文,构建 SPT 树。
当 RP 已经建立了至组播源的 SPT 后,RP 会同时通过 SPT 树和单播的方式收到组播数据,此时它会向源端 DR 发送单播注册停止报文。
当组播源活跃后,第一次发送注册报文,源端 DR 收到注册停止报文后,源端 DR 为了向 RP 通报组播源活跃的信息,会每隔 55 秒向 RP 发送空的注册报文,这时如果 RP 不希望接收组播数据会立即回应注册停止报文。
当组播流量沿着 RPT 树流下的时候会同步创建(S,G)表项,这样的实现是为了在未来需要构建 SPT 树或者剪枝 SPT 时减少建表项的延迟。
成员端 DR 接收到组播数据后会将数据转发给接收者,同时根据条件判断是否进行 SPT 切换。组成员端 DR 周期性检测组播报文的转发速率,一旦发现(S,G) 报文的转发速率超过阈值(默认是 0),则触发 SPT 切换。
如果所有组播数据都经过 RPT 树转发,数据的转发会对 RP 带来很大的负担, 所以要进行 SPT 的切换。
SPT 的切换是由成员端 DR 触发的。
交叉点进行 SPT 切换时上游接口为去往组播的接口。当交叉点从新建的 SPT 树上收到组播数据的时候,开始向 RP 的方向剪枝。剪掉是 RPT 树上(S,G)表项的下游接口。 如果 RP 上的(S,G)表项下游列表为空,RP 会继续向组播源的方向发送剪枝报文。
成员端 DR 静态 RP 配置错误
成员端DR 收到 BSR 消息后 RPF 检查失败,无法计算出 RP
成员端 DR 的 PIM 配置错误没有和邻居路由建立 PIM 邻居造成RPT 建立失败等
如果网络中只有单播路由,如果单播路由不正常会影响 RPT 或 SPT 树建立,就会影响组播的运行。
如果网络中有组播静态或 MBGP 路由,能够正常建立 RPT 或 SPT 树,组播还可以正常工作。
PIM 一共有十种报文,五种单播,五种组播。
IGMPv3 用于组播的 SSM 模型中,目前现网中使用 SSM 的应用较少,所以 IGMPv3 应该也不广泛。
如果网络中的 RP 设备发生故障,其他的路由器需要 150 秒会知道 RP 发生故障, BSR 如果故障,其它 BSR 需要 130 秒会知道 BSR 的故障。
(*,G)prune 报文是发向 RP 的方向,(S,G)prune 报文是发向组播源的方向。
在传统的 PIM-SM 域中,每个组播组都只能映射到一个 RP。当网络负载较大或流量过于集中时,可能导致 RP 压力过大、RP 失效后路由收敛较慢、组播转发路径非最优等问题。
在单自治域中应用基于 PIM 协议的 Anycast RP,可实现组播源就近注册和接收者就近加入。既可以缓解单个 RP 的负担,也实现了 RP 备份、优化组播数据的转发路径
两个 RP 的地址配置为相同不会冲突。成员端 DR 根据路由表会找到离自己最近的RP,源端 DR 也会根据路由表找到离自己最近的 RP。
当 RP 收到源注册消息后,会以单播的方式将收到的注册报文发送给其它 RP,携带组播流量。
如果换成 MSDP 方式实现与基于 PIM 协议实现 AnycastRP 的区别在于它是通过发送 SA 消息传送组播源信息的。