前言小记
最近偶在工作中遇到这么一个问题,用户反馈使用我们的路由器产品,使得IPTV功能在他们那边不能正常播放;但在我们的实验环境下,该功能一直正常。这个问题比较奇怪,经过一番沟通后,了解到客户那边也不是完全工作不正常,是他们的STB(机顶盒)可以正常播放,但是PC点播就不正常。
这使得偶很是疑惑,不过通过查看用户提供的报文,发现STB发出的是IGMPv2的Report报文,而PC点播时发出的确是IGMPv3的报文,而我们路由器使用的是IGMPv2的版本;用户那边如果把路由器设置成IGMPv3的就无法兼容STB,如果把路由器设这成IGMPv2的就无法兼容PC;很是头痛那!
不过通过查阅网上大侠的资料,主机一般都具备兼容路由器IGMP版本的功能,但是为什其不工作呢??通过查阅资料得知,主机使用什么版本的IGMP协议,由路由器发送的General Query报文决定的,而General Query报文是在IGMP SNOPING开启的情况下,就会正常发送的;问题就是我们的路由抓包发现,我们的路由不会发送General Query 下面分享一下相关的知识:
相关原理(取自RFC3376):
为了跟旧版本的路由器兼容,IGMPv3的主机必须能够在第1版和第2版兼容模式下操作。IGMPv3主机必须为每一个本地接口维护一个跟相连网络的兼容模式相关的状态。一台主机的兼容模式由主机的兼容模式变量来决定。兼容模式变量有三种可能的状态:IGMPv1,IGMPv2和IGMPv3,该变量在每 一个接口上都维护一个,其值取决于接口接收到的普通查询的版本,还有接口上的旧版本的查询者存在定时器。
为了能更优雅地在IGMP各版本间进行切换,主机在每一个接口上维护了一个IGMPv1查询者存在定时器和一个IGMPv2查询者存在定时器。任何时候, 当一个IGMPv1成员关系查询被收到时,IGMPv1查询者存在定时器被设置成旧版本查询者存在超时的时间。当一个IGMPv2普通查询被收到后, IGMPv2查询者存在定时器被设置成旧版本查询者存在超时的时间。
当一个更旧版本的查询被收到(比当前的兼容模式还旧),或者特定的定时器条件发生时,主机某个接口上的兼容模式就会发生变化。当一个IGMPv1查询者存 在定时器超时,如果当前还有一个IGMPv2查询者存在定时器在运行,那主机就切换到IGMPv2的兼容模式。如果当前没有IGMPv2查询者存在定时器 在运行,主机就直接切换到IGMPv3兼容模式。当IGMPv2查询者存在定时器超时后,主机直接切换到IGMPv3兼容模式。
主机的兼容模式变量的取值取决于在前一个旧版本查询者存在超时时间内,是否收到旧版本的普通查询。主机的兼容模式的确定如下:
主机兼容模式
|
定时器状态
|
IGMPv3(缺省)
|
IGMPv2查询者存在没有在运行
IGMPv1查询者存在也没有在运行
|
IGMPv2
|
IGMPv2查询者存在正在运行
IGMPv1查询者存在不在运行
|
IGMPv1
|
IGMPv1查询者存在正在运行
|
当主机收到一个查询,该查询会造成它的查询者存在定时器被更新,并且需要相应地调整它的兼容模式,它应当立即调整兼容模式。
当主机的兼容模式是IGMPv3,主机就在该接口上使用IGMPv3协议。
当主机的兼容模式是IGMPv2,主机就在该接口上使用IGMPv2协议。
当主机的兼容模式是IGMPv1,主机就在该接口上使用IGMPv1协议。
结论:
我的理解是,主机使用什么版本的IGMP报文,由路由器发送的查询报文(Query报文)决定;而路由器是否发送Query报文,由 IGMP SNOPING 是否开启来决定,如果把SNOPING关闭了,路由器就没有办法发送Query报文了,这样在主机与路由器使用不同的IGMP协议版本时,就会无法兼容路由器的IGMP版本了,这样就直接造成相关的点播业务不正常了;
阅读(1001) | 评论(0) | 转发(0) |