链接范围IPv6多播数据包突然无法在MacBook Pro上路由?

这是一个有点模糊的问题,但我很难过,我想也许有人可能会对这个问题有更多的线索。

我的同事已成功运行一个内部应用程序,在他的MacBook Pro上使用IPv6多播几个月,但今天Mac决定停止路由多播数据包。 特别是,程序打印此错误:

网络接口上的SendDataUDP(ff02 :: bead:cede:deed:feed @ 4)失败[名称= [en0]描述= [] IP = [fe80 :: 222:41ff:fe21:dfd4 @ 4]网络掩码= [ffff: ffff:ffff:ffff ::] Broadcast = [::]](错误= 65 /无主机路由)。

…它很好地描述了出错的地方……它试图将UDP数据包发送到所显示的IP地址,并且发送()失败并使用errno = EHOSTUNREACH。

我不明白的是,什么可能导致IPv6链路范围多播地址“无法访问”? 如果我对链路范围组播的理解是正确的,那么数据包只需要从本地以太网端口出来(在这种情况下为en0,它在该机器上运行)。

我缺少多播的某些方面,还是他的机器只是被塞了? 他说他没有改变什么,只是神秘地停止了工作。

查看内核源代码可能会有所帮助。 (特别是出口IPv6数据包出口路径,ip6_output.c)当你在那里时,你也可以看看导致它的套接字调用等。

对于多播,假设您正在进行ip6_output() ,看起来获得此错误的唯一可能方法是不指定要发送的接口。 (这是奇怪的,因为您的错误消息明确提到接口)

这台MacBook上的无线接口是否有可能在以前没有启用,现在“链路本地”多播的想法是不明确的? 您是否在使用套接字时明确指定了接口? 地址末尾的@ 4对我来说很奇怪。 (这是一个接口索引吗?)约定通常是使用%作为接口scope-id,但正如前面的答案及其注释所述,它并不是普遍支持的。

要测试en0是否仍然能够发送链路本地多播请求,请尝试

 ping6 ff02::1%en0 

这会联系所有主机,因此您应该获得大量响应(为了好玩,请尝试添加-w)。