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

Switch’s Multicast Protocol
²         IGMP SnoopingLAN交换机检查或“嗅探”主机和路由器之间的IGMP分组中的一些第3层信息。将加入的主机的端口号放到交换机的多播表项,离开的主机从表中移除。
²         CGMPCisco专有的协议,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值减1TTL值等于或小于门限的分组被丢弃。
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以“推原则”来发送(SG)多播分组。即不管你是否需要,先发送给你,在你不要时,进行剪枝。
协议无关多播稀疏模式(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-RPCisco私有的协议,它在一个运行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