该协议数据层面是基于UDP协议。
组播服务体系结构中,有3个部分:源端、组播分发树以及接收端。
- 源端,发送组播流量的组播应用软件服务;
- 组播分发树,路由器使用动态路由协议转发组播报文,例如PIM, DVMRP, MOSPF为IGP组播协议;MBGP、MSDP为EGP组播协议;
- 接收端,最后一条路由器与终端之间,使用IGMP协议来交互是否接受组播流量。
组播地址是保留的D类地址,即224.0.0.0 – 239.255.255.255,并且没有子网掩码的概念。分为以下几大类:
- 保留链路本地地址(Link Local Address):范围是224.0.0.0 – 224.0.0.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 | RIPv2监听的地址 |
224.0.0.10 | EIGRP监听的地址 |
224.0.0.13 | PIM发送Hello的地址 |
- 全局地址(Globally Scoped Address),即所谓的公网组播地址:范围是224.0.1.0 – 238.255.255.255。其中232.0.0.0 – 232.255.255.255为指定源组播(SSM, Source Specific Multicast);GLOP地址,233.0.0.0 – 233.255.255.255,AS号与组播地址关联。
- 限制范围地址(Limited Scoped Address),即私网组播地址:范围是239.0.0.0 – 239.255.255.255。
在以太网中,其MAC地址可以与IP地址进行映射:MAC地址的前25位为:00000001.00000000.01011110.0,即01.00.5e.00.00.00 - 01.00.5e.7f.ff.ff,后23位映射组播IP地址。如:
- Internet Group Management Protocol,封装在IP内,协议号为2。
- 该协议定义的过程为最后一条路由器到接受终端的通信过程。
- 有三个版本,这里只讨论IGMPv1和IGMPv2。
定义在RFC 1112,是一个C/S协议,Client为PC,Server为Leaf Router。
该协议有2类报文:成员查询和成员通告报文:
- Ver:IGMP版本信息
- Type:报文类型
- Query报文,由Server发出,报文源地址为路由器地址,目的地址为224.0.0.1,组地址:0.0.0.0;
- Report报文,由PC发出,宣告其想加入某个组播组(例如224.1.1.1组),它会发送源地址为PC的IP地址、目的地址为224.1.1.1,组地址为224.1.1.1的报文。
该报文的目的地址为224.1.1.1有两个目的:1)告知最后一跳路由器该网络有PC加入该组播组;2)当PC收到Query报文之后,不会立即就回复Report报文,而会在本地开启1-10s的随机计时器,等待相应的时间回复Report,所以Report报文可以告知其他终端不要再发送其他Report报文。
- 组地址:区分组播组的地址
- Query报文的发送:Leaf Router会以周期为60 – 120s发送Query报文,查询是否有终端想加入某个组,若同网络有多个Leaf Router,则有PIM的DR来发送Query报文;
- Report报文的发送:终端想加入某个组播组,可以发送该报文,该报文可以作为作为Query报文的Ack报文,也可以主动向Leaf Router发送;
- 流量转发:Leaf Router收到Report报文之后,会对每个组播组建立的相应表项,同时建立一个180s的Holdtime计时器,在计时器到期之前,没有收到任何Report报文,就会停止转发该类报文。同时也会保持60s一次的查询报文的发送。终端收到查询报文之后,也会回复Report报文;
- 离组:终端离开组播组的过程成为静悄悄地离组,不会通知Leaf Router。当Holdtime计时器超时时,才会停止转发流量,这为IGMPv1的硬伤。
- Max.Resp.Time:最大相应时间,将其时间优化为可以为小数秒
相比IGMPv1,新定义了2个报文:指定组查询(Group-Specific Query)和离组消息(Leave Group Message)。
- 指定组查询报文:源地址为本地地址,目的地址和组地址为224.1.1.1。
- 离组报文:源地址为本机地址,目的地址为224.0.0.2,组播组地址为想要离开的组,即224.1.1.1。
- 选举查询者:IGMPv2定义了查询者机制,多个Leaf Router需要选出接口IP地址最小的作为查询者,由他来周期性的发送查询报文。选举报文由第一次的查询报文来决定。如果120s之内没有收到查询报文,会重新根据查询者选举机制来确定新的查询者;
- 加组:同IGMPv1;
- 转发流量:同IGMPv1;
- 离组:当某个终端想要离开组播组时,要发送离组报文。查询者收到离组报文之后,会将超时计时器由180s改为2s,然后发送指定组查询报文,其他PC收到该报文之后,会立即应答。如果Leaf Router在超时时间(2s)内没有收到应答,查询者认为该组中没有其他成员,会停止发送组播组消息。
- IGMPv3增强了对主机的控制能力,可以基于组播源地址进行过滤,使主机在加入某组播组的同时,能够明确要求接收或拒绝来自某特定组播源的组播信息。
- IGMPv1&2都是基于ASM(Any Source Multicast,任意源组播,路由器转发报文不关心是谁发送的报文,只负责转发报文),IGMPv3可以基于SSM(Source Specific Multicast,指定源组播,路由器只对某个路由器转发组播报文,这样底层客户端可以知道源地址)。
ip multicast-routing # 开启组播路由
ip pim sparse-mode # 端口开启PIM Sparse-mode
ip igmp join-group 224.1.1.1 # 终端端口加入224.1.1.1组播组
sh ip igmp int fa0/0 # 查看IGMP配置情况
sh ip igmp groups # 查看路由器关联的组播组
ip igmp version 3 # 端口启用IGMPv3
Leaf Router对流量进行优化之后,要将流量通过交换机发送给PC,这里讨论2中交换机对组播流量进行优化的机制:CGMP和ICMP snooping
该协议运行在交换机与路由器之间,实现组播流量不会在整个广播域内泛洪。其为C/S模型,Client为交换机,Server为路由器。
- 运行机制:
- 终端要加入某组播组,会发送Report报文,该报文的2层封装的源MAC地址为本地MAC地址,称为USA,目的MAC地址为224.1.1.1对用的MAC地址,成为GDA。
- 路由器收到该报文之后,将USA和GDA信息生成CGMP通告报文发送给交换机,交换机会将该报文中的信息存入相应的CGMP表项。交换机等收到该数据报文之后,就不会向其他端口转发,复制若干份,只发送给相应端口。
- 缺陷:由于MAC地址与IP地址的映射为模糊映射,所以可能会造成少发。
- 运行机制:交换机开启该机制,收到终端发送的Report报文会拆到3层报文,查看其IP地址,然后将组播组地址,然后再与端口相对应,添加到IGMP snooping表中,从而避免了模糊映射。
- 缺点:需要拆包到3层,建议3560以上的交换机使用该机制。
- IGMP snooping配置命令
ip igmp snooping #全局开启IGMP Snooping,默认开启
show igmp snooping #查看IGMP Snooping信息
IGMP proxy,即代理。IGMP交换机通过拦截IGMP报文来建立组播表,其功能可以分为两个部分:上联端口执行主机角色,下联端口执行路由器角色。
- 上联端口执行主机角色:响应来自路由器的查询,当新增用户组或者某组最后一个用户退出时,主动发送成员报告包或者离开包;
- 下联端口执行路由器的角色:完全按照IGMP中规定的机制执行,包括查询者选举机制,定期发送通用查询信息,收到离开包时发送特定查询等。
当一台路由器收到了一个组播报文,不仅要关心其目的地,也关心其发送者,以免产生重复报文。该过程称之为RPF(Reverse Path Forwarding)校验,目的为了防止重复报文产生,解决环路问题。
当路由器收到了一个组播报文,提取其源IP地址,在本地路由条目中查找是否有道该源地址的路由条目:
- 如果没有,该路由器对于该信源没有RPF接口,并丢弃该报文;
- 如果有,进而查看路由条目中,到该源IP地址的出站接口是否与该报文的入站接口为同一接口:如果不是:则丢弃该报文;如果是:则转发该报文。
- 当路由负载均衡的条件下,出站接口的IP地址越大,越有可能作为RPF接口。
- RPF接口也可以手动修改。如果信源服务器有多个,我们任然需要做负载均衡,可以通过修改组播静态路由的方式来间接地修改PRF接口。
ip mroute 1.1.1.1 255.255.255.255 fa0/0
ip mroute 1.1.1.2 255.255.255.255 fa0/1
show ip mroute static # 查看组播静态路由
通过添加两条组播静态路由,将组播源1.1.1.1的PRF接口改为fa0/0,组播源1.1.1.2的PRF接口改为fa0/1。
PIM (Protocols Independent Multicast),报文封装在IP报文之内,协议号为13,通过224.0.0.13地址发送给邻居,使用树形结构转发流量,组播分发树的类型:
- Source-rooted,也称为Shortest Path Trees(SPTs),对应Dense模式;
- Shared Trees,也叫Rendezvous Point(RP,集合点)树,对应Sparse模式。
组播路由协议部署完毕之后,路由器之间会建立邻居,但是不会立即发送彼此的路由条目,而是等有组播流量产生之后,才会传递路由条目。
邻居:PIM建立邻居使用的链路有2种类型,P2P和MA。使用MA建立邻居时需要选出DR,DR的选举方式与OSPF一样,其可以抢占。维护邻居关系的Hello报文发送时间为30s,Holdtime为3.5 * 30=105s。
接口:当一些接口没有启用PIM的情况:
- 第一跳路由器的接受端口没有启用PIM,接收到所有组播报文都会拆包丢弃;
- 最后一跳路由器的发送端口没有启用PIM,其不会发送Query报文;
- 中间路由器彼此连接的物理接口没有启用PIM,接口不会转发任何组播报文。
当路由器启用了PIM-DM,有流量需要转发时,会向邻居泛洪流量,通过RPF校验,确定出最短路径以及转发端口。生成(S, G)表项,S:Source,G,Group,并将流量直接转发到目的网络。
- 优点是路径最短,缺点是表项很多,浪费资源。
整网95%的路由器都要接受组播流量,这是需要部署PIM-DM,基于推push模型。
初始泛洪:第一跳路由器收到组播报文之后,会将流量泛洪到整个网络;
裁剪:如果路由器通过IGMP可以判断出,下游没有接收组播流量,则会通过RPF接口发送一个剪裁消息(prune message),以阻止泛洪流量的发送。路由器收到prune消息后,接口会180s以内不会发送组播流量,180s之后,该接口会重新发送组播流量。
- 部署IGP:组播域内部署单播路由收敛,第一跳路由器连接信源的端口需要加入到组播域;
- 运行PIM:第一跳路由器连接信源接口、组播域内、最后一跳路由器连接终端的接口都需要部署PIM;
ip multicast-routing # 在全局模式启用组播
ip multicast-routing distributed # 交换机的命令
ip pim dense-mode # 接口模式开启pim密集模式
- 检查配置
show ip route # 单播路由表
show ip pim neighbor # 检查pim邻居
show ip mroute # 查看组播路由表
# (表项中的路由条目会对应有端口,以及是否有剪裁)
ping # 在信源ping组播地址
拓扑如下所示:R1为组播源,R6为接收端,R2 - R6模拟组播网络
+---(0/0)R3(0/1)---+
(1/0) (1/0)
R1(0/0)---(0/0)R2---| |---(0/0)R5(0/1)---(0/0)R6
(1/1) (1/1)
+---(0/0)R4(0/1)---+
先进行基础配置:IP地址、动态路由协议等,使全网路由可达。组播配置有:
R2, R5
ip multicast-routing
interface fa0/0
ip pim dense-mode
interface fa1/0
ip pim dense-mode
interface fa1/1
ip pim dense-mode
R3, R4
ip multicast-routing
interface range fastEthernet 0/0-1
ip pim dense-mode
R6加入到组播组239.2.2.2
R6
interface range fastEthernet 0/0
ip igmp join-group 239.2.2.2
R6加入到组播组239.2.2.2之后,R5上有了(* , 239.2.2.2)的组播路由
(*, 239.2.2.2), 00:00:11/00:02:59, RP 0.0.0.0, flags: DC
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/1, Forward/Dense, 00:00:11/stopped
FastEthernet1/0, Forward/Dense, 00:00:11/stopped
FastEthernet0/0, Forward/Dense, 00:00:11/stopped
使用R1 ping 239.2.2.2,模拟R1向R6发送组播流量:
R1#ping 239.2.2.2 repeat 3
Type escape sequence to abort.
Sending 3, 100-byte ICMP Echos to 239.2.2.2, timeout is 2 seconds:
.
Reply to request 1 from 56.1.1.6, 508 ms
Reply to request 2 from 56.1.1.6, 160 ms
同时,所有组播路由器里有了(* , 239.2.2.2)和(12.1.1.1, 239.2.2.2)两条组播路由
(*, 239.2.2.2), 00:00:45/stopped, RP 0.0.0.0, flags: D
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/1, Forward/Dense, 00:00:45/stopped
FastEthernet1/0, Forward/Dense, 00:00:45/stopped
(12.1.1.1, 239.2.2.2), 00:00:45/00:02:14, flags: T
Incoming interface: FastEthernet0/0, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/0, Prune/Dense, 00:00:45/00:02:14
FastEthernet1/1, Forward/Dense, 00:00:45/stopped
RPT中,由管理员定义一个RP,第一跳路由器收到流量之后,不会发往目的地,而是现发送给RP,然后再由RP转发给接受者。RP下游的路由器生成(*,G)表项,信源到RP仍为(S,G)表项。
- 优点是优化部分路由,缺点是路径不一定是最优。
整网中有5%设备接受流量使用稀疏模式,他使用了拉(pull)模型,会同时使用到SPT和RPT。
- 当最后一跳路由器接收到IGMP Report报文后,会生成相应的表项,同时会发送(*,G)Join给RP,告知RP以及沿途路由器,本路由器有接受者;
- RP收到(*,G)join后,RP到接受者的沿途路由器会形成RPT;
- 信源发送组播流量,第一跳路由器将(S,G)register的封装成单播的 组播报文发送给RP,目的在于查询在该组播域内是否有接受者;
- RP收到之后,由于已经有了接受者,会解封成组播包,沿RPT发送给接受者;同时,RP会向第一跳路由器发送(S, G)join,加入到SPT中;
- 这时,第一跳路由器会同时发送组播封装成的单播流量和组播流量给,为了防止重复报文,RP会向第一跳路由器封装成单播的形式发送(S,G)register-stop报文,目的告知第一跳路由器发送只组播报文到本地。
- 为了优化组播流量发送的路由,收到组播流量的最后一跳路由器,如果流量超过阈值(默认为0 kbps),会向第一跳路由器发送(S,G)join,以第一跳路由器到本地的SPT。当去往RP与第一跳路由器的“岔路路由器”时,“岔路路由器”会转发最后一跳路由器的(S,G)join给第一跳路由器,同时向RP发送一个(S,G)RP置为的prune报文,告知 RP本地不接受RPT接受流量。
- 第一跳路由器收到最后一跳路由器的(S,G)join,SPT建立完成,使用SPT转发组播流量。
选举RP有三种方式,静态RP、auto-RP以及BSRa
- 静态RP:有网络管理员手动指定。
- Auto-RP:该选举方式为C/S模型,C为CRP(Candidate RP),S为MA(Mapping Agency)。CRP周期性地向224.0.1.39发送announce报文,MA会监听224.0.1.39和224.0.1.40地址,仲裁出RP,然后通过224.0.1.40发送discovery报文,告知所有路由器RP的地址,所有路由器会监听该地址。
由于纯PIM-SM使用auto-RP时需要以组播方式发送announce报文,而发送的组播报文需要发送给RP,这使得纯PIM-SM模式下无法使用auto-RP模式,解决方案有:整网迁移使用sparse-dense-mode;或者所有路由器接口启用ip pim auto-rp listener,该命令可以在224.0.1.39和224.0.1.40组播组使用dense-mode。 默认情况下,静态RP的优先级会比auto-RP的优先级低。
- BSR:与auto-RP的用法类似,使用优先级来控制RP仲裁者BSRC来仲裁RP。
ip pim rp-address x.x.x.x acl #在组播域内静态指定RP地址,acl参数表示指定组播组的RP
ip pim rp-address x.x.x.x override #使静态RP的优先级高于auto-rp
ip pim send-rp-announce lookback 1 scope 5 #在定义了PIM的某种模式的lookback 1接口发送announce报文,成为CRP
ip pim send-rp-discovery lookback 1 scope 5 #在定义了PIM的某种模式的lookback 1接口发送discovery报文,成为MA
show ip pim rp-mapping #查看RP
ip pim sparse-mode #端口开启PIM Sparse-mode
ip pim sparse-dense-mode #端口开启PIM Sparse-Dense-mode
ip pim spt-threshold traffic [infinity] #最后一跳路由器上设置切换阈值
在密集模式中,DR无用,稀疏模式中DR发送(* ,G)join和(S,G)register报文。
拓扑如4.1.4中相同,组播中,将R2配置为RP
R2, R5
ip multicast-routing
interface fa0/0
ip pim sparse-mode
interface fa1/0
ip pim sparse-mode
interface fa1/1
ip pim sparse-mode
ip pim rp-address 2.2.2.2
R3, R4
ip multicast-routing
interface range fastEthernet 0/0-1
ip pim sparse-mode
ip pim rp-address 2.2.2.2
将R6加入到组播组239.2.2.2之后,从R5到RP上(R2,R4,R5)都有了(* , 239.2.2.2)的组播路由
(*, 239.2.2.2), 00:02:11/00:03:17, RP 2.2.2.2, flags: S
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/1, Forward/Sparse, 00:02:11/00:03:17
使用R1 ping 239.2.2.2,模拟R1向R6发送组播流量:
R1#ping 239.2.2.2 repeat 3
Type escape sequence to abort.
Sending 3, 100-byte ICMP Echos to 239.2.2.2, timeout is 2 seconds:
.
Reply to request 1 from 56.1.1.6, 508 ms
Reply to request 2 from 56.1.1.6, 160 ms
同时,所有组播路由器里有了(* , 239.2.2.2)和(12.1.1.1, 239.2.2.2)两条组播路由
(*, 239.2.2.2), 00:02:56/00:03:29, RP 2.2.2.2, flags: S
Incoming interface: FastEthernet0/0, RPF nbr 24.1.1.2
Outgoing interface list:
FastEthernet0/1, Forward/Sparse, 00:02:56/00:03:29
(12.1.1.1, 239.2.2.2), 00:00:16/00:02:43, flags: T
Incoming interface: FastEthernet0/0, RPF nbr 24.1.1.2
Outgoing interface list:
FastEthernet0/1, Forward/Sparse, 00:00:16/00:03:29
MSDP用于连接多个组播路由域,其通常运行在PIM-SM中,每台MSDP路由器彼此建立内部、外部邻接关系形成MSDP peer,类似于BGP的peer。本地路由器会通告彼此在本区域的active组播源,当邻居路由器检测到active组播源时,他们会向active组播源发送PIM-SM join信息。
- MSDP路由器使用TCP 639端口,较大的IP端口侦听,较低的IP端口建立TCP连接;
- 当组播源要发送第一个组播报文时,第一跳路由器会直接发送一个PIM注册消息给RP,RP使用注册消息来注册active组播源,以及将组播报文发送到本区域的共享树上;
- 由于配置了MSDP,RP也会将跃源(SA)type,length,value(TLV)消息给MSPD对端,SA消息中标识源、源发往的组播组和RP地址或者发送者的ID;
- 邻居收到SA TLV时会进行peer-RPF校验,来确保路径可以回到原始的RP:如果通过peer-RPF校验本地RP可以作为该组播源的RP,如果没有通过则会丢弃SA TLV消息;
- MSDP的peer-RPF和普通的RPF校验是不同的:peer-RPF校验的目的在于防止SA消息发生环路。RPF-peer校验可以使用6条规则(Juniper的6条peer-RPF规则),或者通过BGP/MBGP路由表来发现哪个peer是对应相应RP的下一跳。