20-Multicast
我们可以为网络选择三种类型的流量:
- 单播;
- 广播;
- 组播;
如果需要将数据,从一个源设备发送到一个终端设备时,使用单播;如果需要将数据,从一个源设备发送给所有其他设备时,使用广播。
如果需要将数据,从一个源设备发送给一组但不是所有设备时,应该使用组播。
组播VS广播VS单播
为什么要使用组播而不是广播或单播呢?让我们来举个例子,假设你要在网络中将一部电影播放给其他人的,看看这时使用单播、广播和组播有什么区别,先看单播:
在上图的小型网络中使用单播播放电影的话,一台服务器为四台终端播放,两台终端在同一网段中,另外两台终端在其他网段中,两个路由器之间的带宽为30Mbit。
给单个终端串流视频需要6Mbps的带宽,给4个终端播放视频意味着需要24Mbps的流量,在使用单播的情况下,每增加一个用户就会需要更多的带宽。如果在右侧H3和H4的网段内出现大量的用户,那么两台路由器之间的30Mbit带宽是无法满足太多设备同时串流的需求的。
从上面的例子能够看出,单播的劣势就是它不可扩展,优势在于配置较为简单。
现在来看广播:
如果我们使用广播来串流视频,那么服务器的负载会小很多,服务器只需要发送一次数据即可。问题在于只有广播域内的用户能够收到,而广播域之外的的其他用户无法收到,比如上图中广播域内的H1和H2可以收到广播的串流,而另一个广播域的H3和H4则无法收到。
最后来看组播:
组播在视频串流这种场景下的效果要好得多,不管有多少台设备需要串流,只需要发送一次数据即可。使用组播不仅可以降低服务器的负载,也能降低对网络带宽的消耗。
使用单薄时,用户越多,对服务器和网络的负载要求越高,而使用单薄的话则没有变化:
既然单播的效率如此之高,互联网中的视频巨头,比如优酷、YouTube用的就是这种方式来给用户服务的吗?并不是,互联网中的组播并未真正部署过,这视频巨头用的依旧是单播,比如CDN,互联网中唯一能用到组播的地方就是IPTV。
组播定义
组播,Multicast,用来将数据发送给一组特定的网络设备或终端,这些设备可以在不同的网段中,这些设备称之为一个组播组。组播在传输时,主机只发送一份数据,这份数据的目的地址为组播组的地址。组播组中的所有成员都可以接收到同样的数据拷贝,这个数据拷贝通过路由器进行复制分发,并且只有组播组内的设备可以接收该数据。由于每个分支只发送一份报文,所以网络规模的增大不会额外增加网络的负担。
组播的优势为:
- 降低网络流量;
- 降低服务器的负载;
组播的不足为:
因为组播只支持UDP,所以所有UDP的缺点它都有,比如因为UDP是尽力投递,不能确保数据一定会发送到所以不可靠,没有拥塞机制,报文可能会错乱等;
组播报文的复制使得路由器的资源消耗增加;
可控性差,用户管理困难,存在安全问题,因为用户可以随意加入某个组播组而无需密码;
组播的使用场景为:
多媒体会议;
任何的‘单点到多点’应用;
金融应用;
远程教学等;
组播地址
组播使用D类IP地址,以1110开头,组播范围为224.0.0.0——239.255.255.255。
各个地址范围段含义如下:
起始地址 | 终止地址 | 描述 |
---|---|---|
224.0.0.0 | 224.0.0.255 | 永久地址组,除了224.0.0.0做保留不分配以外,其他地址提供给路由协议、拓扑查找和协议维护等使用,也就是预先留给那些‘well know’的协议使用,比如OSPF建立邻居使用224.0.0.5和224.0.0.6。 |
224.0.1.0 | 224.0.1.255 | 公用组播地址,可以用于互联网使用。 |
224.0.2.0 | 238.255.255.255 | 用户可用的组播地址,也就是临时地址组,全网范围内有效。 |
239.0.0.0 | 239.255.255.255 | 本地管理组地址,仅在本地管理域内有效,使用本地管理组地址可以灵活定义组播的范围,以实现不同组播域之间的地址隔离,从而有助于在不同组播域内重复使用相同的组播地址而不会引起冲突。 |
几个常用的组播地址如下:
地址 | 含义 |
---|---|
224.0.0.1 | 子网上所有主机,包括路由器。 |
224.0.0.2 | 子网上所有路由器。 |
224.0.0.5 | 所有OSPF路由器 |
224.0.0.6 | OSPF DR路由器 |
224.0.0.9 | RIP-2路由器 |
224.0.0.25 | 所有的交换机 |
224.2.0.0-224.2.255.255 | 多媒体会议呼叫 |
组播MAC地址映射
封装数据的时候,除了有源目的IP地址以外,还要封装源目的MAC地址,上面已经说了组播IP地址的分类,那么如何封装组播的MAC地址呢?MAC地址为48位:
从上图中可以看出,第一个八位组中,有一位保留,用于标识MAC地址是用于组播还是广播,当数据为单播时,这位置0,当数据为广播或组播时,该位置1。在二层也有保留给组播使用的MAC地址段,就是01-00-5E开头的MAC地址段,也就是说组播的MAC地址一定是以01:00:5e开头的。
前三个八位组已经规定好,也就是前24bit已经规定好不能更改了,第25bit规定了必须是0,所以48-24-1=23,也就是说后23bit可以随意使用,前24位成为‘组织唯一标识符’,英文是Organizationally Unique Identifier,简称OUI,会统一为不同的组织\公司分配不同的值,后24bit分配给具体的设备使用。
IP组播长度为32bit,前4bit固定为1110,后面跟着28bit可变的地址,为了将32bit组播IP地址映射成48bit的MAC地址,需要进行以下操作:
将24bit的OUI地址(组织唯一标识符)填充最前面的24bit,也就是说最前面是‘01-00-5E’,第25bit恒定为0,组播MAC地址剩下还有23bit,这个空间由组播IP地址的后23bit填满,32-23=5,也就是下图中组播地址中标红的地方,2的5次方为32,所以也就是说有32个IP地址映射的组播地址是相同的。
用上面的方式进行了组播IP地址——组播MAC地址的映射以后,有一些IP地址的映射相同,具体来说就是有32个组播IP地址映射后的组播MAC地址是相同的,听起来是个大问题,但实际中并不是,因为MAC地址只在链路上使用,相同链路上组播IP地址处于一个区间概率很小,所以映射的组播MAC地址相同的几率也会很小,当然也是有可能映射的组播MAC地址相同,因此设备会假定它所收到的组播报文并不是发给它这个组播组的,设备会将这个组播报文交给IP层去查看组播IP地址,如果IP层判断这个报文并不是发给它这个组播组的,那么这个报文将会被丢弃,这种情况很少发生,所以多一道工序使得效率降低一些也可以接受。
组播分发树
组播分发树用来描述IP组播报文在网络中经过的路径,也就是从源主机到数据接收者的传输路径,组播转发树有两类,有源树和共享树。
有源树
有源树也叫最短路径树,英文为Source or Shortest Path Tree,由组播源到用户之间的最短路径构成。路由器必须为每个组播源保存路由信息,占用内存较多,但路径最优,接收者到多播源是最佳路径,延迟最小。
有源树的根,是组播数据流的来源,有源树的分支形成了通过网络到达接收站点的分布树:
共享树
共享树英文为Shared Tree,以网络上某特定节点为公用根,占用内存较少,路径不一定是最优的,多播流量转发必须先经过RP(Rendezvous Point,汇聚点),引入额外的延迟,对RP的可靠性和处理能力要求很高。
共享树的根不在多播数据流的源头,而位于网络中管理员指定的汇聚点,RP,所有多播源先把多播流发送到RP,再由RP分发到各个接收站点,目标组地址向它的多个源节点共享多播分布树。
组播数据转发
组播路由转发和单播路由转发是相反的:
- 单播路由转发关心数据报文要到哪里去,关心的是终点;
- 组播路由转发关心数据报文从哪里来,关心的是起点;
组播路由转发使用‘返乡路径转发’机制,避免环路。多播数据流从多播路由器入口路由到出口路由转发出去,入口由RPF决定,出口由IGMP和多播路由协议决定。
RPF
基本概念
什么是RPF?英文是Reverse Path Forwarding,也就是反向路径转发,路由器收到组播数据报文后,只有确认这个数据报文是从自己前往源的出接口上收到后,才会进行转发,如果不是则会丢弃报文。上面确认源接口的过程由RPF检查完成,路由器会在单播路由表中查找到组播报文源地址的路由,如果该路由的出接口就是报文的入接口,则RPF成功,否则表示RPF失败。
检测顺序
优先级优先(默认)
如果同时存在单播和组播路由(用于RPF检查的组播路由条目),比较优先级,优先级越小越优;
如果优先级相同,则组播静态>MBGP>单播(默认情况下组播静态优先级为1,MBGP优先级为255,单播路由需要视协议而定);
如果都是单播路由,比较路由的掩码长度,掩码长度越长越优;
如果掩码长度一样,比较下一跳的IP地址,IP地址越大越优;
掩码长度优先
如果同时存在单播和组播路由,比较掩码长度,掩码长度越长越优;
如果掩码长度一样,比较路由协议优先级,优先级越小越优;
如果优先级一样,组播静态>MBGP>单播;
如果都是单播路由,比较下一跳的IP地址,IP地址越大越优;
IGMP协议
协议简介
IGMP协议全称是Internet Group Management Protocol,互联网组管理协议,该协议是TCP/IP协议簇中负责IP组播成员管理的协议,主要用于在IP主机和其直接相邻的组播路由器之间建立,维护组播组成员的关系,它是一个主机和路由器之间的协议。IGMP通过在接收者和组播路由器之间交互IGMP报文实现组成员管理功能,IGMP报文封装在IP报文中。主机通过IGMP协议向路由器报告自己想加入的组,路由器通过IGMP协议查询网上是否还有特定组的成员。
IP组播通信的特点是报文从一个源发出,被转发到一组特定的接收者,但在组播通信模型中,发送者不关注接收者的位置信息,只是将数据发送到约定的目的组播地址,要使组播报文最终能够到达接收者,需要某种机制,这种机制使得接收者所在的路由器能够知道该网段存在哪些组播接收者,同时保证接收者可以加入相应的组播中。IGMP就是用来在接收者主机和它(接收者主机)所在网段连接的路由器之间,建立、维护组播组成员关系的协议。组播路由器通过IGMP协议了解每个接口连接的网段上是否存在组播接收者,也就是组成员。如果存在组成员,组播路由器会把组播数据包转发到这个网段,如果没有成员则停止转发。
协议版本
IGMPV1中定义了基本的组成员查询和报告过程,IGMPV2在此基础上添加了查询器选举和成员离开的机制,IGMPV2版本是目前使用的协议,IGMPV3中增加的主要功能是成员可以指定接收或指定不接收某些组播源的报文。三个版本在演进过程中对报文的处理是向前兼容的,也就是说高版本可以兼容低版本的报文。
基本原理
IGMP采用路由器查询、主机报告两种方式维持组员关系:
路由器查询:路由器周期性的,每六十秒发送查询(目的为224.0.0.1,TTL=1)试图发现感兴趣的组员,主机每次都会回复路由器的查询;
主机报告:主机主动发送一个IGMP报告(目的为组播组地址,TTL=1)表示要加入某个组播组,这里面包含了要加入的组播组的地址,也可以用来回复路由器的查询。同一网段中,只需要一台主机发送Report报文,避免网络中充斥大量的Report报文。
抑制机制:倒数报告计时器的默认时间为10S;
IGMP V1
IGMP V1协议主要基于查询和响应机制完成组播组管理,当一个网段内有多个组播路由器时,由于它们都可以接收到主机发送的成员报告报文,因此只需要选取其中一组路由器发送查询报文就够了,改组播路由器称为IGMP查询器(Querier)。在IGMP V1中,由组播路由协议PIM选举出唯一的组播信息转发者(Assert Winner或DR)作为IGMP V1的查询器,负责该网段的组成员关系查询。
IGMP V1的工作机制可以分为普遍组查询和响应机制,新成员加入机制和组成员离开机制三个方面。
普遍组查询和响应机制
通过普遍组查询和响应,IGMP查询器可以了解到该网段内哪些组播组存在成员。
如上图所示,普遍组查询和响应过程如下:
- IGMP查询器发送目的地址为224.0.01(表示同一网段内所有主机和路由器)的普遍查询报文;收到该查询报文的组成员启动定时器。查询器所发送的普遍组查询报文是周期性发送的,发送周期可以通过命令配置,默认情况下每隔60秒发送一次。Host A和Host B是组播组G1的成员,则在本地启动定时器Timer-G1。缺省情况下,HostA和B的定时器范围为0-10秒之间的随机值。下图中IGMP版本为V1版本,目的IP地址为224.0.0.1,源IP地址为自己接口的IP地址,在组播地址中,填充为0.0.0.0。
- 第一个定时器超时的组成员发送针对该组播组的报告报文。假设Host A上的Timer-G1首先超时,Host A向该网段发送目的地址为G1的报告报文。也想加入G1的Host B收到此报告报文,则停止定时器Timer-G1,不再发送针对G1的报告报文,报告报文被抑制,可以减少网段上的流量。下图中是主机像路由器发送的报告报文,类型值为0X12,源IP地址为自己主机的IP地址,目的IP地址为组播地址。下图中,是主机像路由器发送的报告的抓包,类型值为0x12,源IP地址为自己主机的IP地址,目的IP地址为组播地址。
新成员加入机制
如上图所示,主机Host C加入组播组G2的过程如下:
- 主机Host C不等待普遍组查询报文的到来,主动发送针对G2的报告报文,声明加入该组播组;
- IGMP查询器接收到Host C的报告报文后,了解到本地网段内出现了组播组G2的成员,则生成组播转发项(*,G2),网络中一旦有G2的数据到达路由器,将向该网段转发;
组成员离开机制
IGMP V1没有专门定义离开组的报文,主机离开组播组后,便不会再对普通组查询报文做出回应。
- 假设Host A想要退出组播组G1:Host A收到IGMP 查询器发送的普遍组查询报文时,不再发送针对G1的报告报文,由于网段内还存在G1组成员Host B,Host B会向IGMP查询器发送针对G1的报告报文,因此IGMP查询器感知不到Host A的离开;
- 假设Host C想要退出组播组G2:Host C收到IGMP查询器发送的普遍组查询报文时,不再发送针对G2的报告报文。由于网段内不存在组G2的其他成员,IGMP查询器不会收到G2组成员的报告报文,则在一定时间内(默认为130秒)后,删除G2所对应的组播转发表项;
报文
V1版本包括两种类型的报文:
- 普遍组查询报文:英文为General Query,是查询器向共享网络上所有主机和路由发送的查询报文,用于了解哪些组播组存在成员;
- 成员报告报文:英文为Report,是主机向查询器发送的报告报文,用于申请加入某个组播组或者应答查询报文。
Version:版本号,在IGMP V1中该值为1;
Type:报文类型,该字段有以下两种取值:0x11,表示普遍组查询报文。0x12,表示成员报告报文;
Unused:在IGMP V1中,该字段在发送时被设置为0,并在接收时被忽略;
Checksum:IGMP报文的校验和,校验和是IGMP报文长度(也就是IP报文的整个有效载荷)的16位检测,表示IGMP信息补码之和的补码。Checksum字段在进行校验计算时设为0.当发送报文时,必须计算校验和并插入到Checksum字段中去,当接收报文时,校验和必须在处理该报文之前进行校验;
Group Address:组播地址,在普遍组查询报文中,该字段为0,在成员报告报文中,该字段为成员加入的组播组地址;
IGMP V2
IGMP V2工作机制与IGMP V1基本相同,最大不同之处在于IGMP V2增加了离开组机制,成员主机离开组播组时,会主动发送成员离开报文通知IGMP查询器;IGMP查询器在收到成员离开报文后,会连续发送特定查询报文,询问该组播组是否还存在组成员。如果在一段时间内没有收到成员主机发送的报告报文,IGMP查询器将不再维护该组的组成员关系。IGMP V2可以使IGMP查询器即使了解到网段内哪些组播组已经不存在成员,从而即使更新组成员关系,减少网络中冗余的组播流量。
和IGMP V1相比,V2版本增加了查询器选举和离开组的机制。
查询器选举机制
IGMPV2使用独立的查询器选举机制,当共享网段上存在多个组播路由器时,IP地址最小的路由器成为查询器。
如上图所示,在IGMP V2中,查询器的选举过程如下:
- 最初,所有运行IGMP V2的组播路由器(上图中的Router A和Router B)都会认为自己试查询器,向本网段内所有主机和组播路由器发送普遍查询报文。Router A和B在收到对方发送的普遍查组查询报文后,将报文的源IP地址与自己的接口地址作比较,通过比较,IP地址最小的组播路由器将成为查询器,其他组播路由器成为非查询器(Non-Querier),V2查询报文示例如下:
IGMP V2报告报文如下:
- 此后,将由IGMP查询器,也就是上一步选举出来的IP地址最小的Router A,向本网段内所有主机和其他组播路由器发送普遍查询报文,而非查询器(Router B)将不再发送普遍组查询报文。非查询器(Router B)上都会启动一个定时器(即其他查询器存在时间的定时器,Other Querier Present Timer)。在该定时器超时前,如果收到了来自查询器的查询报文,则重置该定时器;否则就认为原查询器失效,并发起新的查询器选举过程。
离开组机制
如上图所示在IGMP V2中,主机Host A离开组播组G1的过程如下:
Host A向本地网段内的所有组播路由器(也就是目标地址为224.0.0.2)发送针对组G1的离开报文;
查询器收到离开报文,会发送针对组G1的特定组查询报文。发送间隔和发送次数可以通过命令配置,缺省情况下,每隔1秒发送一次,一共会发送两次,同时查询器会启动组成员关系定时器(Timer-Membership=发送间隔X发送次数);
如果该网段内还存在组G1的其他成员,这些成员在收到查询器发送的特定查询报文后,会立即发送针对组G1的报告报文。查询器收到针对组G1的报告报文后,将继续维护该组成员关系;
如果该网段内不存在组G1的其他成员,查询器将不会收到针对组G1的报告报文。在Timer-Membership超时后,查询器将删除(*,G1)对应的IGMP组表项。当有组G1的组播数据到达查询器时,查询器将不会向下游转发。
报文分析
和IGMP V1相比,IGMP V2除了普遍组查询报文和成员报告报文之外,IGMP V2新增了两种报文:
- 成员离开报文(Leave):成员离开组播组时,会主动向查询器发送离开报文,用于宣告自己离开了某个组播组;
- 特定组查询报文(Group-Specific Query):查询器向共享网段内指定组播组发送的查询报文,用于查询该组播组是否存在成员;
报文方面的另一个变化是,IGMP V2对普遍组查询报文的格式进行了改进,添加了最大响应时间(Max Response Time)字段,该字段取值可以通过命令配置,用于控制成员对于查询报文的响应速度。查询报文的抓包如下:
Type:报文类型,该字段有四种取值:0x11表示查询报文,包括普遍组查询报文和特定组查询报文两类;0x12表示IGMPV1成员报告报文;0x16表示IGMPV2成员报告报文;0x17表示成员离开报文。
Max Response Time:最大响应时间,成员主机在收到IGMP查询器发送的普遍查询报文后,需要在最大相应时间内做出回应,该字段仅在IGMP查询报文中有效。
Group Address:组播组地址。在普遍查询报文中,该字段为0.0.0.0;在特定组查询宝文中,该字段为要查询的组播组地址;在成员报告报文和离开报文中,该字段为组成员要加入或离开的组播组地址。
IGMP V3
IGMP V3主要是为了配合SSM(Source-Specific Multicast)模型发展起来的,提供了在报文中携带组播源信息的能力,也就是说主机可以对组播源进行选择。
特定组的加入
IGMP V3的成员报告报文的目的地址为224.0.0.22(表示同一网段所有能使用IGMP V3的路由器)。通过在报告报文中携带组记录,主机在加入组播组的同时,能够明确要求接收或不接收特定组播源发出的组播数据。
如果Host和组播路由器之间运行的是IGMP V1或IGMP V2,那么Host加入组播组G时无法对组播源进行选择,无论其是否需要,都会同时接收到来自组播源S1和S2的数据。如果采用IGMP V3,成员主机可以选择仅仅接收S1组播的数据。
- 方法1:Host发送IGMP V3报告(G,Include,(S1)),仅接收源S1向组播组G发送的数据;
- 方法2:Host发送IGMP V3报告(G,Include,(S2)),不仅接收指定源S2向组播组G发送的数据,从而仅有来自S1的组播数据才能传递到Host。
特定组查询
当接收到组成员发送的改变组播组与愿列表的对应关系的报告时(比如Change_to_include_mode\Change_to _exclude_mode),IGMP查询器会发送特定源的组查询报文,如果组成员希望接收其中任意一个源的组播数据,将反馈报告报文。IGMP查询器根据反馈的组成员报告更新该组对应的源列表。
IGMP SSM Mapping
基本概念
SSM(Source-Specific Multicast)成为指定源组播,要求路由器能了解成员主机加入组播时所指定的组播源。如果成员主机上运行IGMP V3,可以在IGMP V3报文中直接指定组播源地址,但是在某些情况下,成员主机只能运行IGMP V1或V2,为了使其也能够使用SSM服务,路由器上需要提供IGMP SSM Mapping功能。
工作机制
通过在路由器上静态配置SSM地址的映射规则,将IGMP V1和V2报告报文中的(*,G)信息转化为对应的(G,Include,(S1,S2….))信息,以提供SSM组播服务。
SSM模型针对特定源和组的绑定数据流提供服务,接收者主机在加入组播组时,可以指定只接收哪些源的数据或指定拒绝接收来自哪些源的数据。加入组播组以后,主机只会收到指定源发送到该组的数据;
SSM模型对组播地址不再要求全网唯一,只需要每个组播源保持唯一。这里的唯一指的是同一个源上不同的组播应用必须使用不同的SSM地址来区分。不同的源之间可以使用相同的组地址,因为SSM模型中针对每一个(源,组)信息都会生成表项。这样一方面节省了组播组地址,另一方面也不会造成网络拥塞;
如果G在ASM(And-Source Multicast)范围内,只提供ASM服务。
如果G在SSM组地址范围内(默认情况下为232.0.0.0-232.255.255.255),如果路由器上没有G对应的SSM Mapping规则,那么无法提供SSM服务,丢弃该报文;如果路由器上有G对应的SSM Mapping规则,则一句规则将报告报文中所包含的(*,G)信息映射为(G,Include,(S1,S2…..))信息,提供SSM服务。
IGMP Proxy
基本概念
IGMP Proxy,也称为IGMP代理,通常被部署在接入设备(Router A)和成员主机之间的三层设备上,IGMP Proxy设备可以手机下游成员主机的IGMP报告\离开报文,将报告\离开报文汇聚后,代理下游成员主机同一上报给接入设备;另一方面IGMP Proxy设备也可以代理IGMP查询器向下游成员主机发送查询报文,维护成员关系,基于组成员关系进行组转发。在接入设备Router A看来,Router B就是一台主机,在下游成员主机看来,Router B就是IGMP查询器。
- 上游接口:指IGMP代理设备上配置IGMP Proxy功能的接口,该接口执行IGMP代理设备的主机行为,因此也称为主机接口(Host Interface);
- 下游接口:指IGMP代理设备上配置IGMP功能的接口,该接口执行IGMP代理设备的路由器行为,因此也称为路由器接口(Router Interface);
工作机制
IGMP代理设备实现的功能主要分为两种:主机行为和路由器行为。
主机行为是指IGMP代理设备的上游接口收到查询报文时,根据当前组播转发表的状态对查询报文做出响应,或者当组播转发表发生变化时,上游接口主动向接入设备发送报告\离开报文。主机行为的工作机制如下:
IGMP代理设备上游接口收到查询报文时,会根据当前组播转发表的状态对查询报文作出相应;
IGMP代理设备收到某组播组的报告报文后,会在组播转发表中查找该组播组。如果没有找到相应的组播组,IGMP代理设备会向接入设备发送针对该组播组的报告报文,并在组播转发表中添加该组播组。如果找到相应的组播组,IGMP代理设备就不需要向接入设备报告发送报告报文;
IGMP代理设备收到某组播组G的离开报文后,会向接收到该离开保温的接口发送一个特定组查询报文,检查该接口下是否还存在组播组G的其他成员。如果没有其他成员,IGMP代理设备会向接入设备发送针对该组播组的离开报文,并在组播转发表中将对应的接口删除。如果有其他成员,IGMP代理设备会继续向该接口转发组播数据;
IGMP命令
1 | ip multicast |
PIM协议
PIM协议英文全称为,Protocol Independent Multicast,中文是协议无关组播,这里的协议无关指的是与单播路由协议无关,也就是说,PIM不需要维护专门的单播路由协议。作为组播路由解决方案,它直接利用单播路由表的路由信息,对组播报文执行RPF(Reverse Path Forwarding,逆向路径转发)检查,检查通过后创建组播路由表项,从而转发组播报文。,目前设备实际支持的IPM协议包括:PIM-DM(PIM-Dense Mode)、PIM-SM(PIM-Sparse Mode)
基本概念
组播分发树
PIM网络以组播组为单位在路由器上建立单点到多点的组播转发路径。由于组播转发路径呈现树形结构,也称为组播分发树MDT(Multicast Distribution Tree)。主要包括SPT和RPT两种。
SPT
SPT全称为Shortest-Path Tree,中文为最短路径树,以组播源为根,是组播组成员为叶子的组播分发树,SPT同时适用于PIM-DM网络和PIM-SM网络;
主要使用(S,G)表项;
源树的分支形成了通过网络到达接收者所在分支的分布树,因为最短路径树使用最短的、从源起始贯穿网络到达组播接收者的路径,所以又叫最短路径树;
RPT
以RP(Rendezvous Point)为根,也就是使用RP为汇聚点,组播组成员为叶子的组播分发树称为RPT(RP Tree),RPT适用于PIM-SM网络;
主要使用(*,G)表项;
多个组播组可以共用一个RP,需要接收组播流量的路由器,通过组播协议在自己与RP之间建立一条RPT的分支,组播流量首先需要从源发送到RP,然后再由RP将组播流量转发下来,组播流量顺着RPT最终到达各个接收者所在的终端网络;
PIM路由器
在接口上使用了PIM协议的路由器即为PIM路由器。在建立组播分发树的过程中,PIM路由器又分为以下几种:
叶子路由器,与用户主机相连的PIM路由器,但连接的用户主机不一定为组成员;
第一跳路由器:组播转发路径上,与组播源相连且负责转发该组播源发出的组播数据的PIM路由器;
最后一跳路由器:组播转发路径上,与组播组成员相连且负责向改组播组成员转发组播数据的PIM路由器;
中间路由器:组播转发路径上,第一跳路由器与最后一跳路由器之间的PIM路由器;
RPF
RPF全称为Reverse Path Forwarding,反向路径转发。在组播网络中,如果组播流量出现转发环路,比起单播报文的转发环路的危害要大得多,路由器在转发组播报文时,除了会关注报文的目的地址,还会特别关心该报文的源地址。组播路由器通过RPF的机制来实现组播数据转发的无环化。
RPF机制确保组播数据从正确的接口被收到,只有通过RPF检查的组播数据包才会被路由器沿着组播树进行转发,如果数据包从错误的接口被收到,路由器将丢弃这些报文。这里所谓的正确接口,其实就是通过了RPF检查的接口,也就是经常说的上游接口,一种常见的情况是,设备借助其单播路由表来实现RPF检查。
PIM路由表项
PIM路由表项就是那些通过PIM协议建立的组播路由表项。PIM网络中存在两种表项:(S,G)路由表项或(,G)路由表项。S表示组播源,G表示任意的组播组。
- (S,G)路由表项主要用于在PIM网络中建立SPT(Shortest Path Tree,最短路径树),路由表项知道组播源S的位置,用于PIM-DM网络和PIM-SM网络;
- (*,G)路由表项主要用于在PIM网络中建立RPT(Rendezvous Point Tree,共享树),路由表项只知道组播G的存在,用于PIM-SM和PIM-DM网络;
路由器上可能同时存在两种路由表项,当收到源地址为S,组地址为G的组播报文,且RPF检测通过的情况下,按照如下的规则转发:
- 如果存在(S,G)路由表项,则由(S,G)路由表项指导报文转发;
- 如果不存在(S,G)路由表项,只存在(,G)路由表项,则先依照(,G)路由表项创建(S,G)路由表项,再由(S,G)路由表项指导报文转发;
PIM路由表项中主要用于指导转发的信息如下:
组播源地址;
组播组地址;
上游接口:本地路由器上接收到组播数据的接口;
下游接口:将组播数据转发出去的接口;
PIM-DM
基本原理
PIM-DM全称Protocol-Independent Multicast-Dense Mode,可以翻译成协议无关组播的密集模式,使用的‘推(Push)模式’转发组播报文,一般应用于组播组成员规模相对较小,相对密集的网络。在实现过程中,它会假设网络中的组成员分布非常稠密,每个网段都可能存在组成员,当有活跃的组播源出现时,PIM-DM将组播源发来的组播报文扩散到整个网络的PIM路由器上,再裁减掉不存在的组成员的分支。PIM-DM通过周期性的进行‘扩散(Flooding)——修剪(Prune)’,来构建并维护一颗连接组播源和组成员的单向无环SPT(Specific Shortest Path Tree)。如果在下一次‘扩散-修剪’进行前,被裁剪掉的分支由于其叶子路由器上有新的组成员加入而希望提前恢复转发状态,也可通过嫁接(Graft)机制主动恢复其对组播报文的转发。
PIM-DM工作机制包括邻居发现、扩散、裁剪、嫁接、断言和状态刷新。其中扩散、裁剪和嫁接是构建SPT的主要方法。
使用‘推(push)’模型,也就是说不管你要不要这个组播,先推送给你;
组播数据流整个网络泛洪(Flood);
下游不需要这个组播的话则会裁剪(Prune);
泛洪——裁剪——泛洪——裁剪,周而复始,每隔三分钟泛洪一次;
几种动作
邻居发现
PIM路由器上每个使用了PIM协议的接口都会对外发送Hello报文,每个30S(Hello Interval)会使用组播的PIM Hello报文选入它的连入,105S内收不到邻居的Hello报文则会认为邻居失效,在组播转发时经过RPF检测后会将组播流量发送给所有PIM邻居路由器,查看邻居的命令为:show ip pim neighbor。
封装Hello报文的组播报文的目的地址是224.0.0.13(表示同一网段中所有PIM路由器)、源地址为接口的IP地址、TTL数值为1。
Hello报文的作用如下:
发现PIM邻居。同一网段中的PIM路由器都必须接收目的地址为224.0.0.13的组播报文,这样直接相连的PIM路由器之间通过交互Hello报文以后,就可以彼此知道自己的邻居信息,建立邻居关系。只有邻居关系建立成功后,PIM路由器才能接收其他PIM协议报文,从而创建组播路由表项;
维持邻居关系。PIM路由器之间周期性地发送Hello报文,如果Holdtime超时还没有收到该PIM邻居发出的新的Hello报文,PIM路由器就认为该邻居不可达,将其从邻居列表中清除。PIM邻居的变化将导致网络中组播拓扑的变化。如果组播分发树上的某上游邻居或下游邻居不可达,将导致组播路由重新收敛,组播分发树迁移;
协调各项PIM协议报文参数。Hello报文中携带多项PIM协议报文参数,主要用于邻居之间PIM协议报文的控制:
DR_Priority:表示各路由器接口精选DR的优先级,优先级越高越容易获胜;
Holdtime:表示保持邻居为可达状态的超时时间,如果在超时时间内没有收到PIM邻居发送的Hello报文,路由器则认为邻居不可达;
LAN_Delay:表示共享网段内传输Prune报文的延迟时间;
Neighbor-Tracking:表示邻居跟踪功能;
Override-Interval:表示Hello报文中携带的否决裁剪的时间间隔;
扩散(Flooding)
当PIM-DM网络中出现活跃的组播源之后,组播源发送的组播报文将在全网内扩散,当PIM路由器接收到组播报文,根据单播路由表进行RPF检查通过后,就会在该路由器上创建(S,G)表项,下游接口列表中包括除上游接口之外与所有PIM邻居相连的接口,后续到达的组播报文将从各个下游接口转发出去。
最后组播报文扩散到达叶子路由器,会出现以下两种情况:
- 若与该叶子路由器相连用户网段上存在组成员,则将与该网段相连的接口加入(S,G)表项的下游接口列表中,后续的组播报文会向组成员转发;
- 若与该叶子路由器相连用户网段上不存在组成员,则不需要向其下游PIM邻居转发组播报文,则执行裁剪动作;
裁剪(Prune)
当PIM路由器接收到组播报文后,RPF检查通过,但是下游网段没有组播报文需求。此时PIM路由器会向上游发送裁剪报文,通知上游路由器禁止相应下游接口的转发,将其从(S,G)表项的下游接口列表中删除。裁剪操作由叶子路由器发起,逐跳向上,最终组播转发路径上只存在与组成员相连的分支。
路由器为被裁剪的下游接口启动一个裁剪计时器,计时器超时后接口恢复转发。组播报文重新在全网范围内扩散,新加入的组成员可以接收到组播报文。随后,下游不存在组成员的叶子路由器将向上发起裁剪的操作。这种周期性的扩散-裁剪,PIM-DM周期性的刷新SPT(Shortest Path Tree,最短路径树)。
当下游接口被裁剪后:
- 如果下游叶子路由器有组成员加入,并且希望在下次‘扩散-裁剪’前就恢复组播报文转发,则执行嫁接动作;
- 如果下游叶子路由器一直没有组成员加入,希望该接口保持一直转发状态,则执行状态刷新动作;
会发生Prune的情况:
该接口下没有接收者;
没有下游PIM邻居;
非RPF接口收到多播流,也就是当前路由器向上游路由器发送Prune;
多路访问环境下由于Assert原因,自己不能转发多播流,重复Prune之前会等待3秒钟延迟来等待有无Join;
嫁接(Graft)
PIM-DM通过嫁接机制,使有新组成员加入的网段快速得到组播报文。叶子路由器通过IGMP了解到与其相连的用户网段上,组播组G有新的组成员加入。随后叶子路由器会向上游发送Graft报文,请求上游路由器恢复相应出接口转发,将其添加在(S,G)表项下游接口列表中。
嫁接过程从叶子路由器开始,到有组播报文到达的路由器结束。
状态刷新(State Refresh)
在PIM-DM网络中,由于裁剪计时器为3分钟,也就是说3分钟后那些不需要组播,被裁剪了的路由器将会重复一遍‘泛洪——裁剪’的动作,使得网络中充满了组播的泛洪以及裁剪数据,为了避免被裁剪的接口因为‘裁剪定时器’超时而一次次的恢复转发,去消耗网络带宽,离组播源最近的第一跳路由器会周期性的触发State Refresh报文在全网内扩散,收到State Refresh报文的PIM路由器会刷新裁剪定时器的状态,被裁剪接口的下游叶子路由器如果一直没有成员加入,则该接口一直处于被抑制转发的状态。配置命令为到接口下输入: ip pim state-refresh origination-interval XX。
断言(Assert)
当一个网段内有多个相连的PIM路由器,使用RPF检查通过向该网段转发组播报文时,则需要通过断言机制来保证只有一个PIM路由器向该网段转发组播报文。PIM路由器在接收到邻居路由器发送的相同组播报文后,会以组播的方式向本网段的所有PIM路由器发送Assert报文,其中目的地址为永久组地址224.0.0.13。其他PIM路由器在接收到Assert报文后,将自身参数与对方报文中携带的参数作比较,进行Assert竞选,规则如下:
单播路由协议优先级较高者获胜;
如果优先级相同,则到组播源的开销较小者获胜;
如果以上都相同,则下游接口IP地址最大者获胜;
根据Assert竞选结果,路由器将执行不同的操作:
- 获胜一方的下游接口称为Assert Winner,将负责后续对该网段组播报文的转发;
- 落败的乙方的下游接口称为Assert Loser,后续不会对该网段转发组播报文,PIM路由器也会将其从(S,G)表项下游接口列表中删除;
Assert竞选结束后,该网段上只存在一个下游接口,只传输一份组播报文。所有Assert Loser可以周期性地恢复组播报文转发,从而引发周期性的Assert竞选。
协议数据包
Hello
Hello消息的作用是发现和维护邻居关系。默认发送间隔是30秒也就是Hello Interval是30秒,邻居超时时间为Hello的3.5倍,也就是105秒。在PIM-DM网络中,刚启动的组播路由器需要使用Hello消息来发现邻居、维护邻居关系以及选举DR指定路由器。路由器之间周期性的发送Hello消息来构建和维护SPT树(Shortest Path Tree,最短路径树)。在PIM-DM中,只需要Hello报文就能够接收组播的数据而不需要其他的报文。
Hello Interval,在接口下配置发送Hello消息的时间间隔,Hello消息默认周期是30S。Holdtime interval,在接口下配置Hello消息超时的时间,默认情况下超时时间为105S。
Hello消息还有一个重要的功能,就是在多个路由器网段中选举DR指定路由器,DR路由器充当IGMP V1的查询器,查询器的选举由组播协议决定。在PIM-DM中各路由器通过比较Hello消息中携带的优先级和IP地址,为多个路由器网段选举指定路由器DR,充当IGMP V1的查询器。当DR出现故障时,接收Hello消息将会超时,邻居路由器之间会触发新的DR选举过程。
PIM DR的选举过程为:
- 优先级大的为DR,优先级默认为1;
- IP地址大的;
在PIM-DM模式下,DR只充当IGMP V1版本的查询者,没有其他用途。
Join\Prune
加入和裁剪组播树。
当有新的组播成员要加入组播组时,它所连入的当前路由器要加入组播树,由于当前路由器以前被
Graft
嫁接,嫁接报文用于重新加入一个组播组,而这个路由器之前使用裁剪动作退出了该组播组。
graft message is specific for re-joining to a group which was pruned by the router earlier
出自
Graft ACK
嫁接成功后的确认报文。
Assert
声明。在多路访问环境下,用来协商哪台多播路由器来向该多路访问网络中转发组播数据流。
配置
- 首先保证单播的路由通信正常;
- 其次在网络设备上配置组播协议:
1 | 全局启用组播: |
- 配置接收节点并‘放号’;
- 查看与拍错;
在接口上配置‘ip pim dense-mode’时,首先必须运行单播路由协议,否则PIM无法做RPF,确定RPF接口;第二是配置了PIM的时候必须每个接口都启用该协议,否则可能会出现RPF故障。
show ip igmp interface XX 来查看接口运行组播情况。
PIM DM总结
PIM-DM对于小型网络来说非常有效。
优点:
- 易于配置,只有两条命令;
- 实现机制简单,基于泛洪——裁剪;
不足:
泛洪——裁剪的过程不够高效;
复杂的Assert机制;
控制和数据平面混合;
容易导致网络内部所有的路由器上都有(S,G)表项;
可能会导致非确定性的拓扑行为;
不支持共享树;
PIM-SM
PIM-SM全称是Protocol-Independent Sparse Mode,可以翻译成协议无关组播的稀疏模式。PIM-SM有两种模型,分别是ASM(Any-Source Multicast,任意信源组播)和SSM(Source-Specific Multicast,指定信源组播),ASM模型可以支持PIM-DM和PIM-SM两种模式;SSM模型只有PIM-SM模式,目前PIM-SM用的绝大多数都是SSM模式。
ASM模式出现较早也就是协议更老一些,在组播组中可以存在多个组播源,而SSM在组播组中只能有一个组播源。现网中用的基本都是SSM,而ASM使用较少的原因是安全问题,因为可以指定多个组播源,谁都可以向这个组播发送报文,容易乱套,而SSM都是指定源IP,加上有RPF,安全性相对较好。
基本原理
ASM模型
在ASM(Any-Source Multicast)模型中,PIM-SM使用‘拉(pull)模式’转发组播报文,一般应用于组播成员规模相对较大,相对较稀疏的网络。基于这一种西数的网络模型,它的实现方法是:
在网络中维护一台重要的PIM路由器,汇聚点RP(Rendezvous Point),可以为随时出现的组播成员或组播源服务。网络中所有PIM路由器都知道RP的位置;
当网络中出现组成员(用户主机通过IGMP加入某组播组G)时,最后一跳路由器向RP发送Join报文,逐跳创建(*,G)表项,生成一颗以RP为根的RPT(Rendezvous Point Tree);
当网络中出现活跃的组播源(组播源向某组播组G发送第一个组播数据)时,第一跳路由器将组播数据封装在Register报文中单播发送给RP,在RP上创建(S,G)表项,注册源信息;
在ASM模型中,PIM-SM的关键机制包括邻居发现、DR精选、RP发现、RPT构建、组播源注册、SPT切换、断言;同时可以通过配置BSR(Bootstrap Router)管理域来实现单个PIM-SM域的精细化管理。
由于ASM用的比较少
SSM模型
SSM模型是借助PIM-SM的部分技术和IGMP V3\MLD V2来实现的,无需维护RP、无需构建RPT、无需注册组播源,可以直接在源与组播成员之间建立SPT。
SSM的特点是网络用户能够预先知道组播源的具体位置,因此用户在加入组播组时,可以明确指定从哪些源来接收信息,组成员端DR了解到用户主机的需求后,直接向源端发送Join报文,Join报文逐跳向上传输,在源与组成员之间建立SPT。
在SSM模型中,PIM-SM的关键机制包括邻居发现,DR竞选,构建SPT。
关键机制
DR选举
在组播源或组成员所在的网段,通常同时连着多台PIM路由器。这些PIM路由器之间通过交互Hello报文成为PIM邻居,Hello报文中携带DR优先级和该网段接口地址。PIM路由器将自身条件与对方对方报文中携带的信息进行比较,选举出DR来负责源端或组成员端组播报文的收发。选举规则如下:
- 如果网段中所有PIM路由器都支持DR优先级,那么DR优先级较高者获胜;
- 如果DR优先级相同或该网段存在至少一台PIM路由器不支持在Hello报文中携带DR优先级,则IP地址较大者获胜。
如果当前DR出现故障,导致PIM邻居关系超时,其他PIM邻居之间会触发新一轮的DR选举。
https://www.jannet.hk/zh-Hans/post/protocol-independent-multicast-pim/
https://cshihong.github.io/2018/02/13/%E5%8D%8F%E8%AE%AE%E6%97%A0%E5%85%B3%E7%BB%84%E6%92%AD-PIM/
组播衍生问题
为什么OSPF这种IGP协议的邻居必须直连,没法像BGP一样,非直连也能建立邻居呢?因为BGP使用TCP来建立邻居,TCP连接可以跨设备不需直连,而OSPF使用组播地址建立邻居,也就是224.0.0.5和224.0.0.6,这个地址段不能被路由,传播范围仅限于本链路,不能传给下一个链路,RFC5771上规定的是:
- Local Network Control Block (224.0.0/24)
Addresses in the Local Network Control Block are used for protocol control traffic that is not forwarded off link. Examples of this type of use include OSPFIGP All Routers (224.0.0.5) [RFC2328].
所以使用组播建立邻居的动态路由协议,比如OSPF,邻居必须直连,因为用来建立邻居的组播只能在本链路内传递。
https://community.juniper.net/communities/community-home/digestviewer/viewthread?MID=65023
引用文章
Why we use 224 as multicast address in many protocols?
Multicast Source-Tree: PIM-Graft - Shared Tree: PIM Join/Prune