2012年(11)
分类:
2012-09-21 00:06:24
基本的IGMP操作有:
客户端(比如,PC)发送IGMP report报文给路由器以表明需要加入或者退出某个多播组;
路由器定期向客户端发送IGMP query报文;
客户端向路由器发送IGMP report报文以回应查询;
支持IGMP的路由器称为多播路由器。多播路由器根据IGMP判断如何转发收到的多播报文。多播路由器是IGMP报文的终点,多播路由器不再向上层转发IGMP报文。多播路由器通过多播路由协议(如,PIM)与其它多播路由器交换多播路由信息。
在IPTV的网络中,每一个TV频道都是一个多播组,终端用户通过退出某组再加入另一组的方式实现TV频道的切换。
• IGMPv2
IGMPv2报文可分为三种类型:加入(Join)多播组、退出(Leave)多播组、查询(Query)客户端,分别对应报文封装格式中的三种type。
IGMPv2与IGMPv1相比增加了对Leave多播组的支持。
当多播路由器收到了下属网络的某个客户端加入某个多播组的IGMP报文之后,如果它从上层收到的这个多播组的报文,它就会传递到下属网络。
同样,通过IGMP退出报文,多播路由器可以判断下属网络还有没有对某个多播组的报文的需求,如果没有就不再转发该多播组的报文。
多播路由器通过IGMP查询报文以保持与客户端的联系,如果在规定时间内得不到客户端的回应,就认为该客户端已经退出了多播组。
IGMPv2使用了两个保留的多播地址:
224.0.0.1指所有多播节点,支持多播的节点都加入此多播组;
224.0.0.2指所有多播路由器,所有多播路由器都加入此多播组;
对于IGMP的query报文,通过抓包发现,客户端回复的IGMP目标地址是多播组地址,而不是224.0.0.2。因为目的地址是多播组地址,所以网络中的该组的其他成员也可以收到这个回复,从而会抑制住其他客户端的回复。事实上,每个收到IGMP query报文的客户端,都会延迟一定时间再回复,这是为了避免网络中一下子产生很多报文造成拥塞,一个多播组中只要有一个成员回复IGMP查询即可,因为对于多播路由器来说只关心是否要转发该多播组的报文,而不关心下属网络中有多少个多播组成员。详细情况需要看下RFC2236文档。
• IGMPv3
IGMPv3相比IGMPv2就是可以多播组的源地址,也就是客户端可以指定接收特定地址发来的多播报文,这种机制称为SSM(Source-Specific Multicast)。另外,当需要换台时,IGMPv3只需要发送一个报文,而不像IGMPv2需要发送两个报文(一个退出,一个加入)。
IGMPv3将加入和退出类型的报文都算作Membership Report类型的报文;另外一种就是Membership Query报文,查询报文有通用查询、特定多播组查询、指定源地址的特定多播组查询等类型。
IGMPv3使用了两个保留的多播组地址:
224.0.0.1指所有多播节点;
224.0.0.22是IGMPv3的多播路由器地址;
上述IGMPv3的Membership Report报文中的Group Record用于加入、退出和回应多播路由器的查询。一个Membership Report报文中可以包含多个Group Record,这使得换台(退出和加入)可以在一个报文中进行。在Group Record中,IGMPv3通过include或者exclude源地址来实现多播组的加入或者退出,include指包含源地址的多播报文将需要被接收,exclude指包含源地址的多播报文不需要被接收。基于这些原因,Record Type可以分为Current-State Record、Filter-Mode-Change Record、Source-List-Change Record等。详细的报文格式说明需查看RFC 3376文档。
IGMPv2与IGMPv3的比较:
• IGMP Snooping
客户端与多播路由器中间的交换机通过监听IGMP报文的传输,可以修改MAC地址表实现对多播报文正确有效的转发,而不是默认的“泛洪”处理,这种方式称为IGMP Snooping。IGMP Snooping与IGMP Proxy有所区别,后者交换机作为一个代理,会处理收到的IGMP报文,然后交换机再与多播路由器交互信息,而前者只是监听IGMP报文的内容(不修改IGMP报文内容)。
交换机为支持IGMP Snooping就要解析IGMP报文。它的目的是要知道每个端口下连接了哪些多播组成员。它还需要知道哪一个端口连接多播路由器,对IGMP查询的回复报文要直接转发给路由器,因为如果泛洪了回复报文,就可能会抑制其它多播组成员的回复,以至于交换机无法得知一个端口下有哪些多播组成员。此外,交换机还需要在端口上为每个多播组上维护定时器以判断连接的多播组成员是否超过了最大响应时间。
较新的Linux网桥支持IGMP Snooping,代码位于/net/bridge/br_multicast.c。
• 参考
Introduction to IGMP for IPTV Networks.pdf