²         交换机的默认行为是把多播帧向除源端口之外的所有端口扩散。 Cisco 执行专有的 CGMP 和非专有的 IGMP Snooping ,来协助管理网络中的多播流量。
交换机洪泛多播流量的原因是在桥接表中没有目的地址的表项。多播地址从不作为源地址出现。
²         默认情况下路由器不转发多播流量,除非它们具有多播能力,并有一个多播路由选择协议,例如 DVMRP Distance Vector Multicast Routing Protocol )或 PIM(Protocol-Independent Multicast)
一个网络管理员为一个应用分配一个多播第 3 层地址。接着从第 3 层多播地址中计算出第 2 层端口地址。配置一个多播应用时, NIC 将端口地址加入它的有效 MAC 地址列表中。通常这个列表由内置的 MAC 地址和任何用户配置的地址组成。只要工作站收到一个具有匹配的多播目的地址的帧时,接收者将帧发送给 CPU

Layer 3 Multicast Address
<1> 保留链路本地地址 (从不被 Router 转发,且必须保持在本地的 LAN 网段上,并且一直以 1 的生存时间进行发送)
224.0.0.1    本子网中的所有系统
224.0.0.2    本子网中的所有路由器
224.0.0.5    OSPF DROther
224.0.0.6    OSPF DR
224.0.0.9    RIPv2 路由器
224.0.0.10   EIGRP 路由器
224.. 0.0.12    DHCP Server/ 中继代理
224.0.0.13   所有 PIM 路由器
224.0.0.22   IGMP
224.0.0.25   Router to Switch Such as:RGMP- 路由器端口组管理协议)
<2> 全球范围地址 ( 用于组织间和跨越 Internet 的多播数据 )
224.0.1.0 ~ 238.255.255.255
<3> 受限范围地址 ( 限制到一个本地组或组织 )
239.0.0.0 ~ 239.255.255.255
<4>GLOP 地址(保留给已有一个保留 AS 号的组织)
233.0.0.0 /8
域的 AS 号嵌入在 233.0.0.8/8 范围的第 2 和第 3 个字节中。
例: AS 62010 被写成 16 进制的 F 23A ,分开两个字节 F2 3A 的结果是十进制的 242 58 ,这提供给子网 233.242.58.0, 它全球保留给 AS 62010 使用 .

Layer 2 Multicast Address
分配了一个第 3 层多播地址后,第 2 层多播地址会自动从这个 IP 地址中产生。
主机将 IP 地址后 23 比特复制到 MAC 地址的最后 24 位中,高比特为 0
MAC 多播前 3 字节( 24 比特)是 0x01-00-5E 。这是为多播保留的。
Layer3组播地址为28 bits,Layer2组播地址为23 bits,这样layer3组播地址的5个bits被忽略。至使 一个 MAC 多播对应 32 IP 多播。即一个第 2 层多播地址对应 32 个第 3 层多播。
将layer3组播地址转换为layer2组播地址方式:
1>取出layer3组播地址的后23位
2>前边加上layer2组播专用的 01.00.5e.
例:
224.0.0.1
1>后23位为00.0001
2>前边加上01.00.5e
3>结果为:0100.5e00.0001


Layer 2 Multicast vs. Layer 3 Multicast Address
IP to MAC:
- write down 0100.5e and ignore the first (from the left) octet of the IP address
- If the second octet of the IP is > 128, then subtract 128 from it (to compensate for the ignored 24th bit)
- convert the three octets to hex and copy into the MAC address
MAC to IP
- Drop the 0100.5e
- Convert each pair of nybbles left into decimal
- The valid multicast groups are then {224-239}.{x1,y1}.x2.x3 where y1 = the first decimal number + 128

