WIndows 2012 上的套接字打开速度极慢
socket opening on WIndows 2012 extremely slow
我正在开发使用套接字与各种设备通信的旧版 VB6 应用程序。在 2012 系统上,我们注意到跨不同域的多个系统调用 winSock.Connect 到连接事件被触发之间的时间保持在大约 9 秒。在 2008 R2 或更低版本的系统上,调用和触发事件之间的间隔为 1-3 毫秒。
有没有人 运行 以前参与过此问题,或者对可能导致此问题的原因有任何想法?
谢谢
编辑:我用 Wireshark 做了一些窥探,发现前几个 TCP 传输没有连接并被重新传输,不确定这是否有帮助
关于 Winsock 控件没有什么特别的 "special",它只是 API 之上的薄包装。唯一需要注意的是,它是 32 位的,并且必须在 WOW64 中 运行。
您可能正在做一些有趣的事情,或者所有使用 winsock 的 32 位程序 API 以同样的方式应该会看到同样的问题。
也许您在此服务器上遇到名称解析问题?
经过广泛的挖掘,我最终找到了这个问题的答案。
从 Windows Server 2012 开始,Microsoft 启用了 TCP 扩展,称为显式拥塞通知 (ECN)。这允许端到端通知网络拥塞和数据包丢失。在 TCP 数据包上启用此功能的方式是通过一个标志,该标志在 ECN (RFC 3168(2001)) 的定义中定义。
发生在我身上的是我的应用程序与之通信的设备较旧,并且不支持 ECN 标志。当他们收到启用该标志的数据包时,他们不会确认传输,从而导致服务器超时。两次传输失败后,看起来 Windows 关闭了 ECN 标志,并且设备确认了数据包。
我禁用了 ECN 运行 来自管理员命令提示符的以下命令:
netsh interface tcp set global ecncapability=disabled
我正在开发使用套接字与各种设备通信的旧版 VB6 应用程序。在 2012 系统上,我们注意到跨不同域的多个系统调用 winSock.Connect 到连接事件被触发之间的时间保持在大约 9 秒。在 2008 R2 或更低版本的系统上,调用和触发事件之间的间隔为 1-3 毫秒。
有没有人 运行 以前参与过此问题,或者对可能导致此问题的原因有任何想法?
谢谢
编辑:我用 Wireshark 做了一些窥探,发现前几个 TCP 传输没有连接并被重新传输,不确定这是否有帮助
关于 Winsock 控件没有什么特别的 "special",它只是 API 之上的薄包装。唯一需要注意的是,它是 32 位的,并且必须在 WOW64 中 运行。
您可能正在做一些有趣的事情,或者所有使用 winsock 的 32 位程序 API 以同样的方式应该会看到同样的问题。
也许您在此服务器上遇到名称解析问题?
经过广泛的挖掘,我最终找到了这个问题的答案。
从 Windows Server 2012 开始,Microsoft 启用了 TCP 扩展,称为显式拥塞通知 (ECN)。这允许端到端通知网络拥塞和数据包丢失。在 TCP 数据包上启用此功能的方式是通过一个标志,该标志在 ECN (RFC 3168(2001)) 的定义中定义。
发生在我身上的是我的应用程序与之通信的设备较旧,并且不支持 ECN 标志。当他们收到启用该标志的数据包时,他们不会确认传输,从而导致服务器超时。两次传输失败后,看起来 Windows 关闭了 ECN 标志,并且设备确认了数据包。
我禁用了 ECN 运行 来自管理员命令提示符的以下命令:
netsh interface tcp set global ecncapability=disabled