为什么连接到侦听 IPv6 链路本地地址的 Web 服务器不可靠/IPv6 邻居发现预期如何工作?

为什么连接到侦听 IPv6 链路本地地址的 Web 服务器不可靠/IPv6 邻居发现预期如何工作?

我有以下设置:

  • 我的 Windows 7 开发箱(或新安装的 Windows 7 VM)
  • 基于 Windows Embedded CE 6.0 的设备,启用 IPv6 并运行 Web 服务器
  • 两者之间的 USB RNDIS 连接

在连接的两端,都会按预期自动配置一个本地链路 IPv6 地址,我可以使用范围 ID 在两个方向上执行 ping 操作。我可以输入设备的 IPv6 地址 URI范围 ID 放入 Internet Explorer 并可立即连接到 Web 服务器。

但是,必须输入范围 ID 并不是 IPv6 为用户工作的方式,因此 Firefox 不支持带有范围 ID 的 IPv6 地址 URI。但是:连接到 Web 服务器没有范围 ID 非常不可靠,我在 IE/Firefox 中遇到很多连接超时,并使用 cygwin 的 wget 重试多次。

以下是我目前发现的情况

  • 在连接到我的计算机的任何其他网络上(以太网、VMware 适配器……),没有其他适配器配置为具有 Windows CE 的链路本地 IPv6 地址
  • 当邻居缓存 (netsh interface ipv6 show neighbours) 显示 RNDIS 接口上的 IPv6 地址为“可访问”时,Web 服务器连接立即成功。我可以通过浏览器请求之前执行 ping 来触发此操作。
  • 当邻居缓存显示 RNDIS 接口上的 IPv6 地址为“过时”时,连接超时。其他接口会显示各种状态的 IPv6 地址:通常是“无法访问”和“不完整”。
  • 当 wget 进行多次重试时,我可以使用 Wireshark 观察 RNDIS 接口。除了 ICPMv6“多播侦听器报告消息 v2”、LLMNR“标准查询”和 DHCPv6“请求”之外,接口上没有任何流量,这些流量均来自我的 PC。然后,在 wget 第三次或第四次重试时,出现了 ICMPv6“邻居请求”,Windows CE 设备立即以“邻居广告”对其进行响应。此时 wget 最终通过 TCP 连接到 Web 服务器并下载请求的页面。
  • 到那时,邻居缓存会显示 IPv6 地址为可访问,并且后续请求也会成功
  • 当 wget 尝试连接到 Web 服务器时,我的其他接口上会出现各种邻居请求

MSDN 文档在尝试查找邻居时一次遍历一个接口,因此我原则上可以理解其他接口上的邻居请求,但我无法相信这是 IPv6 邻居发现预期的工作方式。

有没有一个好的方法可以使这个场景可靠地工作?

答案1

使用链接本地地址,您可以必须使用范围 ID。没有它,地址就没有意义。如果没有范围 ID,您根本无法让它工作。

回应 David Schwartz 的评论,使用本地链路地址实现此目的没有问题,而且应该可以正常工作。它对于在嵌入式设备上运行的 Web 服务器特别有用。例如,我曾使用它在笔记本电脑上通过背对背以太网连接访问在嵌入式设备上运行的 Web 服务器以进行维护。线路上没有其他 IP 地址,只有本地链路。

但你说得对:浏览器对此有困难。我相信一些较旧版本的 Firefox 可以工作,而较新版本的则不行。这是Firefox 中的一个错误。顺便说一下,这是一个Google Chrome 中的错误也。

在浏览器制造商修复该错误之前,您无法采取任何措施来确保其可靠性。当我需要时,我设法通过端口转发(例如sshsocat)来解决这个问题。

相关内容