PC’s Multicast Protocol IGMPv1,IGMPv2,IGMPv3
IGMP( 主机成员协议 ) 主要由多播主机使用,它通知本地多播路由器它们想加入一个特定多播组时并开始接收组流量。
使用通过 IGMP 获得的信息,路由器基于每个接口维护一张多播组成员表。
Cisco IOS 11.3(2)T 及以后的版本默认使用 IGMPv2 IGMPv3 可用于 Cisco IOS 12.0(15)S 及以后的版本。
IGMPv1 (隐式离开多播组)
IGMPv1 消息类型:
²         主机成员查询 (由路由器发起,默认为 60 s/t
²         主机成员报告
主机成员查询消息在第 3 层中的目的地址: 224.0.0.1 ;第 2 层地址: 01-00-5E-00-00-01 IGMP 头组地址: 0.0.0 .0 ,转换为网段上所有组的所有多播主机的查询。 IGMPv1 不能针对特定组查询
每个网段上只有一台路由器发布成员查询消息。 IGMPv1 中,由 DR 发出查询; IGMPv2 中,该网段上有最低 IP 地址的多播路由器发出查询。 3 个查询后没有特定多播组的成员报告,则路由器停止转发这个组的多播分组。
每个网段上只有一台主机发送主机成员报告。 主机接收到成员查询时,如果它想继续接收这个多播组的多播帧,它等待一个 10 秒的随机定时器过期后发送一个成员报告。如果在等待期间监控到同网段上另一个主机回复了一个主机成员报告,则它取消定时器并抑制报告。这个行为避免网段和路由器遭遇主机成员报告的洪泛。
IGMPv2 (显式离开多播组)
IGMPv2 消息类型:
²         0x11 – 成员查询 IGMPv2 允许对一个特定组查询)
²         0x12 – 版本 1 成员报告
²         0x16 – 版本 2 成员报告
²         0x17 – 离开组
路由器收到特定网段上的主机的离开组消息,不会立刻停止对该网段转发多播分组。 因为它保存了一张活动在子网上的惟一组成员列表,而不是成员的个别主机,所以在收到主机离开组消息后,它会发送对该网段的一个特定多播组查询,如果有其它机还想接收,它们会回复一个成员报告;否则路由器会超时这个查询分组,并停止转发多播分组到这个网段上。
IGMPv1 IGMPv2 互操作:
²         路由器使用 IGMPv1 ,主机混合使用 IGMPv1 IGMPv2 ,则主机必须使用 IGMPv1 。因为 IGMPv1 路由器不理解 IGMPv2 的成员离开消息。
²         路由器使用 IGMPv2 ,主机混合使用 IGMPv1 IGMPv2 ,则路由器只发送 IGMPv1 。因为 IGMPv1 主机不理解特定组的成员查询消息。如果 IGMPv2 主机发送了成员离开消息,路由器必须忽略它,因为它必须仍然发布常规的查询以防 IGMPv1 的成员仍在网段中。
²         IGMPv1 IGMPv2 路由器在同一网段中出现, IGMPv2 路由器必须被配置为 IGMPv1 ,且 IGMPv1 路由器不会发觉到 IGMPv2 路由器的存在。
IGMPv3 (源过滤支持)
它允许多播主机通知路由器它想接收哪个组的多播分组,以及期望这个分组来自哪个源,进而达到保留带宽的目的。
IGMPv3 支持明确定义主机希望接收的分组源,可以使用以下 2 种模式通知作为一个多播组的成员:
²         Include Mode :主机宣布作为一个多播组的成员,并指定它想要接收的分组源地址列表。
²         Exclude Mode :主机宣布作为一个多播组的成员,并指定它不想接收的分组源地址列表。为了接收所有源的多播分组( IGMPv2 默认),可以使用一个空 Exclude Mode 列表。



Switch’s Multicast Protocol
²         IGMP Snooping LAN 交换机检查或“嗅探”主机和路由器之间的 IGMP 分组中的一些第 3 层信息。将加入的主机的端口号放到交换机的多播表项,离开的主机从表中移除。
²         CGMP Cisco 专有的协议, CGMP 基于客户 / 服务器模型。路由器被认为一个 CGMP 服务器,交换机则是客户。 IP 多播路由器查看所有 IGMP 分组,因此当特定主机加入或离开多播组时可以通知交换机。交换机于是使用这个信息来构建一个转发表。
IGMP Snooping
IGMP 控制消息作为多播分组发送,不能从第 2 层多播数据中区分出多播数据与多播控制消息,所以交换机必须检查每个多播分组来确定其是不是控制消息。当数据高速传输时,在低端交换机上启动 IGMP Snooping 会严重影响性能。
IGMP Snooping 默认是全局启动的,它也可以基于每个 VLAN 启动或关闭。
IGMP Snooping Configuration
Swtich(config)#ip igmp snooping                                      // 全局开启 IGMP Snooping
Switch(config)#no ip igmp snooping vlan 2                             // 关闭 VLAN 上的 IGMP Snooping
Switch(config)#ip igmp snooping vlan 1 mrouter serial 0/1              // 指定到多播路由器的下一跳接口
在端口上检测到 IGMPv2 的离开消息后,无需发送特定多播组查询,立即从 IP 多播组中删除该端口
Switch(config)#ip igmp snooping vlan 1 immediate-leave              
Switch#show ip igmp snooping
Switch#show mac-address-table multicast [vlan vlan-id] [user | igmp-snooping] [count]


