在对多播进行故障排除时,我没有找到有关此命令返回的字段含义的参考:
C:\Users\Administrator>netsh int ip show joins level=verbose
Interface 5: Ethernet0
Multicast Address : 224.0.0.1
Scope : 0
References : 0
Last Reporter? : Yes
Multicast Address : 224.0.0.251
Scope : 0
References : 2
Last Reporter? : Yes
Multicast Address : 224.0.0.252
Scope : 0
References : 1
Last Reporter? : Yes
Scope
、References
和 是什么Last Reporter
意思?
我猜是References
指监听该特定多播组的进程数。如果应用程序在离开其使用的多播组之前停止/崩溃,该数字将变为零,但实际上它并未从列表中删除,并且计算机将继续接收多播流。是否有任何设置可以阻止这种情况,例如一段时间后,任何进程都不再使用多播组,操作系统会自动离开它?
这发生在使用(默认)IGMPv3 的 Windows 10 和 Windows Server 2019 上。
答案1
IGMP 加入/离开的正式名称是 IGMP 成员报告。在多路访问网络上处理 IGMP 的上游路由器称为查询器。它确实会定期查询所有主机 (224.0.0.1) 以获取其实际的组成员身份状态。
由于多路访问网络可能非常大,这可能会触发 IGMP 成员报告的涌入,从而可能使网络或查询器本身不堪重负;考虑到多播的性质,网络上有多少台主机侦听特定组并不重要,只需一个主机就足以继续在接口上传输该组。
事实上,在收到 IGMP 查询后,所有主机都会启动一个随机计时器,第一个到期的主机会将其成员报告发送到 224.0.0.1,以供查询器和其他主机收听。如果主机听说其组已被报告,它会取消计时器。该架构的构建使得在大多数情况下只有少数主机会真正响应查询。在此过程中报告过组的主机称为该组的最后一位报告者。
如您所见,上游路由器不知道有多少客户端正在监听特定组。因此,当主机发送离开报告时,路由器不会(并且按设计也不应该)立即停止接口上的此多播流,因为可能有其他客户端正在监听它。相反,它会发送 IGMP 特定查询对于这个特定的群体(即 239.0.0.1)来触发一些其他监听它的客户端发回他们的会员报告。
由于所有这些查询/报告内容都是通过多播异步且不可靠的方式发送的,因此由于数据包丢失或其他问题,此特定查询可能无法立即收到报告,这种可能性并非为零,因此路由器默认尝试发送两次(超过两个查询间隔),然后才会在接口上修剪多播组并停止流量。如果标准成员查询(在 224.0.0.1 上)特定组未收到两次报告,则情况也是如此,如果软件或硬件在能够发送组的离开报告之前发生故障,则可能会发生这种情况。
范围本身是一个多播地址范围,其根源可以追溯到古老而辉煌的全球互联网多播路由梦想时代,并指定该组应该流通的区域,0 表示 IPv4 中的本地网络。