CGMP和IGMP Snooping
创建时间: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种方法:
- 在交换机上配置静态的多播MAC地址到用户接口的映射
- 使用CGMP,运行CGMP的多播路由器能够将用户发送给自己的的IGMP报文再通知给交换机
- 使用IGMP Snooping,在这种模式下交换机会自己截取客户发送的IGMP消息,并根据IGMP消息更新自己的MAC地址表
多播地址:
多播地址是从224.0.0.0到239.255.255.255,他们也被叫做GDA(Group Destination Addresses)
每个GDA被关联到一个MAC地址,这些MAC地址以01-00-5e开头,后面的23位以多播地址的16进制转换而成
- 239.20.20.20 corresponds to MAC 01−00−5e−14−14−14.
- 239.10.10.10 corresponds to MAC 01−00−5e−0a−0a−0a.
但是多播地址和MAC地址是一对多映射,因为多播地址的第一个八位没有出现在MAC地址中,所以只要后面的3个八位地址相同,他们都映射到一个MAC地址
存在一些保留的多播地址:
- 224.0.0.1 − All multicast−capable hosts.
- 224.0.0.2 − All multicast−capable routers.
通常情况下224.0.0.1到224.0.0.255为保留地址,用在不同的协议中(如OSPF,EIGRP,HSRP),所以不推荐用户使用这些地址,同时CGMP和IGMP snooping对这些保留地址范围也不起作用
Internet Group Management Protocol
IGMP主要用来为用户在路由器中注册,以便接收到特定组的流量
IGMPv1
- Version: 1
- Type: 两类的IGMP消息:
1 = Membership Query
2 = Membership Report - Checksum
- GDA
Membership Query 是由路由器定期发送来查询本网段是否还有用户接收特定组的流量
Membership report 是由用户发送来告诉路由器他们希望接收哪些多播组的流量
用户的Membership report会在第一次想接收组的流量或者对路由器的Membership Query进行回复时发送。包含下列的信息:
二层的信息:
- Source MAC:Host MAC address
- Destination MAC:Destination MAC for GDA
三层的信息:
- Source IP:IP address of the host
- Destination IP:GDA
路由器的Membership Query会发送到多播地址:224.0.0.1,这些查询使用0.0.0.0作为IGMP报文的GDA。作为组的成员必须对这些查询做出响应,否则在三次尝试后,路由器会停止发送这个组的流量到这个网段。路由器会保留每个在本网段中存在组员的多播组的条目,和这些流量发送到客户的出口。如果三次尝试都失败,那么这些多播组的地址和出站接口的条目都会删除。
注意:
IGMPv1没有离开多播组的机制。如果一个用户不再想接收组的流量,并且这是用户是网段中这个组最后的用户,那只能等到路由器三次尝试查询失败,路由器才会删除这个多播条目
IGMPv2
IGMPv2的报文与IGMPv1不同的是它将版本字段和消息类型字段融合,把未使用字段作了"最大响应时间"字段。IGMPv2报文的消息类型字段定义了四种消息类型:
- 0x11 - Membership Query
- 0x12 - IGMPv1 Membership Report
- 0x16 - Version 2 Membership Report
- 0x17 - Leave Group
IGMPv2的新的特性:
- IGMP Leave Message:当一个用户想要离开一个组,他能够发送一个Leave Group IGMP报文到地址224.0.0.2(而不是像IGMPv1那样什么都不做,等着被路由器清除)
- 路由器也能够发送一个特定的Membership Query,以具体的GDA来代替0.0.0.0,查询某个具体组的是否还有用户
IGMPv3
IGMPv3支持的消息类型:
- 0x11 - Membership Query
- 0x22 - Version 3 Membership Report
还支持IGMPv1和V2的消息类型:
- 0x12 - Version 1 Membership Report
- 0x16 - Version 2 Membership Report
- 0x17 - Version 2 Leave Group
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的用户,这时每个网段中,只有一台路由器成为查询路由器,在IGMPv1中,查询路由器是由多播路由协议选出的,在IGMPv2中,则是所有路由器中IP地址最低的担任。
- 情况一:路由器运行IGMPv1:
路由器不认识用户发出的IGMPv2 report,因此所有的用户必须发送IGMPv1 report - 情况二: 路由器运行IGMPv2:
运行IGMPv1的用户不认识交换机发出的IGMPV2 query。路由器只能使用IGMPv1,同时也失去了离开组的功能 - 情况三:同一网段上同时存在IGMPv1路由器和IGMPv2路由器:
运行IGMPv1的路由器没法发现运行IGMPv2的路由器,因此IGMPv2的路由器必须被配置为运行IGMPv1,很有可能产生选举查询路由器的错误
IGMPv1v2和IGMPv3的兼容性
网络中同时存在使用IGMPv1,IGMPv2和IGMPv3的用户
- 情况一:路由器运行IGMPv1v2:
因为路由器不认识IGMPv3 reports,所以所有的用户必须使用IGMPv1或IGMPv2 - 情况二:路由器运行IGMPv3:
运行IGMPv1v2的用户不认识IGMPv3 query。路由器必须用户认识的最低版本的IGMP。 - 情况三:同一网段中,同时存在运行不同IGMP版本的路由器:
运行低版本IGMP的路由器不认识高版本的路由器,所以所有的路由器必须被配置使用最低的版本。
路由器运行IGMP
默认情况下,一个子网中是没有用户注册某个特定的组的,路由器不会前传某个组的多播流量到这个子网。只有当路由器收到了用户为了加入某个组而发送的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]
Cisco Group Management Protocol
CGMP 帧和消息类型
CGMP用来在二层网络限制多播流量。因为交换机不能查看三层数据包,也不能区分出IGMP包。使用了CGMP,路由器告诉交换机多播组用户的接口,只有路由器能够产生CGMP数据包,交换机只是监听CGMP数据包
CGMP有两种数据包:
- Join 路由器向交换机通告向多播组中加入一个组员
- Leave 路由器向交换机通告从多播组中删除一个组员
数据包内的信息为一个或多个MAC地址对:
- 组目的地址 (Group Destination Address) GDA
- 单播源地址 (Unicast source address) USA
CGMP的帧是以太帧,目的MAC地址是01-00-0c-dd-dd-dd,并且他的Subnetwork Access Protocol (SNAP) 报头值是0x2001。包含下列部分:
- Version: 1 or 2
- Message Type: Join or Leave
- Count: 单播/多播地址队的数量
- GDA: 48位的多播组的MAC地址
- 单播源地址 (USA): 想要加入某个多播组的用户的48位的MAC单播地址
默认情况下,交换机只会监听自己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 报文,学习到了路由器的接口。此外还能够在交换机上静态指定连接路由器的接口。
通过CGMP加入一个组
当有主机发送igmp report 时,路由器向交换机发送cgmp join数据包,通告主机MAC地址与组MAC 地址,交换机将地址加入 CAM表中。USA为用户主机的MAC 地址,GDA为多播组的MAC 地址;
- 一个新的用户为了请求接收某个多播地址的流量,发送IGMP Membership report报文到路由器
- 路由器接收到IGMP报告,发送CGMP join报文到交换机。通告主机MAC地址与组MAC 地址,GDA地址为多播组的MAC地址,USA地址为用户主机的MAC地址
- 启用了CGMP的交换机监听01-00-0c-dd-dd-dd地址。开始在CAM表中查找用户主机的MAC地址(USA)。如果存在,交换机就知道哪个接口连接到那个用户,并且运行下列步骤:
♦.如果GDA条目不存在,则创建GDA静态条目,并与USA接口关联
♦.如果GDA条目存在,则将USA接口地址加入到GDA列表中
通过CGMP离开一个组
通过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多播流量到三层的设备
CGMP和只有多播源的网络
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 Snooping是另外的一种特性,他能够使交换机直接捕获IGMP帧。
IGMP Snooping 预览
IGMP Snooping从他的名字可以看出,他是一个交换机的特性,允许交换机“监听”用户和路由器之间的IGMP流量。当交换机监听到一个用户发送的IGMP report,交换机会将用户的接口加入到那个多播组的GDA列表中。而当交换机监听到一个IGMP Leave报文,他会将用户的端口从交换机的MAC地址表中去除。
学习路由器端口
启用IGMP Snooping的交换机为了侦测路由器的接口会监听下列报文:
- 发送到01−00−5e−00−00−01的IGMP Membership query 报文
- 发送到01−00−5e−00−00−02的PIMv1 hello 报文
- 发送到01−00−5e−00−00−0d的PIMv2 hello 报文
- 发送到01−00−5e−00−04的DVMRP probes 报文
- 发送到01−00−5e−00−05 or 06的MOSPF 报文
在启用IGMP Snooping的交换机会将上述的MAC地址条文加入到MAC地址表。当一个路由器接口被侦测到以后,交换机会将这个接口加入到这个VLAN中所有的GDA表中。
通过IGMP Snooping加入一个组
这里有两种情况
情况A:用户A是这个网段中第一个要加入组的用户
- 用户A发送一个IGMP Membership report
- 交换机截获用户发送到路由器的想要加入某个组的IGMP Membership report
- 交换机为这个组创建一个GDA条目,指向收到IGMP report 的端口并和所有的路由器的接口关联
- 接着交换机会前传IGMP report到所有的路由器接口。因此路由器还是能够接收到IGMP report,并且更新路由器的多播路由表
情况B:用户B是网段中第二个要加入到相同的多播组的用户
- 用户B发送一个IGMP Membership report。
- 交换机截获客户发送到路由器的想要加入某个组的IGMP Membership report
- 接着交换机不一定会前传IGMP report到所有的路由器接口。事实上,交换机会自己去代理发送IGMP report到路由器接口,每个组每10秒只发送一个report
注意:为了保持组成员的存在,多播路由器会每60秒发送一个IGMP query。这个查询会被交换机截获,并且前传到所有的交换机接口。所有这个组的用户会响应这个query。但是因为交换机同样也会截获用户发送的report,用户之间是看不到其他用户发送的report的。因此交换机对于所有用户发送的响应report,会自己代理向路由器发送report,所有的用户只发送一个report(而不是每个用户发送一个)。
通过IGMP Snooping离开一个组
假设用户A想要离开这个组,但是用户B还在这个组中。
- 交换机会截获用户A发送的IGMP Leave 报文
- 交换机发送IGMP Query 到接收到IGMP Leave的接口
- 如果交换机没有收到report,那他会丢弃这个接口的条目。如果他从这个接口得到了响应,那交换机什么也不会做,仅仅丢弃leave 报文。
- 说明交换机接口上还有用户属于这个多播组,因此交换机不会向路由器前传Leave message.
现在假设用户B想要离开多播组,并且用户B是网段中这个组的最后的用户。
- 交换机截获用户B发送的IGMP Leave message
- 交换机发送IGMP Query 到接收到IGMP Leave的接口
- 如果交换接没有收到report,他会从GDA条目中删除这个接口
- 说明交换机接口上已经没有用户属于这个多播组. 这样,交换机便前传IGMP Leave message到所有的路由器接口,并且移除GDA条目
IGMP和CGMP的互动性
在某些网络中,因为硬件的限制,你不能在所有的交换机上运行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修剪掉