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