创建时间:2010-01-01
文章属性:转载
文章来源:http://www.godupgod.com
文章提交:Longhai
作者:godupgod
交换机的工作模式是它会学习接收到的所有帧的源MAC地址,并存入交换机的MAC地址表,而多播MAC地址永远不会作为一个数据包的源MAC地址(一般都是作为目的MAC地址)所以交换机永远不会将多播MAC地址存入MAC地址表中,所以,每次收到的多播流量都会以泛洪的形式发送出去。
由于默认情况下,局域网交换机会在广播域中泛洪多播流量,这会消耗大量的带宽。Cisco Group Management Protocol (CGMP) 和 Internet Group Management Protocol (IGMP) snooping 主要是用来限制交换机网络中多播的流量。
解决交换机的带宽问题有3种方法:
多播地址是从224.0.0.0到239.255.255.255,他们也被叫做GDA(Group Destination Addresses)
每个GDA被关联到一个MAC地址,这些MAC地址以01-00-5e开头,后面的23位以多播地址的16进制转换而成
但是多播地址和MAC地址是一对多映射,因为多播地址的第一个八位没有出现在MAC地址中,所以只要后面的3个八位地址相同,他们都映射到一个MAC地址
存在一些保留的多播地址:
通常情况下224.0.0.1到224.0.0.255为保留地址,用在不同的协议中(如OSPF,EIGRP,HSRP),所以不推荐用户使用这些地址,同时CGMP和IGMP snooping对这些保留地址范围也不起作用
IGMP主要用来为用户在路由器中注册,以便接收到特定组的流量
Membership Query 是由路由器定期发送来查询本网段是否还有用户接收特定组的流量
Membership report 是由用户发送来告诉路由器他们希望接收哪些多播组的流量
用户的Membership report会在第一次想接收组的流量或者对路由器的Membership Query进行回复时发送。包含下列的信息:
二层的信息:
三层的信息:
路由器的Membership Query会发送到多播地址:224.0.0.1,这些查询使用0.0.0.0作为IGMP报文的GDA。作为组的成员必须对这些查询做出响应,否则在三次尝试后,路由器会停止发送这个组的流量到这个网段。路由器会保留每个在本网段中存在组员的多播组的条目,和这些流量发送到客户的出口。如果三次尝试都失败,那么这些多播组的地址和出站接口的条目都会删除。
注意:
IGMPv1没有离开多播组的机制。如果一个用户不再想接收组的流量,并且这是用户是网段中这个组最后的用户,那只能等到路由器三次尝试查询失败,路由器才会删除这个多播条目
IGMPv2的报文与IGMPv1不同的是它将版本字段和消息类型字段融合,把未使用字段作了"最大响应时间"字段。IGMPv2报文的消息类型字段定义了四种消息类型:
IGMPv2的新的特性:
IGMPv3支持的消息类型:
还支持IGMPv1和V2的消息类型:
IGMPv3还增加了多播组源的过滤,主机在加入某多播组G 时,能够明确的要求接收或不接收某特定多播源S 发出的多播信息,这个特性称为Source Specific Multicast(SSM )
IGMPv3的SSM特性也需要用户操作系统的支持,如WinXP,FreeBSD和LINUX等才支持IGMPv3
IGMPv3也需要路由器和交换机的支持。但是当交换机上有一个IGMPv3的用户的时候,交换机的IGMP snooping必须关闭,当IGMP snooping关闭后,我们可以在交换机上手动建立MAC地址映射来避免产生泛洪多播流量。
当在网络中使用了IGMPv3,交换机只有在CGMP Fastleave特性没有开启的情况下,才能正常使用CGMP,如果要使用CGMP Fastleave特性,则必须返回IGMPv2
网络中,同时存在IGMPv1和IGMPv2的用户,这时每个网段中,只有一台路由器成为查询路由器,在IGMPv1中,查询路由器是由多播路由协议选出的,在IGMPv2中,则是所有路由器中IP地址最低的担任。
网络中同时存在使用IGMPv1,IGMPv2和IGMPv3的用户
默认情况下,一个子网中是没有用户注册某个特定的组的,路由器不会前传某个组的多播流量到这个子网。只有当路由器收到了用户为了加入某个组而发送的IGMP report,路由器将组地址放入多播路由表并且开始前传那个组的流量
配置步骤:
1.在全局模式下启用多播路由
ip multicast-routing
2.在各个接口上配置多播路由协议
ip pim dense-mode
3.检视IGMP
show ip igmp interface
show ip igmp group
show ip mroute
4.配置路由器在接口上发送IGMP report
ip igmp join−group [GDA_ip_address]
ip igmp version [1 | 2 | 3]
CGMP用来在二层网络限制多播流量。因为交换机不能查看三层数据包,也不能区分出IGMP包。使用了CGMP,路由器告诉交换机多播组用户的接口,只有路由器能够产生CGMP数据包,交换机只是监听CGMP数据包
CGMP有两种数据包:
数据包内的信息为一个或多个MAC地址对:
CGMP的帧是以太帧,目的MAC地址是01-00-0c-dd-dd-dd,并且他的Subnetwork Access Protocol (SNAP) 报头值是0x2001。包含下列部分:
默认情况下,交换机只会监听自己MAC地址表中存在的多播地址,当你运行了CGMP后,地址01-00-0c-dd-dd-dd会被加入MAC地址表:
GDA |
USA |
Join/Leave |
Meaning |
Mcast MAC |
Client MAC |
Join |
添加一个接口到组 |
Mcast MAC |
Client MAC |
Leave |
从组中删除一个接口. |
00-00-00-00-00-00 |
Router MAC |
Join |
指定一个路由器接口 |
00-00-00-00-00-00 |
Router MAC |
Leave |
删除一个路由器接口 |
Mcast MAC |
00-00-00-00-00-00 |
Leave |
删除某个组地址 |
00-00-00-00-00-00 |
00-00-00-00-00-00 |
Leave |
删除所有的组地址 |
交换机首先必须学习到所有的连接路由器的端口以便能自动学习到新创建的多播条目。CGMP路由器启动后,会发送一个 CGMP join数据包,GDA为00-00-00-00-00-00,USA 为路由器自己的 MAC 地址(上表中第三种)。路由器 60s 发送一次来保活。 交换机通过接收路由器发送的CGMP join 报文,学习到了路由器的接口。此外还能够在交换机上静态指定连接路由器的接口。
当有主机发送igmp report 时,路由器向交换机发送cgmp join数据包,通告主机MAC地址与组MAC 地址,交换机将地址加入 CAM表中。USA为用户主机的MAC 地址,GDA为多播组的MAC 地址;
通过CGMP学习到的静态条目是永久的,除非这个VLAN的生成树拓扑发生变化,或者路由器发送CGMP Leave message(上表中的最后一个)
当用户使用的是IGMPv1,他不能发送IGMP Leave报文。路由器只有在三次IGMP查询失败后,才会发送CGMP Leave 报文。这也意味着只要有一个用户对这个多播流量感兴趣,那么交换机上的所有曾经属于这个组的接口都不会被删除。
为了对应IGMPv2的Leave机制,Cisco增加了CGMPv2,称为CGMP Fast-Leave
CGMP Fast-Leave允许带有交换机侦测用户发送到路由器的IGMPv2 Leave 报文,当交换机侦测到了一个Leave报文,他启动一个查询响应计时器,并发送一个查询报文到那个接收到Leave报文的端口,来查询这个接口是否还有用户在这个组中。如果在接收到CGMP Join报文之前计时器超时,那么这个发送Leave 报文的端口就会被从这个多播组中修剪掉。如果交换机上这个端口是这个组的最后一个端口,交换机会发送IGMP Leave 报文到所有的路由器端口。接下去路由器会进入普通的查询过程。因为没有收到回复,路由器会将那个接口从组中删除,并发送一个CGMP Leave 报文到交换机,GDA 为组播组MAC 地址,USA为要退出的组的用户的MAC地址,交换机从静态MAC地址表中删除这个组地址。Fast-Leave进程能够优化所有用户的网络带宽,甚至是在多个多播组同时使用的环境下
当CGMP Leave启用的时候,两个条目会加入到MAC地址表:
01-00-5e-00-00-01
01-00-5e-00-00-02
IGMP Leave使用多播地址224.0.0.2
IGMP Query使用多播地址224.0.0.1
注意:
CGMP Leave因为和HSRP冲突,所以默认是关闭的,HSRP使用MAC地址01-00-5e-00-00-02,和IGMPv2 Leave使用的MAC地址相同。
CGMP不会修剪映射到MAC地址范围01-00-5E-00-00-00到01-00-5E-00-00-FF的多播地址,这些多播地址范围从224.0.0.0到224.0.0.255是作为保留多播地址,用来发送本地IP多播流量到三层的设备
A source−only network is a segment with only a source multicast and no real client. Therefore, there is a chance that no IGMP reports are generated in that segment. CGMP still needs to restrict the flooding of this source (for router use only)however. If a router detects multicast traffic on one interface with no IGMP report, it is identified as a multicast source−only network. The router generates a CGMP Join message for itself, and the switch simply adds this group (with only the router port).
一个只有多播组的源(既该网段上没有组的用户),会发生在这个网段上没有IGMP reports产生的情况。CGMP要能够减少泛洪到这个网段。然而,当一个路由器在一个接口上检测到多播流量,而这个网段没有IGMP report,这就代表这是一个只有源的网络。路由器会为他自己产生CGMP Join 报文,而交换机会简单的将这个路由器的接口加入到这个多播组。
IGMP Snooping是另外的一种特性,他能够使交换机直接捕获IGMP帧。
IGMP Snooping从他的名字可以看出,他是一个交换机的特性,允许交换机“监听”用户和路由器之间的IGMP流量。当交换机监听到一个用户发送的IGMP report,交换机会将用户的接口加入到那个多播组的GDA列表中。而当交换机监听到一个IGMP Leave报文,他会将用户的端口从交换机的MAC地址表中去除。
启用IGMP Snooping的交换机为了侦测路由器的接口会监听下列报文:
在启用IGMP Snooping的交换机会将上述的MAC地址条文加入到MAC地址表。当一个路由器接口被侦测到以后,交换机会将这个接口加入到这个VLAN中所有的GDA表中。
这里有两种情况
情况A:用户A是这个网段中第一个要加入组的用户
情况B:用户B是网段中第二个要加入到相同的多播组的用户
注意:为了保持组成员的存在,多播路由器会每60秒发送一个IGMP query。这个查询会被交换机截获,并且前传到所有的交换机接口。所有这个组的用户会响应这个query。但是因为交换机同样也会截获用户发送的report,用户之间是看不到其他用户发送的report的。因此交换机对于所有用户发送的响应report,会自己代理向路由器发送report,所有的用户只发送一个report(而不是每个用户发送一个)。
假设用户A想要离开这个组,但是用户B还在这个组中。
现在假设用户B想要离开多播组,并且用户B是网段中这个组的最后的用户。
在某些网络中,因为硬件的限制,你不能在所有的交换机上运行IGMP snooping。这样就必须在这个网络中的某些交换机上运行CGMP。
注意这是一个特殊的例子。运行IGMP snooping的交换机侦测到了CGMP报文,并且侦测到了这个网络中某些交换机正在运行CGMP。因此,他会进入IGMP-CGMP模式并且关闭代理reporting功能。这对于正确操作CGMP是绝对必要的,因为路由器创建CGMP Join,使用的是IGMP report的源MAC地址。运行CGMP的路由器必须要能够看见所有的IGMP report,因此交换机的代理reporting必须关闭。
If the segment contains only one multicast server (multicast source) and no client, you might end up with a
situation where you do not have any IGMP packets in that segment, but you do have a lot of multicast traffic.
In this case, the switch simply forwards the traffic from that group to everybody in the segment. Fortunately, a
switch running IGMP snooping is able to detect these multicast streams and adds a multicast entry for that
group with only the router port. These entries are flagged internally as mcast_source_only and are aged
out each 5 minutes, or when the router port goes away. Note that even after this aging, the address is relearned
within a few seconds if the traffic continues.
当一个网段中只有一个多播服务器(多播源)而没有用户,你会发现这个网段中没有IGMP数据包,但是却又很多多播流量。这种情况下,交换机会简单的前传源的流量到网段中的每一个人。幸运的是,一个运行IGMP snooping的交换机能够侦测到这些多播流量,并且为路由器的端口增加一个条目。这些条目被标记为mcast_source_only并且每5分钟老化一次,直到这个路由器接口关闭。注意即使老化后,地址条目都会在重新有流量的几秒内重新学习。
使用CGMP,GDA会被映射到01−00−5e−00−00−xx的范围,并且永远不会被IGMP snooping修剪掉