网络要求

要求
- AS100与AS200要部署域间组播。RB是AS100RP,RC是AS200-PIM-SM2-RP RE是PIM-SM3-RP。要求组播客户端可以通过组播地址234.235.236.237访问组播服务器
网络规划
-
AS100与AS200区域IGP为OSPF 区域间运行BGP 实现全网链路互通 RB与RC作为AS区域边界 建立EBGP邻居
-
全区域路由配置PIM以及组播路由功能 PIM采用SM形式 配置RB,RC,RE为各PIM区域RP PIM区域接口配置bsr服务边界 RB-RC建立MBGP组播邻居
-
组播客户端上行接口配置igmp 且RD使能igmp功能 用于侦听组播客户端join请求
组播互通过程

第一部分 全网链路互通
如果您以及实现全网络互联互通 可跳过这部分 RE、RD配置基本相似 RF本实验暂未使用
RA
kotlin
#
ospf 1 route-id 4.4.4.4
#
interface GigabitEthernet0/0/2
ip address 192.168.20.254 255.255.255.0
ospf 1 area 0.0.0.0
#
interface GigabitEthernet0/0/1
ip address 10.12.2.2 255.255.255.0
ospf 1 area 0.0.0.0
RB
python
# 配置BGP与OSPF 路由引入 RC与其类似
#
ospf 1 router-id 1.1.1.1
#
interface LoopBack0
ip address 1.1.1.1 255.255.255.255
ospf 1 area 0.0.0.0
#
interface GigabitEthernet0/0/1
ip address 10.12.2.1 255.255.255.0
ospf 1 area 0.0.0.0
#
interface GigabitEthernet0/0/2
ip address 10.12.1.1 255.255.255.0
bgp 100
router-id 1.1.1.1
peer 10.12.1.2 as-number 200
#
address-family ipv4 unicast
import-route ospf 1 allow-direct
peer 10.12.1.2 enable
#
address-family ipv4 multicast
import-route ospf 1 allow-direct
peer 10.12.1.2 enable
RC
python
#
ospf 1 router-id 2.2.2.2
#
interface LoopBack0
ip address 2.2.2.2 255.255.255.255
ospf 1 area 0.0.0.0
#
interface GigabitEthernet0/0/0
ip address 10.23.2.2 255.255.255.0
ospf 1 area 0.0.0.0
#
interface GigabitEthernet0/0/1
ip address 10.23.1.2 255.255.255.0
ospf 1 area 0.0.0.0
#
interface GigabitEthernet0/0/2
ip address 10.12.1.2 255.255.255.0
#
bgp 200
router-id 2.2.2.2
peer 10.12.1.1 as-number 100
#
address-family ipv4 unicast
import-route ospf 1 allow-direct
peer 10.12.1.1 enable
#
address-family ipv4 multicast
import-route ospf 1 allow-direct
peer 10.12.1.1 enable
RD
kotlin
#
ospf 1 router-id 3.3.3.3
#
interface LoopBack0
ip address 3.3.3.3 255.255.255.255
ospf 1 area 0.0.0.0
#
interface GigabitEthernet0/0/1
ip address 10.23.1.3 255.255.255.0
ospf 1 area 0.0.0.0
验证BGP单播邻居关系

验证MBGP邻居关系

查看BGP组播路由

查看路由条目

第二部分 组播配置
RA
kotlin
pim
multicast routing
interface GigabitEthernet0/0/2
pim sm
interface GigabitEthernet0/0/1
pim sm
RB
kotlin
# 全接口启用PIM-SM 配置RP、MSDP、建立MSDP邻居 开启组播路由 配置BSR服务边界
pim
c-bsr 1.1.1.1
c-rp 1.1.1.1 # 配置PIM区域RP
multicast routing
msdp
encap-data-enable
peer 10.12.1.2 connect-interface GigabitEthernet0/0/2 # 建立MSDP邻居
interface GigabitEthernet0/0/2
pim sm
interface GigabitEthernet0/0/2
pim sm
pim bsr-boundary # PIM-BSR服务边界
RC
kotlin
# 全接口启用PIM-SM 配置RP、MSDP、建立MSDP邻居 开启组播路由 配置BSR服务边界
pim
c-bsr 2.2.2.2
c-rp 2.2.2.2
msdp
encap-data-enable
peer 10.12.1.1 connect-interface GigabitEthernet0/0/2
peer 10.23.1.3 connect-interface GigabitEthernet0/0/1
interface GigabitEthernet0/0/1
pim sm
pim bsr-boundary
interface GigabitEthernet0/0/0
pim sm
interface GigabitEthernet0/0/2
pim sm
pim bsr-boundary
RD
kotlin
# 配置PIM IGMP 组播路由功能
multicast routing
pim
igmp
interface GigabitEthernet0/0/0
pim sm
interface GigabitEthernet0/0/1
igmp enable # 连接组播客户端侧开启igmp
RA查看RP地址

RB查看MSDP邻居

RD查看IGMP组

组播测试
组播源配置

组播主机配置
因为PIM-SM 模式为Pull形式 需主机主动发起Join请求 我们使用IPOP发送模拟报文

