计算机网络课程总结 -- 组播基础

组播是介于单播和广播间的一种通信方式,单播是单台源机和单台目的机的通信,广播是单台源机和网络中所有其他主机的通信。而组播则是单台源机和网络中部分主机的通信。本文主要介绍组播中的一些基本概念。

基本概念

IP 组播是指在 IP 网络中将数据包以尽力传送(best-effort)的形式发送到网络中的某个确定节点子集,这个子集称为一个组播组

组播传输时,源主机只发送一份数据,这份数据的目的地址为组播组地址

组播组中的所有成员都可接收到同样的数据拷贝(通过路由器进行复制分发),并且只有组播组内的主机(成员,目标主机)可以接收该数据。

从上图可知,由于每个分支只发送一份报文,所以网络规模(如用户数量)的增大不会额外增加网络的负担

故组播的优势为 1)降低了骨干上的网络流量 2)降低了应用服务器的负担

但是组播也存在着以下缺点: 1)传送不可靠!(尽力投递 /best effort) 2)组播报文的复制开销使得路由器的资源消耗增加! 3)可控可管性差,用户管理困难,存在安全问题(用户可随意加入某个组,无须密码) ## 组播地址 组播组用 D 类 IP 地址标识,以 1110 开头。组播范围为 224.0.0.0~239.255.255.255

各个地址范围段及其含义如下

地址范围含义
224.0.0.0224.0.0.255预留的组播地址(永久组地址),地址 224.0.0.0 保留不做分配,其它地址供路由协议使用
224.0.1.0224.0.1.255公用组播地址,可以用于 Internet
224.0.2.0238.255.255.255用户可用的组播地址(临时组地址),全网范围内有效
239.0.0.0239.255.255.255本地管理组播地址,也称私人组播地址空间,仅在特定的本地范围内有效

几个常用的组播地址及其含义如下所示

地址含义
224.0.0.1子网上所有主机 (包括路由器)
224.0.0.2子网上所有路由器
224.0.0.5所有 ospf 路由器
224.2.0.0-224.2.255.255多媒体会议呼叫

除了 IP 地址,组播中的 mac 地址也有特殊的规定,一个组播 mac 地址通过映射对应一个组播 ip 地址,其映射规则为:将 IP 组播地址的低 23 位代替以太网地址 01.00.5e.00.00.00(16 进制) 中的低 23 位。,也就是说组播的 mac 地址一定会以 01:00:5e 开头。

这种映射方式可能会带来不同的组播 IP 地址映射成相同的 mac 地址,给定一个组播 IP 地址,还有几个组播 IP 地址映射成的 mac 地址与其相同? 除去低位相同的 23 位以及高位的 1110, 还剩下 5 位,因此还有 2^5-1=31 个地址会与给定的组播 IP 地址映射成相同的 mac 地址,也就是说有 32:1 的组播 IP 地址的 mac 地址重叠。

组播转发树

组播转发树指的是数据从源主机到接受者的传输路径。组播转发树主要有两类:有源树 (SPT) 和共享树 (RPT)

有源树 有源树中源主机构成了源树的根,数据传输的路径构成了有源树的分支,有源树又称为生成树或最短路径树 (沿着最短路径传输)。下图中箭头便是有源树

共享树 共享树是各个组播组共享的传输路径,如下图所示

有源树和共享树均是无回路的树,且均在分支处复制数据包,但是有源树能够提供一个最优的路径,而共享树路径可能不是最优的,相应的代价是有源树会占用较多的内存。

组播路由

组播路由和单播路由是相反的,单播路由关心数据报文要到哪里去,组播路由关心数据报文从哪里来。

组播路由使用 “反向路径转发” 机制 (RPF, Reverse Path Forwarding),它是 IP 组播转发过程的基础,几乎所有的 IP 组播路由协议都利用 RPF 作为决定是否转发或丢弃从某个接口上接收到的组播信息包。