Multicast Packet Management
多播地址标识一个特定的传输会话,而非一个特定的物理目的。
分发树( Distribution Tree ):指定源子网和包含多播组成员的每个子网间的一条惟一转发路径。
²         源树( SPT ):根是多播流量的源,分支形成一棵到接收者的最短路径树。专用符号:( S,G
²         共享树( CBT ):根在网络中某个选定的汇合点( RP )的公共根。专用符号:( *,G

多播 TTL 门限:
多播 TTL 字段控制分组的生存时间。 TTL 功能防止分组由于路由选择的错误而永远循环下去。
启用多播的路由器为每个接口分配一个 TTL 门限,默认为 0 ,即转发所有的多播分组。比较分组 TTL 值和接口门限, TTL 值大于接口门限的分组被转发,路由器在将分组从接口发送出去时将分组的 TTL 值减 1 TTL 值等于或小于门限的分组被丢弃。
TTL 接口门限可配置的范围: 0 255

反向路径转发( Reverse Path Forwarding ):对照单播路由表检查来源是否正确
<1> 路由器在单播路由选择表中查找源地址来决定它是否在位于正确的接口上到达。
<2> 如果分组位于的接口上到达, RPF 检查成功,转发分组。
<3> 如果 RPF 检查失败,则丢弃分组。
在多台路由器与一个 LAN 网段相连的多层交换网络中,只有一台 PIM 指定路由器将来自信源的多播数据包转发到与出站接口相连的接收方。

Router’s Multicast Protocol
PIM 不依赖与任何的 IP 路由选择协议,不维护独立的多播路由表,只使用已有的路由表执行 RPF 检查。
协议无关多播密集模式( Protocol-Independent Multicast Dense-Mode ):
PIM-DM 假定多组成员密集分布在整个网络中并且带宽充足,且大多数主机都属于这个组。通过在网络中每 3 分一次的洪泛与剪枝来建立和维护分发树。 Dense-Mode 使用 SPT 以“推原则”来发送( S G )多播分组。即不管你是否需要,先发送给你,在你不要时,进行剪枝。
协议无关多播稀疏模式( Protocol-Independent Multicast Sparse-Mode ):
PIM-SM 被认为是更有效的多播解决方案,它是部署 Auto-RP 时推荐使用的模式。
PIM-SM 假定多播成员稀疏分布在整个网络中,并带宽不太充裕。注意:稀疏并不意味着成员少,而是它们的分布广泛。这时洪泛会严重的浪费带宽,进而可能引发其它的性能问题。 Sparse-Mode 使用 CBT 从一棵空树开始,以一种“拉原则”来发送( * G )多播分组。即你需要时才发送给你,前提必须注册
PIM-SM 模式下,发送者首先把数据发送到 RP (汇合点),当一个接收者想接收数据时,到 RP 去注册。当数据流从发送者到 RP 再到接收者时,路径上的路由器会自动优化路径为 SPT 来移去不必要的跳。

PIM DR
如果在两台PIM路由器之间有一条直接连接,则它们是邻居。
DR 选举仅在BMA网络中,P2P链路上不需要,因为所连接的路由器是直连主机系统的有效DR
DR 的选举过程对于PIM-DMPIM-SM是一样的。连接到BMA网络上的每台PIM路由器发布周期的PIM路由器查询到LAN上,具有最高IP地址的PIM路由器成为LANDR
BMA 网络上,DR用来轮询LAN的主机组成员,但是所有的PIM路由器都收到来自主机的应答。

Auto-RP
大型网络中手式配置多个多播汇合点可能导致不一致的RP配置,并引起连接问题。Auto-RP默认关闭。
Auto-RP Cisco私有的协议,它在一个运行PIM-SM网络中自动发布组到RP的映射。它也允许根据组参与者的位置在不同RP之间进行负载均衡和RP分配。
RP Candidate 发送的CISCO-RP-ANNOUNCE通告消息到RP映射代理(224.0.1.39),然后RP映射代理发送CISCO-RP-DISCOVERY发现消息(包括一致的组到RP的映射关系)到所有DR224.0.1.40)。这种方法允许所有DR自动发现使用哪一个RP连接接收者与发送者。

Multicast Routing Protocol Configuration
注意:正常使用多播并完成 RPF 检查,必须在每个接口启动多播。
全局启用 ip 多播路由选择:
Router(config)#ip multicast-routing
在接口上启动 PIM
Router(config)#interface serial 0/1
Router(config-if)#ip pim sparse-mode
Router(config-if)#ip pim dense-mode
Router(config-if)#ip pim sparse-dense-mode
更改 IGMP 版本:
Router(config-if)#ip igmp version { 3 | 2 | 1 }
定义接口 TTL 门限:
Router(config-if)#ip multicast ttl-threshold ttl
手动指定 RP 地址:
Router(config)#ip pim rp-address rp-address
启动 Auto-RP, 并做为 RP Candidate
Router(config)#ip pim send-rp-announce type number Scope ttl group-list access-list-number
配置为 RP 映射代理:
Router(config)#ip pim send-rp-discovery scope ttl
让路由器加入一个多播组,使其响应一个多播分组:
Router(config)#ip igmp join-group group-address
显示 PIM 邻居:
Router(config)#show ip pim neighbor