验证IGMP是否生效
在IGMP组 我们已经发现我们想要的组播组
PIM生成流程
RD正常接受下游主机客户端的Join请求 且上游接口指向PIM-RP(RC路由器)
还未启动组播服务器时 RC无法找到上游接口 也就无法建立完整PIM树
现在我们开始运行组播服务器
此时再看RC 已经收到来自RB的msdp-sa
并且生成完成的PIM路由 即上游接口以及组播服务器地址
由此我们可以发现 234.235.236.237已经生成完整的PIM树
并且通过抓包 我们也发现了大量的测试组播包 到此实验成功
扩展知识
IGMP的主要功能是在主机(组播组成员)和与其直接相连的组播路由器之间建立和维护组播组成员关系。不同版本的IGMP(v1, v2, v3)报文类型和作用略有不同,下面以最常用和功能最全的IGMPv2 和IGMPv3为例进行说明。
IGMPv2 报文类型及作用
IGMPv2 是应用非常广泛的版本,它定义了三种报文类型。
1. 成员关系报告(Membership Report - "Join")
- 类型值:0x16
- 发送者 :希望加入 组播组或响应查询的组播客户端。
- 作用 :
- 主动加入 :当主机上的应用程序想要接收某个组播组(例如G)的流量时,它会立即主动向路由器发送一个Report报文,声明"我要加入组G"。这通常被称为"IGMP Join"行为。
- 响应查询:当主机收到路由器的通用组查询或特定组查询后,如果它仍然对某个组播组感兴趣,它会发送Report报文作为回应,告诉路由器"请继续为组G转发流量"。
- 工作过程 :为了防止网络中出现大量同时发送的Report报文,主机在发送Report前会启动一个随机延时计时器。第一个超时并发送Report的主机代表了整个组,其他监听的主机会取消自己的计时器,这个过程称为报告抑制。
2. 通用组查询(General Query)
- 类型值:0x11
- 发送者 :组播路由器。
- 作用 :
- 发现成员:路由器周期性地(默认每125秒)向本地网络的所有主机(目的地址224.0.0.1)发送通用组查询。
- 维护成员关系 :它是在询问:"在这个网络里,有没有任何组播组的成员?"任何对任何组播组感兴趣的主机,都会按照报告抑制机制,为它们所在的组发送Membership Report。
- 判断超时:如果路由器发送了多次查询后,某个组播组始终没有主机报告,路由器就认为该组已无成员,从而停止转发该组播流量。
3. 离开组(Leave Group)
- 类型值:0x17
- 发送者 :希望离开 组播组的组播客户端。
- 作用 :
- 主动离开 :当主机不再需要接收某个组播组(例如G)的流量时,它会向所有路由器的组播地址(224.0.0.2) 发送一个Leave报文。
- 快速响应:这个报文的作用是通知路由器:"我们组G有人要离开了,你赶紧确认一下还有没有别人在看。" 这允许路由器快速做出反应,而不是傻傻地等到下一次通用查询超时。
- 后续动作 :路由器收到Leave报文后,会立即向该组G发送特定组查询,询问是否还有成员。如果没有主机回应Report,路由器才会停止转发。
IGMPv3 报文类型及作用
IGMPv3 是目前的主流版本,它最重要的增强是支持源过滤 ,即主机不仅可以指定加入哪个组,还可以指定只接收来自特定源 或排除特定源的组播流量。
IGMPv3 的报文类型简化为了两种,但其内容更加复杂。
1. 成员关系报告(Version 3 Membership Report)
- 类型值:0x22
- 发送者:组播客户端。
- 作用 :
- 它包含了主机想要接收的组播地址 以及对应的源地址列表。
- 主机通过一个Report报文,可以同时声明对多个组播组(或特定源)的成员关系。
- 模式 :
- INCLUDE 模式 :表示只希望接收来自指定源列表 的、发往该组播组的流量。
- 例如:"我要加入组G,但只接收来自源S1和S2的流量。"
- EXCLUDE 模式 :表示希望接收来自除了指定源列表以外任何源 的、发往该组播组的流量。
- 例如:"我要加入组G,但不要来自源S3的流量,其他的我都要。"
- INCLUDE 模式 :表示只希望接收来自指定源列表 的、发往该组播组的流量。
- 触发时机 :
- 主机启动时或应用程序改变订阅状态时。
- 为了响应路由器的查询。
2. 查询(Version 3 Query)
- 类型值:0x11(与v2相同,但内容更丰富)
- 发送者:组播路由器。
- 作用 :IGMPv3的查询报文有三种子类型,功能更精细。
- 通用组查询:与v2类似,查询网络上任何组播组的任何源的成员。
- 特定组查询 :查询网络上特定组播组的成员。
- 特定组与源查询:这是v3新增的强大功能。路由器可以查询:"对于组G,还有没有人要接收来自特定源列表(S1, S2, ...)的流量?" 这主要用于当网络拓扑变化时,精确地确认成员关系,避免流量中断。
总结对比表
报文名称 | IGMP版本 | 发送者 | 主要作用 | 关键特点 |
---|---|---|---|---|
成员关系报告 | v1, v2, v3 | 主机 | 声明加入/维持组成员身份 | v2/v3可主动发送;v3支持源过滤(INCLUDE/EXCLUDE模式) |
通用组查询 | v1, v2, v3 | 路由器 | 周期性发现和维护所有组成员 | 目的地址为224.0.0.1 (所有主机) |
离开组 | v2, v3 | 主机 | 通知路由器自己离开某个组 | 实现快速离开机制,减少网络延迟 |
特定组查询 | v2, v3 | 路由器 | 在收到Leave后,确认特定组是否已无成员 | 目的地址为要查询的组播组地址 |
特定组与源查询 | 仅 v3 | 路由器 | 精确查询特定组和特定源的成员关系 | 支持复杂的源过滤成员关系维护 |