RPF 的具体机制是路由器收到组播数据报文后,只有确认这个数据报文是从自己到源的出接口(单播)上到来的,才进行转发,否则丢弃报文。实际上就是在路由器中查询到组播报文源地址的路由,假如该路由的出口就是组播报文的入口,RPF 检查成功,转发数据包,否则丢弃数据包。

如下为 RPF 的具体例子 RPF 检查失败 RPF 检查成功

TTL 阈值 IP 组播包被路由器转发的时候,IP 头中的 TTL 值要减 1;路由器在传输的时候可以在每个接口设置一个 TTL 阈值,只有数据包的 TTL 值大于或等于接口的 TTL 阈值时,路由器才能在出接口转发该数据包。这个机制的目的是为了限制组播的范围。如下图所示

组播协议

组播协议分为主机与路由器之间的组成员关系协议和路由器与路由器之间的组播路由协议。

组成员管理协议(主机 - 路由器)

IGMP(internet group management protocol)是 IP 协议簇中负责 IP 组播组成员管理的协议,用来在 IP 主机和与其直接相邻的组播路由器之间建立、维护组播组成员关系,所有参与组播的主机必须支持 IGMP 协议。

注意,IGMP 不包括 组播路由器之间的组成员关系信息的传播与维护,这部分工作由各组播路由协议完成。

IGMP 作为 TCP/IP 第三层的协议,被封装在 IP 数据包中进行传输。其报文格式如下所示

IGMP 协议有三个版本,各个版本的功能和区别如下:

  • IGMP v1:提供成员关系查询 / 成员关系报告两个基本功能。
  • IGMP v2:增加了查询器选择 / 特定组查询 / 离开组消息及最大响应时间字段等扩展功能。
  • IGMP v3:增加了对特定 (源,组) 的加入离开的支持,以提供对组播应用更好的支持

IGMP v1

IGMP v1 的报文格式如下所示

上面的报文中,类型字段有两种取值: 1:成员关系查询 (路由器发出) 2:成员关系报告 (主机发出)

组地址只有在成员关系报告时才填入,注意这个地址不是发送 IGMP 数据包时用于寻址的地址,用于寻址的地址在 IP 报头中。

查询报文是周期性发送的,默认为 60s 一次,过程如下所示

上图出现了报告抑制的情况,这个机制主要是为了使得当前子网中对于每个组只需有一个成员响应成员关系查询,在上图中 H1 和 H2 属于同一组的,因此只需要一个成员响应成员报告。

报告抑制的步骤如下 1) 主机收到 IGMP 成员关系查询后,主机对已经加入的每个组播组启动一个倒数计时器,计时器初始化为一个给定时间(在 IGMPv1 中为固定值 10S)范围内的随机值。 2) 当计时器计时值为 0 时,主机发送成员关系报告至与该计时器相关的组播组,以通知路由器本地网中有处于活动状态组播组接收者 3) 主机在它的倒数计时器达到 0 之前收到其他主机发送的某一成员关系报告,那么它就停止与这个组播组相关的倒数计时器的计时,这样就抑制了主机到这一组播组的成员关系报告

加入组播组:主机并不等待来自路由器的下一次成员关系查询,可主动向要加入的组播组发送成员关系报告表示加入 离开组播组:IGMPv1 中没有定义离开机制,主机在任何时候可以默默地离开

为了避免这种默默离开的机制导致路由器给一个空的组播组发送数据包,路由器设置组播组关联定时器(一般为 3 倍查询周期,3min),超时无组成员报告,则停止转发。

IGMP v2

IGMP v2 与 IGMP v1 的最大区别为: 1)支持特定组查询 2)通过离开消息允许主机主动汇报他们的离开

IGMP v2 的报文如下所示:

上面的报文类型有以下四种:

  • 0x11:成员关系查询(与 IGMP v1 兼容)
  • 0x12:IGMPv1 成员关系报告
  • 0x16:IGMPv2 成员关系报告
  • 0x17:离开组(组播地址段为目标组播组地址)

而成员关系查询消息又分为两类 1)普通查询(组播地址段为零) 2)特定组查询:直接对单个组查询(组播地址段为正在查询的组播组地址)

