使用 Windows 7 和 Windows 10 客户端组合,我的一台 LAN 服务器通常需要 21 秒才能建立连接。此 LAN 服务器运行 Windows Server 2012-R2 并在 IIS 端口 8080 上托管 TFS 2015。使用 Fiddler 可发现该连接需要 21 秒才能建立 TCP 连接。
使用 wireshark,我看到以下对话。它是按时间排序的。
Time 0 : IPV6 - TCP 49371 → 8080 [SYN] Seq=0 Win=8192 Len=0 MSS=1440 WS=256 SACK_PERM=1
Time 3 : IPV6 - TCP 49371 → 8080 [SYN] Seq=0 Win=8192 Len=0 MSS=1440 WS=256 SACK_PERM=1
Time 9 : IPV6 - TCP 49371 → 8080 [SYN] Seq=0 Win=8192 Len=0 MSS=1440 SACK_PERM=1
Time 21 : IPV4 - TCP 49372 → 8080 [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=256
SACK_PERM=1
Time 21 : IPV4 - TCP 8080 → 49372 [SYN, ACK] Seq=0 Ack=1 Win=8192 Len=0 MSS=1460 WS=256
SACK_PERM=1
Time 21 : IPV4 - TCP 49372 → 8080 [ACK] Seq=1 Ack=1 Win=65536 Len=0
Time 21+: IPV4 - HTTP chatter
(at this point the connection has been established successfully)
这似乎与防火墙端口图相匹配http://www.codeproject.com/Articles/363088/TCP-and-Port-Filtering-Firewalls-with-WinSock(即 3 秒超时、6 秒超时、12 秒超时)。但是,在客户端和服务器上打开 Windows 防火墙日志记录不会显示丢弃的数据包。
这似乎是特定于服务器的;我可以连接到其他服务器(在 LAN 上和外部),而不会出现此问题。如果我明确指定 IPV4 或 IPV6 IP 地址,则连接成功建立(并且在这种情况下,wireshark 日志仅显示 IPV4 或 IPV6 流量)。
请注意,上面描述的所有内容都是可疑的,因为这个问题很难诊断:
1. 如果在同一个应用程序中发出两个请求,则第二个请求会快速响应(除非请求相距足够远?)。
2. 有时调整服务器上的设置(或者甚至在客户端上?)将暂时消除问题(直到客户端重新启动?)。
编辑:以下是服务器开始工作时 Wireshark 跟踪的样子:
Time 0 : IPV6 - 60459 → 8080 [SYN] Seq=0 Win=8192 Len=0 MSS=1440 WS=256 SACK_PERM=1
Time 0 : IPV6 - 8080 → 60459 [SYN, ACK] Seq=0 Ack=1 Win=8192 Len=0 MSS=1440 WS=256
SACK_PERM=1
Time 0 : IPV6 - 60459 → 8080 [ACK] Seq=1 Ack=1 Win=66048 Len=0
Time 0+: IPV6 - HTTP Chatter
(at this point the connection has been established successfully)
问题:我该如何修改服务器以避免这21秒的连接延迟?
答案1
IPV4 连接属性的预期配置是让机器拥有一对硬编码的 IPV4 DNS 服务器,每个服务器都是域控制器。然而,实际配置是两个硬编码 DNS 服务器中的一个是域控制器,另一个是前域控制器,后者运行的是 Server2003,并且不支持 ipv6。我要指出的是,之前的服务器也有类似的配置错误,但之前的服务器是 Server2003 机器,不支持 IPV6。
自大约 2 天前更新此设置以来,TCP 问题没有发生。虽然之前的设置显然是错误的,但我不确定 IPV4 配置错误是导致 TCP/IP 故障的具体原因。我已经调查这个问题大约一个月了,问题一直在间歇性地消失和重新出现。