本文力求通过自己在项目开发过程中可见可得的事实来向大家说说自己对组播的认识,起初在网上看到相关的文档,虽用心感悟却不得其意,希望通过这些表面的现象,能够解开对于某些理解的疑惑,或对组播能够有比较直观的印象。
IGMP协议规定,主机需要响应组播路由器的IGMP查询报文,即以IGMP Membership Report报文响应。在Snooping服务开启时会发送查询报文,这时dump出portmap表就会出现
hash port(0:6) vid age pxy in mac-address
094: 1-11- -1 0 1 n n 01005e7ffffa
17a: 11111 -1 0 1 n n 01005e000001
两个表项。
这时,我们可以去体会出组播MAC与组播IP地址的对应关系。以下是组播协议方面的标准,这些内容会在这份portmap表中有所体现。
IANA(Internet Assigned Number Authority)规定,多播的MAC地址范围是01:00:5E:00:00:00 -01:00:5E:FF:FF:FF。由于 IP组播地址的前4bit 是1110,代表组播标识,而后28bit中只有23bit被映射到MAC地址,这样IP地址中就有5bit 信息丢失,导致的结果是出现了32个IP组播地址映射到同一MAC地址上。
常用的组播地址有:
224.0.0.1 所有主机地址,包括所有路由器地址
224.0.0.2 所有组播路由器地址
224.0.1.0 -238.255.255.255
用户可用的组播地址(临时组地址),全网范围内有效
239.0.0.0 -239.255.255.255
本地管理组播地址,仅在特定的本地范围内有效
从这两个MAC地址表项,可以看到01005e7ffffa所对应的portmap是有主机连接的所有port,01005e000001所对应的portmap是交换机所有的port。01005e7ffffa可与239.255.255.250地址对应,而01005e000001可与224.0.0.1对应,这样可以有助于对IP组播地址用途的记忆。
在有主机加入224.1.1.1这个组播组时,可以看到在交换机的portmap表中就会出现这样一项:
hash port(0:6) vid age pxy in mac-address
178: --1-- -- 0 1 n n 01005e010101
01005e010101是可与224.1.1.1 对应的。
IGMP协议规定,路由器周期性发送成员资查询报文,然后根据收到的响应报文确定某个特定组在自己所在子网上是否有主机加入。所以在Snooping服务重启,但已经加入某组播组的主机并没有重新发送Join报文,依然可以正确的接收到该组播组所发送的数据包。IGMP信息是封装在IP报文中,其IP协议号为2。IGMP有3个协议版本,V3版本向前兼容V1、V2版本。
所以,再来理解IGMP snooping 的实现机理吧。交换机通过侦听主机向路由器的IGMP成员报告消息的方式,形成组成员和交换机接口的对应关系;交换机根据该对应关系将收到组播数据包只转给具有组成员的接口。
以下是对IGMP Proxy与IGMP Snooping区别的理解,结合了一些所见所得及自己的理解。IGMP Proxy 是要实现从WAN侧到LAN侧的透传, IGMP Proxy功能实现时需要定义upstream与downstream,即上行接口与下行接口,在局域网内某主机要加入某个WAN侧组播组时,实现代理作用,将数据报NAT透传。IGMP Snooping则会嗅探LAN侧的网络请求封包,在有主机发送Join报文加入某个组播组时,服务会从Join封包中解析出所要加入组播组的MAC地址(从要加入的组播组的IP地址就可得到其MAC地址),将该主机所在的port直接更新到交换机芯片的portmap表中,从而实现对组播数据报的发送。从在这一点也很容易理解为什么 IGMPProxy是走三层协议,而IGMPSnooping是走二层。IGMPProxy是更贴近于WAN侧的概念,而IGMP Snooping则是更贴近于LAN的概念,有的产品配置页面中,在WAN连接一侧选择是否开启IGMP Proxy,而在LAN侧选择是否开启IGMP Snooping。