随机TCP RST在某些网站上,发生了什么事?

简短版本:在连接到某些网站时,我的networking上的一台Windows Server 2012计算机正在持续但间歇性的TCP RST。 不知道他们从哪里来。 检查我的分析和问题wireshark日志。

长版本:

我们在我们的一台服务器上运行一个cachingweb代理服务我们的小型办公室。 一位同事报告说,当连接到某些网站时,出现了很多“连接重置”或“页面无法显示”的错误,但是刷新通常会修复这些错误。

我validation了浏览器行为,然后更直接地尝试在服务器本身上使用未经代理的浏览器。 但是对麻烦的网站ping和traceroute没有任何问题,这些问题似乎只限于TCP连接。

然后我做了一个脚本来testing受影响的站点,通过直接发送HTTP HEAD请求通过cURL检查它们成功的频率。 一个典型的testing看起来像这样:(这是没有代理的,直接在坏的服务器上运行)

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错误代码为:“cURL error(56):从对等端接收数据时失败”不良行为与网站Itesting(没有网站“变得越来越好”),而且是相当持久的,我已经排查了一个星期了,同事们报告说这个问题已经有好几个月了。

我在networking上的其他机器上testing了HEAD请求脚本:没有问题,所有的连接都通过我的testing列表中的所有站点。 然后,我在个人桌面上设置了一个代理,当我通过有问题的服务器运行HEAD请求时,所有的连接都通过了。 所以无论问题是什么,这个服务器都是非常具体的。

接下来,我尝试隔离哪些网站展示连接重置行为:

  • 我们的Intranet站点(192.168.xx)都没有连接。
  • 没有ipv6网站我testing了滴连接。 (我们是双栈)
  • 只有less数的互联网ipv4网站放弃连接。
  • 每个使用cloudflare作为CDN(我testing过)的站点都会丢弃连接。 (但这个问题似乎并不是专属于cloudflare的网站)

这个angular度没有发展成什么真正有用的东西,所以接下来我安装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连接
  • networking服务器确认
  • HTTP HEAD请求被发送
  • 有一个RST数据包,从Web服务器IP标记,杀死连接。
  • networking服务器发送ACK
  • Web服务器(尝试)用有效的HTTP数据来响应HEAD请求(951字节的回复包含正确的HTTP头)
  • Web服务器会重传(几秒钟)几次有效的HTTP响应,但是由于连接已经是RST,所以它不能成功

所以如果networking服务器发送了一个有效的RST,为什么它会一直试图填充请求? 如果networking服务器没有生成RST,那么这是什么?

我尝试过的东西没有任何效果:

  • 禁用NIC组合
  • 更换networking适配器(replace网卡已知正在工作)
  • 分配一个静态IP。
  • 禁用ipv6。
  • 禁用巨型帧。
  • 将服务器直接插入调制解调器一个晚上,绕过我们的交换机和路由器。
  • closuresWindows防火墙。
  • 通过netsh重置TCP设置
  • 几乎禁用服务器上的所有其他服务。 (我们主要使用它作为一个文件服务器,但有一个Apache和一对夫妇的数据库)
  • 在桌子上猛击头(反复)

我怀疑服务器上的某些东西正在生成RST数据包,但是对于我来说,我找不到它。 我觉得如果我知道:为什么只是这台服务器? 或者为什么只有一些网站? 它会帮助很多。 当我还好奇的时候,我越来越倾向于从轨道上重新开始,重新开始。

想法/build议?

-谢谢

您的数据包捕获有一些不寻常的事情:ECN位设置在传出的SYN数据包中。

显式拥塞通知是对IP协议的扩展,允许主机更快地对networking拥塞作出反应。 它在15年前被首次引入互联网,但在首次部署时出现了严重的问题 。 其中最严重的是,许多防火墙在收到一个ECN位设置的SYN数据包时,会丢弃数据包或返回RST 。

因此,大多数操作系统默认情况下禁用ECN,至less对于传出连接。 因此,我怀疑很多站点(和防火墙厂商)根本就没有修复防火墙 。

直到Windows Server 2012发布。 从此操作系统版本开始, Microsoft默认启用 ECN 。

不幸的是,近年来没有人对互联网网站对ECN的反应做过任何重大的testing,因此很难判断21世纪初出现的问题是否仍然存在,但我强烈怀疑它们是否是您的stream量,至less有些时候,通过这样的设备。

在我的桌面上启用ECN后,然后启动Wireshark,只有几秒钟之后,我才find一个主机的例子,我从中得到一个RST到一个SYN和ECN设置的数据包,尽pipe大多数主机似乎工作正常。 也许我会自己去上网…

您可以尝试在服务器上禁用ECN以查看问题是否清除。 这也将使你无法使用DCTCP,但在一个小型办公室,这是不太可能的,你有这样做或有任何需要这样做。

 netsh int tcp set global ecncapability=disabled