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

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

基本概念

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 v1 IGMP v2 IGMPv3
查询器选举 依靠上层路由协议 自己选举 自己选举
离开方式 默默离开 主动发出离开报文 主动发出离开报文
指定组查询
接收组内指定源

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

组播路由协议的类型主要有两种:密集模式(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。