在 IGMP v2 中组成员的离开并不是默默离开了,而是会主动发送离开的消息,然后路由器会进行特定组的查询已确认这个离开的主机是不是这个组播组最后的一个成员,有响应报文说明还有其他成员,否则这个成员就是最后的成员。

上面的成员查询报文由查询路由器发出。在 IGMP v1 中没有正式的选举规定,它依赖于路由协议,IGMP v2 协议声明了正式的查询路由器选举过程: 1)多访问网络上的每个路由器假设自己为查询器并发出查询 2)IP 地址低(接口)的路由器被选为查询器 3)非查询路由器设置定时器,当超时没有收到查询器的周期查询,认为查询器出事了,重新选举

当 IGMP v1 和 IGMP v2 混杂在一个子网的时候,两种协议的交互需要遵循某种规则,这些规则都是因为 IGMP v1 并不能识别 IGMP v2 的报文。如

IGMPv2 主机与 IGMPv1 路由器交互时,有以下规则: 1)IGMPv1 路由器把 v2 报告看作无效的信息并且忽略它 2)当 V1 路由器作为查询路由器时,V2 的主机必须发送 V1 成员报告。

IGMPv2 路由器与 IGMPv1 主机交互时,有以下规则: 1) V2 路由器的查询可被 V1 的主机所处理,只是忽略第二个八位组的信息,就是忽略特定组的查询,全认为是普通查询。 2)v2 路由器必须忽略离开报告,否则后果很严重!因为 v2 路由器收到离开报文后会发出的特定查询,而特定组查询并不被 v1 主机理会,此时假如剩下的全是 IGMP v1 的主机,IGMP v2 的路由器收不到响应报文,会认为组播组没有成员从而不再发送数据到这个组播组。

基于上面的原因,同一网段上的所有路由器必须运行同一版本的 IGMP 协议。缺省为 V2。但是假如网段上存在其它 IGMP v1 路由器,所有的路由器必须手工配置为运行 IGMP v1

IGMP v3

IGMP v3 与 IGMP v2 的最大区别是允许主机只收到组播组内某个特定信源的传输,如下图所示

三个版本的 IGMP 协议比较如下

协议版本IGMP v1IGMP v2IGMPv3
查询器选举依靠上层路由协议自己选举自己选举
离开方式默默离开主动发出离开报文主动发出离开报文
指定组查询
接收组内指定源

路由协议(路由器 - 路由器)

组播路由协议的类型主要有两种:密集模式(Dense-mode)和稀疏模式(Sparse-mode)

  • 密集模式(Dense-mode) 1)使用 “推”(Push)模型 2)组播数据在整个网络的泛滥(Flood) 3)下游不想接收的话则剪枝(Prune) 4)泛滥、剪枝、泛滥、剪枝… 周而复始 (通常 3 分钟折腾一次)

  • 稀疏模式(Sparse-mode) 1)使用 “拉”(Pull)模型 2)组播数据只发送到有需要的地方 3)有显式的加入(Join)过程

目前主要有 4 种具体的组播路由协议 DVMRP,MOSPF,PIM-DM,PIM-SM。

DVMRP 是第一个组播路由协议,一个较为古老,具有实验性质的协议,现已经不常使用。属于密集模式协议。

DVMRP 基于基于距离矢量,类似于 RIP,最大不能超过 32 跳,不支持共享树,不适合于大规模的网络。

MOSPF 是对 OSPF 单播路由协议的扩展,在 OSPF 链路状态通告中包含组播信息,以此构建组播分发树。MOSOF 与单播路由协议相关,仅在 OSPF 网络内运行,适合在单路由域中使用。不支持共享树,且支持的厂家较少,市场鲜有使用。

目前最常用的组播协议是 PIM(Protocol Independent Multicast,协议无关组播)。PIM 有以下特点: 1)独立于单播协议,也就是支持所有的单播协议 2)扩散和剪枝机制 3)无类

