各种分辨率
显示此问题的客户端计算机已安装趋势科技安全管理。此安全套件将服务或驱动程序放在系统中的每个网络适配器之上。一旦这个遗留应用程序再次开始工作,我就没有费心去调试了。
更新1
我在Win7上禁用了TCP窗口缩放自动调整。
在Windows 7上,如果我拔下直接连接到服务器的以太网电缆,大约5秒后就会断开连接,但客户端进程崩溃了。 服务器上的netstat 报告两个到客户端的TCP连接不再有效,因为客户端进程没有正常关闭并关闭连接。
在物理断开连接后将服务器置于此奇怪状态后,如果我重新启动客户端进程,它会在连接到服务器时挂起(正如原始中所述)
如果我在XP端执行物理断开连接,则断开连接比Win7更快。在XP上,某种保持活跃的价值或行为是不同的。虽然ssh'd(通过Putty)ssh连接在XP上比Win7更快死亡。
原始
我有一个传统的TCP客户端/服务器应用程序,只有在客户端是Windows 7计算机时才会污染服务器。
服务器是运行2.6.11的OpenEmbedded Linux。
Windows 7客户端连接一段时间,并最终进入客户端在一两秒后断开连接的状态。
服务器处于此状态后,如果我立即连接Windows XP客户端,则XP客户端也无法连接。
通过单独连接XP客户端,我似乎无法使服务器进入错误状态。
我想知道从Vista或Windows 7开始对TCP / IP堆栈做了哪些更改,以便我可以更好地调试遗留代码。
我还想知道我可以在Linux服务器上运行哪些命令可能更好地帮助我理解连接失败的原因。
答案 0 :(得分:2)
也许你可以做的最好的事情就是在linux下启动tcpdump
或wireshark
并分析Windows XP和Windows 7发送的TCP SYN.Wireshark允许你突破bit-by -bit发送什么TCP选项...例如,这是你从debian lenny框中看到的建立TCP连接:
Transmission Control Protocol, Src Port: 58456 (58456), Dst Port: 23 (23), Seq: 0, Len: 0
Source port: 58456 (58456)
Destination port: 23 (23)
Sequence number: 0 (relative sequence number)
Header length: 40 bytes
Flags: 0x02 (SYN)
0... .... = Congestion Window Reduced (CWR): Not set
.0.. .... = ECN-Echo: Not set
..0. .... = Urgent: Not set
...0 .... = Acknowledgment: Not set
.... 0... = Push: Not set
.... .0.. = Reset: Not set
.... ..1. = Syn: Set
.... ...0 = Fin: Not set
Window size: 5840
Checksum: 0x8b77 [correct]
[Good Checksum: True]
[Bad Checksum: False]
Options: (20 bytes)
Maximum segment size: 1460 bytes
SACK permitted
Timestamps: TSval 136991740, TSecr 0
NOP
Window scale: 6 (multiply by 64)
我怀疑你会看到RFC 1323 Window Scaling的差异,但我没有一台XP机器来验证这一点。
我在这个答案中给出了如何使用linux下的tcptrace
分析TCP连接的详细响应......
How can I measure the performance and TCP RTT of my server code?
答案 1 :(得分:1)
我还怀疑是一个Window Scaling问题。我暂时找不到链接,但有人抱怨当Vista第一次出现报告说有些事情与某些路由器搞砸了(belkins,如果我还记得)。他们追溯到一个窗口大小的问题,Vista(以及Windows 7)默认更改。路由器会挂断,需要每隔几分钟重置一次。
您可以发出一些命令来关闭窗口缩放,看看您的问题是否消失。 From Here:
netsh interface tcp set global autotuninglevel=disabled
编辑:
尝试在Windows 7上禁用IPv6。Link了解如何执行此操作。使用IPv4,它应该与Windows XP相同。在两个系统上加载wireshark并比较差异