WSL2和multicast

shixudong@163.com

《WSL2和VPN》一文后话中,简单提了一下WSL2(mirrored)在支持multicast方面的不足,当时并没有开展进一步的深入研究。近日在github上看到多篇issues(1073512344)在讨论WSL2的组播问题,特别是WSL2(mirrored)和Windows主机之间无法进行组播通信,遂静下心来做了一番功课,得以形成此文。

一、WSL2的组播支持

WSL2新增mirrored模式,号称支持multicast,但无论是mirrored、bridged还是nat,三者其实都使用同一个Linux内核,对多播的支持在内核层面是无差别的。只是由于网络层面的不同,导致了三种模式对多播的支持程度有所差异而已。

在外部设备看来,nat模式下,组播包无法被转发出去,可认为WSL2(nat)不支持multicast;Mirrored和Bridged模式对多播的支持程度基本上是一样的,只是WSL2一直想要废弃bridged模式,所以才有mirrored模式号称支持多播一说。

由于WSL2官方内核CONFIG_IP_MULTICAST is not set,导致WSL2无法发送组播加入信息。虽然WSL2仍可以发送组播数据包,但是当网络上有IGMP查询器,并且switch/bridge启用了IGMP snooping后,因为没有收到WSL2的组播加入信息,switch/bridge压根不会将WSL2希望接收的组播包发送到Windows主机,导致WSL2无法接收外部设备发来的组播包。

对于这一情形,有两种解决方法可以让WSL2能够正常接收外部设备发来的组播包。

1、由Windows主机代为发送WSL2需要的组播加入信息。

2、使用CONFIG_IP_MULTICAST=y重新编译WSL2内核,支持WSL2发送组播加入信息。

二、WSL2(bridged)的组播优势和不足

WSL2(bridged)使用与主机不同的IP和MAC,WSL2和Windows主机之间的组播通信,与WSL2和外部设备之间的组播通信没有区别。而且由于WSL2和Windows主机之间的组播通信无需经过外部switch/bridge,故WSL2(bridged)无需使用CONFIG_IP_MULTICAST=y重新编译也能接收Windows主机发来的组播包。

对于WSL2(bridged),即使外部switch/bridge没有启用IGMP snooping功能,依然有两种例外情形会导致WSL2无法接收外部设备发来的组播包:

1、WSL2桥接到Windows主机的无线网卡,在WSL2内核CONFIG_IP_MULTICAST=y时,WSL2能够发送组播加入信息,有些无线AP识别到该组播加入信息后,能自动启用multicast_to_unicast功能,发往Windows主机的组播包被转换为以主机无线网卡MAC为目标的单播包,由于Windows网桥驱动功能太烂,不能依据三层组播IP对multicast_to_unicast进行逆转换,将单播目标MAC恢复成组播目标MAC,导致WSL2(bridged)反而无法接收组播包(Vmware桥接主机无线网卡时也有同样的问题,VirtualBox桥接可根据三层组播IP对multicast_to_unicast进行逆转换,不存在类似缺陷)。

2、如WSL2桥接的主机无线网卡固件具有multicast filter特性,由于WSL2无法向主机无线网卡添加多址过滤条件,主机无线网卡也会主动拦截外部发给WSL2的组播包。

针对例外情形1,首选办法就是使用CONFIG_IP_MULTICAST is not set的官方内核,不让WSL2发出组播加入信息,也不要让Windows主机代为发送WSL2需要的组播加入信息;或者通过防火墙拦截Windows主机或WSL2发出的组播加入信息。此时无线AP不会启用multicast_to_unicast功能,外部设备发来的组播包能顺利被WSL2接收。

针对例外情形2,理论上的解决思路是让Windows主机也加入到WSL2接收组播包所需要的同一个组播组,此时将由Windows主机向自身无线网卡添加多址过滤条件,放行WSL2需要的组播包。该思路看起来很美妙,然而却和例外情形1相冲突,因为只要Windows主机加入到同一个组播组,必然会发送组播加入信息,触发无线AP自动启用multicast_to_unicast功能,导致WSL2无法接收组播包。因此还需要同时通过防火墙拦截Windows主机或WSL2发出的组播加入信息,方能保证WSL2顺利接收外部设备发来的组播包。

当网络上switch启用了IGMP snooping,针对WSL2桥接到主机无线网卡的情形,如无线AP能自动启用multicast_to_unicast功能,WSL2(bridged)接收外部设备组播包的问题目前无解,但可以采用WSL2(mirrored)解决。

三、WSL2(mirrored)的组播优势和不足

对于WSL2(mirrored)来说,在和主机无线网卡配合使用时,由于使用了和主机无线网卡相同的MAC,依然可以顺利接收外部设备通过无线AP发来的multicast_to_unicast组播包,不存在类似WSL2(bridged)的瑕疵。

在不考虑WSL2和Windows主机之间相互组播通信时,显然WSL2(mirrored)对组播的支持更胜

### 驾考科目一思维导图的相关信息 驾考科目一是驾驶员理论考试的重要部分,涵盖了交通法规、标志标线、安全行车等方面的知识。为了更好地记忆理解这些知识点,许多考生会借助思维导图来进行复习[^1]。 目前市面上有许多资源可以帮助获取驾考科目一的思维导图。例如,在一些教育类网站上可以找到由专业人士整理好的思维导图图片文件,通常是以PNG或JPEG格式提供下载。另外,像车轮驾考通这样的应用程序也内置了一些辅助学习资料,虽然可能不直接提供可下载的思维导图,但它通过结构化的分类方式呈现了类似的逻辑框架,有助于构建个人专属的学习图表[^2]。 如果希望获得具体的思维导图素材,建议访问以下几种渠道: - **在线教育资源平台**:很多专注于驾照考试培训的机构会在其官网或者合作平台上分享免费的教学材料。 - **社交媒体群**:加入驾考相关的QQ群、微信群或是论坛讨论区,往往能从其他学员那里得到高质量的共享文件。 对于想要制作个性化版本的情况,则推荐利用MindManager 或 XMind 这样的专业软件自行绘制: ```python import xmind from xmind.core import workbook, saver # 创建一个新的XMind工作簿对象 wkbk = workbook.Workbook() # 添加中心主题并设置名称为"科目一" sheet = wkbk.getPrimarySheet() root_topic = sheet.getRootTopic() root_topic.setTitle("科目一") # 增加子节点代表不同类别下的重点内容... child_traffic_rules = root_topic.addSubTopic() child_traffic_rules.setTitle("道路交通信号") saver.save(wkbk,"subject_one.xmind") ``` 上述脚本展示了如何用Python库创建基础XMind文件的过程,用户可以根据具体需求扩展此模板至更复杂的层次关系之中去。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值