https 持续处于 TIME_WAIT 状态的连接

https 持续处于 TIME_WAIT 状态的连接

我从客户端电脑连接到网络服务器,它仅使用 HTTPS。

当我连接时,我在 TCPView(netstat 的替代工具 sysinternals)中看到很多 TIME_WAIT 连接到 https 端点。很多时候,我看到 11 个连接在 TIME_WAIT 中停留了 2 分钟。每次我发出请求时都是这样。无论我将服务器的Keep-Alive: timeout=xx

后面的连接没问题,而且重用得当。前面的连接建立起来需要整整 2 分钟。

我使用 WireShark 捕获了流量,发现正常的 FIN、ACK 等在延迟连接的源端口上通过。我经常看到 Chrome 和 IE(它们都使用 Windows HTTP 堆栈)在任何带有实际数据的请求到来之前发出 6 个 TCP 请求。有效负载很小(大约 2000 字节)。

Firefox 根本不发出这些请求......

还值得一提的是,该证书是自签名的,并且不会在浏览器中验证(Firefox 处理此问题的方式与 Chrome 完全不同)。

为什么我的浏览器会发出这些请求?为什么 Firefox 不会发出这些 TCP 连接?

编辑,这是 Chrome 第一次建立连接的转储(使用 wireshark 捕获):

    "https","0.000000",local-ip,dest-ip,"443","TCP","53890 > https [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=8 SACK_PERM=1"
    "53890","0.012749",dest-ip,local-ip,"53890","TCP","https > 53890 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1400 WS=1 SACK_PERM=1"
    "https","0.012828",local-ip,dest-ip,"443","TCP","53890 > https [ACK] Seq=1 Ack=1 Win=65792 Len=0"
    "53890","0.025979",dest-ip,local-ip,"53890","TCP","https > 53890 [ACK] Seq=1 Ack=222 Win=128578 Len=0"
    "53890","0.026099",dest-ip,local-ip,"53890","TLSv1.1","Server Hello, Certificate, Server Hello Done"
    "53890","0.038848",dest-ip,local-ip,"53890","TCP","https > 53890 [ACK] Seq=1093 Ack=436 Win=128364 Len=0"
    "53890","0.040474",dest-ip,local-ip,"53890","TLSv1.1","Change Cipher Spec, Encrypted Handshake Message"
    "https","0.041191",local-ip,dest-ip,"443","TCP","53890 > https [FIN, ACK] Seq=436 Ack=1168 Win=64512 Len=0"
    "53890","0.053312",dest-ip,local-ip,"53890","TCP","https > 53890 [ACK] Seq=1168 Ack=437 Win=128364 Len=0"
    "53890","0.053313",dest-ip,local-ip,"53890","TCP","https > 53890 [FIN, PSH, ACK] Seq=1168 Ack=437 Win=128364 Len=0"
    "https","0.053345",local-ip,dest-ip,"443","TCP","53890 > https [ACK] Seq=437 Ack=1169 Win=64512 Len=0"

答案1

这是完全正常的。

您的浏览器向 Web 服务器发出的每个新请求都是一个 TCP 连接,它将使用一个新的套接字。

握手、数据传输和正常关闭之后,套接字将处于 TIME_WAIT 状态,直到内核的计时器到期。

TIME_WAIT 计时器在 TCP RFC(RFC 793)中定义为最大段生存期的 2 倍。MSL 任意定义为 2 分钟。

根据操作系统中 TCP 的实现,此计时器可能会或可能不会被遵守。例如,较旧的 BSD 将 TIME_WAIT 设置为 1 分钟到 4 分钟之间。

相关内容