IGMP(Internet Group Management Protocol) Internet组管理协议
1、组播应用场景
Router 需要将Media server 上的电视直播同时发送给STB1~STB3,而且不发送给两个
PC,如何处理呢?首先STB 要发起一个连接请求,也就是IGMP report 报文,加入到电视
直播的组播组中。同样当STB 要断开连接的时候就发送一个IGMP leave 报文。Router 也需
要知道当前有哪些STB 加入了组播组,防止有的STB 异常掉线了,却依然占用系统资源。
Router 周期性的发送IGMP query 报文查询组播组情况,STB 接到query 报文后发送report
消息到router。当然还有一种报文就是IGMP data,用来传输组播数据。这基本上就是IGMP
协议的基本流程了
2、组播实现
2.1 IP组播组和组播MAC
二层组播MAC 定义为:01:00:5e:xx:xx:xx,其中xx 由三层的IP 组播组确定。三层地址:
组播流使用的IP 是D 类IP 地址(二进制1110 开始),从224.0.0.0~239.255.255.255。由于
组播MAC 地址是一个虚拟的地址,并不是真实网卡的MAC 地址,那么网卡在发送报文是
二层MAC 地址怎么确定呢?答案是采用地址映射的方法将三层IP 地址映射到MAC 地址。
映射关系如下。
IP 地址的五个bit 无法映射到MAC 层,因为MAC 层的这五个bit 已经确定。也就是说有32 个IP 组播组会被映射为同一个MAC 地址。
2.2 报文格式
IGMP 报文封装在IP 层上,在IP 层的协议类型码是0x02。IGMPv2 有report, query 和
leave 有三种类型的报文,
IGMP report:type 为0x16(IGMPv2)或0x12(IGMPv1)
IGMP leave:type 为0x17
IGMP query:type 为0x11,query 报文有两种情况,一种是针对特定组播组的查询,另一种是通用查询,查询所有主机加入组播组的情况,两者的主要区别是在Group Address 上
IGMP data:与通常的报文相同,主要区别是MAC 地址使用的是组播MAC
3、IGMP协议的应用问题
3.1 IGMP snooping
交换机的A 端口(port)有一个组播包需要送到主机D。通常交换机会将这个报文flood 到每一个端口,确保报文能够送到主机D。但这样处理存在问题,主机D 挂在port C 上,switch 没有必要将报文发往每一个端口,占用其他端口的网络资源,同时也占用CPU 的资源。因此针对此问题,提出了IGMP snooping。该技术的主要思想是侦听每一个端口上的IGMP 报文,通过解析报文获得其组播地址,将组播地址与交换机的端口联系起来。当关系建立后,就可以通过组播组查到目的port,从而不需要flood
报文到每一个端口上。交换机的桥模块维护这样一张表,以组播组为索引,组播组下记录了属于该组播组的所有端口。当一个组播报文从A 口送到交换机时,交换机从报文中获取组播组地址,然后从表中找出该组播组,将报文直接发送到下属的C 端口。而E,F,H 端口不会有数据送到。组播索引表采用这样的管理,桥接收到一个 IGMP report 报文解析report 报文中的组播组,创建组播索引,将report 报文的端口记录下来。当然当组播组已经存在了就不需要重新创建组播索引了,只需要检查端口确认是否要添加端口。当桥收到一个IGMP leave 报文时,根据报文中的组播地址和报文端口从表中找到要离开的端口,删除端口。
但是,假如交换机的 C 端口连接的不是主机而是一个HUB,HUB 下挂了两台主机,并且两台主机都加入了同一个组播组,也就是说C 端口下有两台主机,当其中一台主机发送IGMP leave 后,会导致C 端口被删除,结
果另一台主机也无法接收到组播数据了。基于端口的组播报文转发是有问题的,一个解决方法是基于MAC 的组播转发,组播组下面记录的不是port 而是MAC。当组播组有报文时需要处理时,首先查找MAC,然后从
桥中根据MAC 找到port,最后将报文转发到该port
3.2 IGMP proxy
设备的上行端口担任主机的角色发送report 和leave 报文,下行端口执行路由器的角色发送query 报文