组播IGMP协议报文介绍
1 IGMP协议
1.1 定义
IGMP(Internet Group Management Protocol)是因特网协议家族中的一个组播协议,它共有三个版本:v1、v2和v3。
IGMPv1中定义了基本的组成员查询和报告过程,IGMPv2在此基础上添加了查询器选举和组成员离开的机制,IGMPv3中增加的主要功能是成员可以指定接收或指定不接收某些组播源的报文。
以下是这三个版本的主要区别:
IGMPv1:
主要基于查询和响应机制来完成对组播组成员的管理。
包括两种类型的报文:
普遍组查询报文(General Query):查询器向共享网络上所有主机和路由器发送的查询报文,用于了解哪些组播组存在成员。
成员报告报文(Report):主机向查询器发送的报告报文,用于申请加入某个组播组或者应答查询报文。
没有专门定义离开组播组的报文,当主机离开某组播组时,不会发送报告报文。
路由器在一段时间未收到某组播组的报告报文后,会删除该组播组对应的组播转发项。
、
字段说明:
IGMPv2:
兼容IGMPv1,并增加了离开组的消息。
与IGMPv1相比,IGMPv2的变化如下:
除了普遍组查询报文和成员报告报文之外,IGMPv2新增了两种报文:
成员离开报文(Leave):成员离开组播组时主动向查询器发送的报文,用于宣告自己离开了某个组播组。
特定组查询报文(Group-Specific Query):查询器向共享网段内指定组播组发送的查询报文,用于查询该组播组是否存在成员。
IGMPv2对普遍组查询报文格式也做了改进,添加了最大响应时间(Max Response Time)字段。此字段取值可以通过命令配置,用于控制成员对于查询报文的响应速度。
报文字段:
IGMPv3:
主要是为了配合SSM(Source-Specific Multicast)模型发展起来的,提供了在报文中携带组播源信息的能力。
增加了特定源组查询报文和成员特定源报告报文,使主机可以对组播源进行选择。
增强了主机的控制能力,主机在加入某组播组时,能够明确要求接收或拒绝来自某特定组播源的组播信息。
查询和报告报文的功能也得到了增强,例如IGMPv3的报告报文可以携带多个组记录。
报文说明:
综上所述,IGMP的三个版本在报文类型、离开组机制、查询器选举以及组播源选择等方面存在显著差异。
1.2 兼容性
三个版本在演进过程中对协议报文的处理是向后兼容的,因此尽管各个版本的协议报文格式不同,但是运行IGMP高版本的路由器可以识别低版本的IGMP报文。
v2版本的组播设备可以正确处理v1主机的加入,v3版本的组播设备可以正确处理v1和v2版本的主机加入。当组播设备收到低版本的主机的IGMP加入报文后会自动降低组播组的兼容版本到该主机对应的版本,并工作在该版本上。
2 查看设备的IGMP版本
android设备通过adb shell可以查看设备默认版本:
cat /proc/net/igmp
cat /proc/sys/net/ipv4/conf/eth0/force_igmp_version:值为0 表示最新版本
cat /proc/sys/net/ipv4/conf/wlan0/force_igmp_version
从上图可以看到该设备默认是V3版本的IGMP组播,force_igmp_version为0
设置组播版本:
在有权限的设备上,可以强制修改走有线eth0的组播版本为V2,则设置force_igmp_version为2即可:
echo 2 > /proc/sys/net/ipv4/conf/eth0/force_igmp_version
修改后,通过命令查看eth0网卡的组播协议版本是否修改成功:
3 IGMP组播网络包
通过wirehark工具抓包,过滤igmp,可看的igmp报文的版本号。
在机顶盒等android终端设备也可以通过tcpdump抓包:
用电脑开热点,电视连电脑热点,或者保证能再同一个网络下:然后执行下面命令
1、adb shell tcpdump -v -w /sdcard/t.pcap
2、adb pull /sdcard/t.pcap D:\winscp(存储路径不能是根目录,至少有一级文件夹,文件夹名字必须英文)
3、用wireshark工具查看。
如下图所示,为V3版本。
修改为V2版本后,抓包IGMP报文为V2版本: