短版:连接到某些网站时,我网络上的一台Windows Server 2012计算机正在出现持久性但间歇性的TCP RST。他们来自哪里的邓诺。查看wireshark日志以获取我的分析和问题。
长版:
我们在其中一台服务器上运行缓存Web代理,以为我们的小型办公室提供服务。一位同事报告说,连接到某些站点时出现很多“连接重置”或“页面无法显示”错误,但是刷新通常可以解决此问题。
我验证了浏览器的行为,然后通过尝试在服务器本身上使用未代理的浏览器来更直接地进行验证。但是到麻烦站点的ping和traceroutes没有显示任何问题,问题似乎仅限于TCP连接。
然后,我编写了一个脚本来测试受影响的站点,方法是直接通过cURL向它们发送HTTP HEAD请求并检查它们成功的频率。典型的测试如下所示:(这是未代理的,直接在不良服务器上运行)
C:\sdk\Apache24\htdocs>php rhTest.php
Sending HTTP HEAD requests to "http://www.washingtonpost.com/":
20:21:42: Length: 0 Response Code: NULL (0%)
20:22:02: Length: 0 Response Code: NULL (0%)
20:22:22: Length: 0 Response Code: NULL (0%)
20:22:42: Length: 0 Response Code: NULL (0%)
20:23:02: Length: 3173 Response Code: HTTP/1.1 302 Moved Temporarily (20%)
20:23:22: Length: 3174 Response Code: HTTP/1.1 302 Moved Temporarily (33.33%)
20:23:43: Length: 0 Response Code: NULL (28.57%)
20:24:03: Length: 3171 Response Code: HTTP/1.1 302 Moved Temporarily (37.5%)
20:24:23: Length: 3173 Response Code: HTTP/1.1 302 Moved Temporarily (44.44%)
20:24:43: Length: 3172 Response Code: HTTP/1.1 302 Moved Temporarily (50%)
20:25:03: Length: 0 Response Code: NULL (45.45%)
从长远来看,只有大约60%的请求成功,其余请求均不返回任何内容,其卷曲错误代码为:“ cURL错误(56):从对等方接收数据时失败”对于我我的网站而言,不良行为是一致的测试(从来没有一个站点能够“变得更好”),并且它非常持久,我已经进行了一周的故障排除,并且同事报告说问题已经存在了几个月。
我在网络上的其他计算机上测试了HEAD请求脚本:没问题,所有连接都通向测试列表中的所有站点。然后,我在个人桌面上设置了一个代理,当我从有问题的服务器运行HEAD请求时,所有连接都会通过。因此,无论问题出在哪里,它都非常特定于此服务器。
接下来,我试图隔离哪些网站表现出连接重置行为:
- 我们的Intranet站点(192.168.xx)均未断开连接。
- 我测试过的ipv6站点均未断开连接。(我们是双堆栈)
- 互联网ipv4站点中只有一小部分断开连接。
- 每个将cloudflare用作CDN(我已经测试过)的站点都会断开连接。(但问题似乎并非仅是cloudflare网站所独有)
这个角度并没有真正起任何作用,因此接下来我安装了wireshark来查看请求失败时的情况。失败的HEAD请求看起来像这样:(此处的更大屏幕截图:http : //imgur.com/TNfRUtX)
127 48.709776000 192.168.1.142 192.33.31.56 TCP 66 52667 > http [SYN, ECN, CWR] Seq=0 Win=8192 Len=0 MSS=8960 WS=256 SACK_PERM=1
128 48.728207000 192.33.31.56 192.168.1.142 TCP 66 http > 52667 [SYN, ACK, ECN] Seq=0 Ack=1 Win=42340 Len=0 MSS=1460 SACK_PERM=1 WS=128
129 48.728255000 192.168.1.142 192.33.31.56 TCP 54 52667 > http [ACK] Seq=1 Ack=1 Win=65536 Len=0
130 48.739371000 192.168.1.142 192.33.31.56 HTTP 234 HEAD / HTTP/1.1
131 48.740917000 192.33.31.56 192.168.1.142 TCP 60 http > 52667 [RST] Seq=1 Win=0 Len=0
132 48.757766000 192.33.31.56 192.168.1.142 TCP 60 http > 52667 [ACK] Seq=1 Ack=181 Win=42240 Len=0
133 48.770314000 192.33.31.56 192.168.1.142 TCP 951 [TCP segment of a reassembled PDU]
134 48.807831000 192.33.31.56 192.168.1.142 TCP 951 [TCP Retransmission] http > 52667 [PSH, ACK] Seq=1 Ack=181 Win=42240 Len=897
135 48.859592000 192.33.31.56 192.168.1.142 TCP 951 [TCP Retransmission] http > 52667 [PSH, ACK] Seq=1 Ack=181 Win=42240 Len=897
138 49.400675000 192.33.31.56 192.168.1.142 TCP 951 [TCP Retransmission] http > 52667 [PSH, ACK] Seq=1 Ack=181 Win=42240 Len=897
139 50.121655000 192.33.31.56 192.168.1.142 TCP 951 [TCP Retransmission] http > 52667 [PSH, ACK] Seq=1 Ack=181 Win=42240 Len=897
141 51.564009000 192.33.31.56 192.168.1.142 TCP 951 [TCP Retransmission] http > 52667 [PSH, ACK] Seq=1 Ack=181 Win=42240 Len=897
143 54.452561000 192.33.31.56 192.168.1.142 TCP 951 [TCP Retransmission] http > 52667 [PSH, ACK] Seq=1 Ack=181 Win=42240 Len=897
我的阅读方式(如果我错了,请纠正我,这实际上不是我的专长)是:
- 我们打开到Web服务器的TCP连接
- 网络服务器ACK
- HTTP HEAD请求已发送
- 有一个RST数据包(标记为来自Web服务器IP)终止了连接。
- Web服务器发送ACK
- Web服务器(尝试)以有效的HTTP数据响应HEAD请求(951字节的回复包含正确的HTTP标头)
- Web服务器重新传输(几秒钟的几次)有效的HTTP响应,但是由于连接已经是RST,所以它无法成功
因此,如果网络服务器发送了有效的RST,为什么它会继续尝试填充请求?如果Web服务器没有生成RST,那么到底发生了什么?
我尝试过的事没有任何效果:
- 禁用NIC分组
- 更换网络适配器(已知替换网卡正在工作)
- 分配静态IP。
- 禁用ipv6。
- 禁用巨型帧。
- 一晚上将服务器直接插入我们的调制解调器,绕过我们的交换机和路由器。
- 关闭Windows防火墙。
- 通过netsh重置TCP设置
- 实际上禁用服务器上的所有其他服务。(我们通常将它用作文件服务器,但是有apache和几个DB)
- 在桌子上敲头(反复)
我怀疑服务器上的某些东西正在生成RST数据包,但是对于我来说,我找不到它。我感觉是否知道:为什么仅此服务器?还是为什么只有一些网站?这会很有帮助。虽然我仍然很好奇,但我越来越倾向于从轨道上退出并重新开始。
想法/建议?
-谢谢