https 拖延 TIME_WAIT 连接

Jaa*_*aap 7 https connection time-wait

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

当我连接时,我在 TCPView(替代 netstat 的 sysinternals 工具)中看到了很多到 https 端点的 TIME_WAIT 连接。很多时候我看到 11 个连接在 TIME_WAIT 中停留了 2 分钟。这就是每次我提出请求时。2-4 个连接在 ESTABLISHED 中保持打开状态无论我设置服务器的时间有多长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"
Run Code Online (Sandbox Code Playgroud)

sup*_*ami 3

这是完全正常的。

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

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

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

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