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

我有以下设置:

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

在连接的两端,都有一个按预期自动configuration的链路本地IPv6地址,并且可以使用范围ID在两个方向上进行ping。 我可以将设备的IPv6地址URI 作用域ID一起inputInternet Explorer,并且可以立即连接到Web服务器。

但是,必须input范围ID并不是IPv6预期为用户工作的方式,因此,Firefox不支持具有范围ID的IPv6地址URI。 但是:连接到没有范围ID的Web服务器是非常不可靠的,我得到了很多IE / Firefox连接超时和cygwin的wget几次重试。

这是我迄今发现的

  • 没有其他适配器configuration为在连接到我的计算机的任何其他networking上具有Windows CE的链接本地IPv6地址(以太网,VMware适配器…)
  • 当邻居caching(netsh interface ipv6 show neighbors)将RNDIS接口上的IPv6地址显示为“Reachable”时,Web服务器连接立即成功。 我可以通过在浏览器请求之前执行ping来触发此操作。
  • 当邻居caching在RNDIS接口上显示IPv6地址为“Stale”时,连接超时。 其他接口显示各种状态的IPv6地址:通常“无法访问”和“不完整”。
  • 我可以用Wireshark观看RNDIS接口,而wget会经历几次重试。 除了ICPMv6“多播监听报告消息v2”,LLMNR“标准查询”和DHCPv6“请求”之外,接口上没有任何stream量,都来自我的电脑。 然后通过wget的第三次或第四次重试,有一个ICMPv6“邻居请求”,Windows CE设备立即以“邻居通告”响应。 这是当wget最后TCP连接到Web服务器并下载请求的页面。
  • 到那时,邻居caching将IPv6地址显示为可达,并且立即后续请求也成功
  • 虽然wget尝试连接到Web服务器,但在其他接口上有各种邻居请求请求

MSDN文档在尝试查找邻居时一次只能通过一个接口,所以我可以从原理上理解其他接口上的邻居请求请求,但是我不能相信这是IPv6邻居发现有效的方式。

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

使用链接本地地址,您必须使用范围ID。 没有它的地址是没有意义的。 如果没有示波器ID,就不可能让它工作。

为了回应David Schwartz的评论,为此使用链接本地地址没有问题,并且应该可以正常工作。 这对运行在embedded式设备上的Web服务器特别有用。 例如,我已经使用这个function来访问在embedded式设备上运行的Web服务器,以便通过从笔记本电脑连接到设备的背对背以太网连接进行维护。 networking上没有其他IP地址,但本地链接。

但是你是对的:浏览器遇到了麻烦。 我相信一些老版本的Firefox可以工作,而新版本不能。 这是Firefox中的一个错误 。 顺便说一下,这也是Google Chrome中的一个错误 。

在浏览器制造商修正错误之前,没有什么可以做到这一点。 当我需要的时候,我已经设法通过端口转发(例如sshsocat )来解决这个问题。