Windows 7或Vista TCP行为更改

时间:2011-06-14 20:02:12

标签: networking windows-7 tcp windows-vista

各种分辨率

显示此问题的客户端计算机已安装趋势科技安全管理。此安全套件将服务或驱动程序放在系统中的每个网络适配器之上。一旦这个遗留应用程序再次开始工作,我就没有费心去调试了。

更新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服务器上运行哪些命令可能更好地帮助我理解连接失败的原因。

2 个答案:

答案 0 :(得分:2)

也许你可以做的最好的事情就是在linux下启动tcpdumpwireshark并分析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并比较差异