PIM 又分为 PIM-DIM 和 PIM-SM 两种模式,对应于密集型和稀疏型的 PIM。

PIM-DM

该协议用 PUSH 方式,将组播流量周期性扩散到网络中所有设备,建立和维护 SPT (short path tree) (假设所有主机都需要接收组播数据)。

主要步骤为以下三个: 1)周期性扩散 (泛洪,Flood):为每个路由器创建 (S,G) 2)剪枝 (Prune):除去不需要组播数据的路径 3)嫁接 (Graft):迅速得到数据,而不用到下一周期

泛洪和剪枝的过程如下所示

满足以下任一条件即可发送剪枝消息 1)信息到达 PIM-DM 路由器的非 RPF 点对点接口; 2)PIM-DM 路由器没有下游邻居,且所有叶网络上没有组成员; 3)PIM-DM 路由器接口上所有的下游邻居已经通过了剪枝表决

嫁接的目的是为了能够迅速得到数据,从而不用等到下一次的泛洪。过程如下图所示

PIM-DM 中还有一种断言(Assert)机制。目的是为了避免出现组播流量重复和多份,如下图所示,BCD 都会收到重复的数据

为了避免这种情况,断言机制过程如下 1)当路由器从其组播 “出接口列表”(oiflist) 中的某个接口收到与其发送的组播数据相同的数据 2)路由器发送 “PIM Assert” 消息 3)计算 distance 和 metric 值,谁到源的路由最优谁获胜;如果 distance 和 metric 相等,IP 地址大的获胜,输的就停止转发 (剪枝接口)

对于上图运行断言机制后,假如 C 获胜,那么情况如下

原因是 B 经 Assert 断言成了 loser 之后,将自己的 loser 接口设为剪枝状态,并向 winner C 发送剪枝消息,D 的 RPF 接口也会收到该剪枝消息,发出 join 消息,否决。

PIM-DM 的优点为 1)易于配置 2)实现机制简单(泛滥剪枝)

缺点为 1)泛滥剪枝过程不够高效 2)复杂的 Assert 机制 3)控制和数据平面混合:导致网络内部的所有路由器上都有 (S, G),可能会导致非确定性的拓扑行为 4)不支持共享树

PIM-DM 适用于 1)小规模的网络 2)组播源和接收者比较靠近 3)源少,接收者多 4)数据流大且稳定

PIM-SM

PIM-SM 协议假设没有主机需要接收组播数据,除非它们明确地发出了请求

稀疏组播的特点为 1)组成员所在的网络数相对少 2)组成员跨越的区域太大 3)带宽资源还没有富裕到可以忽略 DM 模式带来的消耗

在 PIM-SM 中有个重要的概念:汇聚点,RP (Rendezvous Point),发送者和接收者在 RP 处进行汇聚,表现为 1)发送者的第一跳路由器把发送者注册到 RP 上(报个到,挂个号) 2)接收者的 DR(直连网络上的负责人)为接收者加入到共享树 (树根在 RP)

接收者加入或离开组播组的行为表现为 1) 加入: 接收者发送加入消息,逐跳上行到 RP,沿途路由器记录组播转发状态; 2) 离开: 接收者不想要组播数据时,发送剪枝消息,逐跳上行到 RP,沿途路由器更新它的转发状态

从上面接收者离开或加入的行为可以看出 SM 跟 DM 本质的差别:路由器转发状态通过组播消息的抵达而建立或更新

上面的过程中有几个关键问题, (1)如何知道 RP (RP 发现)? (2)如何让源组播数据到达 RP? (3)能否在接收者和源之间建立一个转发树,分担 RP 的负担?

针对问题(1),采用自举路由器机制 (BSR) 来选出 RP,通常通过人工配置,将一组路由器配置为候选自举路由器 (C-BSR),另一组路由器配置为候选汇集点(C-RP),通常建议这两组路由器是同样的路由器。C-RP 会定期把候选汇集点通告消息(C-RP-Advs)以单址的形式发送到 C-BSR;汇集点通告消息是一种 PIM 消息,它包括通告 C-RP 的地址、可选的组播组地址和一个掩码长度域(说明组的前缀);C-BSR 收集这些通告消息并产生相应的自举报文,自举报文也是一种 PIM 消息,它包括 C-RP 和相应的组前缀并由自举路由器以一跳一跳的形式发送到所有普通路由器。普通路由器通过接收自举报文便可知道 C-RP 的地址。

