在Windows 7上接受套接字需要一秒钟以上

时间:2009-12-30 18:49:37

标签: sockets windows-7

这就是我所做的:

  • 我写了一个最小的Web服务器(使用Qt,但我不认为它与此相关)。
  • 我在合法的Windows 7 32位上运行它。

问题:

  • 如果我使用Firefox,IE,Chrome或Safari提出请求,我的服务器需要大约一秒钟才能看到有新的连接被接受。

线索:

  • 使用其他客户端(wget,自己只打开套接字的测试客户端)比Firefox,IE,Chrome,Safari看到新连接只需几毫秒。
  • 我安装了Apache并尝试了上面提到的客户端。按预期服务请求大约需要50毫秒。
  • 运行Windows XP(或在Linux下编译和运行相同的代码)时,问题无法重现
  • 只有在连接到localhost时,问题似乎才出现。通过互联网连接并提供连接的朋友只需几毫秒。
  • 在不同端口运行服务器对1秒延迟
  • 没有影响

这是我没有运气的尝试:

  • 停止了Windows Defender服务
  • 停止了Windows防火墙服务

有什么想法吗?这是Windows 7中的一些聪明的“安全功能”吗?为什么Apache不受影响?为什么只有浏览器受到影响?

4 个答案:

答案 0 :(得分:4)

出于某种原因,Windows 7需要1秒才能解析地址localhost,无论它是否在主机文件中。

将localhost1添加到hosts文件并使用它来解决问题。

答案 1 :(得分:3)

您可能遇到了一些自动代理发现问题。在Firefox中,您可以在选项|中禁用它高级|网络|设置;选择“无代理”或给它显式值。还有Internet属性控制面板,这是IE的网络设置,但Windows上的其他浏览器也可以遵守此处的设置。同样,禁用自动代理发现。这也可以加速localhost之外的连接。

答案 2 :(得分:3)

如果您说的是“localhost”而不是“127.0.0.1”,那么您在实际连接尝试之前强制进行名称查找,这会增加延迟。

此外,某些浏览器(如Firefox 3.5+)不使用操作系统的DNS查找机制,这就是为什么它可以具有与wget不同的性能。

答案 3 :(得分:1)

在IPv4 / IPv6双栈主机上连接到localhost时:

  • localhost执行DNS查找。
  • DNS服务器(无论是否启用IPv6-无关紧要)都返回AAAA记录::1A记录127.0.0.1
  • 客户端首先尝试连接到::1
  • 我们假设您的服务器程序不支持IPv6,这是一种常见情况-由于历史原因,许多服务器默认将其套接字绑定到0.0.0.0而不是[::]
  • 这将为客户端引发ECONNREFUSED错误。 这在大多数平台上都会立即发生;但是,在Windows上,一次调用connect()会在放弃之前以500毫秒的间隔尝试3次,因此会花费一秒钟多的时间(有关更多详细信息,请参见http://stackoverflow.com/q/19440364)。
  • 然后,客户端改为创建与127.0.0.1的连接。

这将解释您上面的所有线索:

  • 如果您通过Firefox,IE,Chrome,Safari或任何其他支持IPv6的客户端发出请求,则在连接到::1之前,尝试127.0.0.1大约需要花费一秒钟的时间。
  • 您自己的测试客户端只是打开一个INET套接字,因此根本不会尝试使用::1
  • 使用双栈服务器(例如Apache),客户端将愉快地连接到::1
  • 该问题在Windows XP上无法重现,默认情况下未启用IPv6支持。
  • 这个问题似乎仅在您的朋友连接到仅IPv4的网络连接时才出现,{@ 1}}上会出现。
  • 在不同端口中运行服务器不会影响1秒钟的延迟。