请求取消后的 HTTP 响应

请求取消后的 HTTP 响应

我向服务器发送 HTTP 请求。服务器有长时间运行的请求处理程序,10 秒后返回 200。如果我取消一个请求并立即发送第二个请求,我预计第二个请求只有一个响应。但是第一个被取消的请求也得到了响应。为什么会发生这种情况?

这是客户端 192.168.1.3 和服务器 xxx10 之间的交换的 wireshark 日志

在此处输入图片描述

数据包 21 是第一个请求。
数据包 57 是第一个请求取消。
数据包 184 是第一个请求的响应。它不应该在这里!(?)

答案1

TCP 连接是双向的,单个 Fin 只能关闭一个方向。当您在客户端取消请求时,您会发送一个 Fin,服务器的 TCP 堆栈会对其进行 Ack,这确认客户端到服务器方向现已关闭。因此,您的客户端现在在该连接上向服务器发送更多数据是不合法的。但由于服务器从未发送过 Fin,因此服务器到客户端方向仍然打开。因此,服务器继续在该连接上发送数据是合法的,它确实这样做了:HTTP 响应。

如果您想强制立即关闭两个方向,您应该发送 TCP Reset (Rst) 而不是 Fin。

相关内容