针对问题(2),采用了源注册的机制,过程如下;

1)源的 DR (执行注册的源第一跳路由器) 将组播数据封装进一个注册消息,单播到 RP; 2)RP 打开注册消息,将组播数据在 RPT 上转发,发送 (S,G) 加入消息,沿途建立 (S,G) 状态 3)当 RP 察觉到从源到 RP 的 SPT 树已经建立,RP 发送 “注册停止” 消息给源

上面的过程图示如下所示;

需要注意的是当源的 SPT 建立起来后,源的 DR 不会马上停止注册,而是等待收到 RP 的注册停止消息后才会停止,这时候空注册消息和沿着 SPT 的组播数据流并存。

在通过组播传输数据的时候,数据的传输方向为 源→SPT→RP→RPT,如下图所示

从上面的传播路径可知,RP 可能会成为瓶颈,针对这个问题,也就是问题(3),提出了 SPT 切换的方法,其过程如下

上面中 SPT 切换的条件为:最后一跳路由器(和接收者直连的路由器)一旦发现某个特定的组播源的数据量超出了某个界限 (阈值),马上向组播源发送(S,G)Join 消息。

共享树剪枝的条件为:最后一跳路由器根据自己的状态表中的(*,G)和(S,G)的入接口情况来判断是否发送剪枝消息(剪共享树),触发条件是:在(S,G)的入接口上收到了相符合的组播数据 (源树已经建立)

PIM-SM 对于稀疏和密集应用都很高效,其优势为

  • 数据流仅沿 “加入” 的分支向下发送
  • 可以根据流量等条件动态地切换到源树
  • 与具体的单播路由协议无关
  • 域间组播路由的基础 (和 MBGP、MSDP 共同结合使用可以完成跨域的组播)

PIM-SM 适用于 1)大规模的企业网络 2)接收者稀少 3)几乎是任何网络的优选方案(目前 PIM-SM 占主流)

源特定组播 (SSM)

源特定组播(SSM:Source Specific Multicast)是一种区别于传统组播的新的业务模型,它使用组播组地址和组播源地址同时来标识一个组播会话,而不是像传统的组播服务那样只使用组播组地址来标识一个组播会话,由于源地址的加入,组地址在不同源地址之间可以重用。

SSM 保留了传统 PIM-SM 模式中的主机显示加入组播组的高效性,但是没有 PIM-SM 模式中的共享树和 RP 的概念,SSM 直接建立由 (S,G) 标识的一个有源树,

在 SSM 中,主机主动发起对指定 (S,G) 的加入,由最后一跳路由器直接向源发送(S,G)加入消息。

ipv6 组播

ipv6 的组播与 ipv4 的组播非常类似,这里做简单介绍。

ipv6 的组播地址规定前 8 位均为 1, 也就是以 ff 开头,其他部分含义如下所示:

  • Flags: 用来表示 permanent 或 transient 组播组

  • Scope: 表示组播组的范围 >0:预留 1:节点本地范围 2:链路本地范围 5:站点本地范围

  • Group ID: 组播组 ID

ipv6 中一些众所周知的组播地址以及与 ipv4 的对应关系如下:

ipv6 组播中的 mac 地址也是通过映射来的,映射规则为 33:33:+IPv6组播地址的后32位。同样也存在 mac 重复问题。

ipv6 的组播协议也分为组管理协议和路由协议。组成员管理协议为 MLD(Multicast listener Discovery,侦听发现协议),MLD 几乎全盘继承了 IGMPv2 和 IGMPv3,更名为 MLDv1 和 MLDv2,用在路由器和 ip 主机之间。而路由协议依然是 PIM。