为什么http请求服务端和客户端都没有进入time_wait状态。

发布于 2022-09-11 20:38:22 字数 456 浏览 13 评论 0

一般来说,tcp连接中主动关闭的一方会进入 time_wait 阶段。这个阶段会为连接保留比较长的时间,在连接数很多的时候是比较占资源的。
大多数的http请求是客户端主动关闭连接接入time_wait。
今天遇到一个很困惑的事情。比如server端处理请求需要3s。

我在客户端curl往server发送请求。
情况一: 正常等待服务器处理完请求, 客户端主动关闭连接,接入time_wait, 和期望结果相同。
情况二: 在响应之前, ctrl+c中断curl请求, 也是客户端主动关闭连接,但是很奇怪的是,客户端没有进入time_wait, 而且服务端也没有进入time_wait。

看linux并没有设置time_wait快速回收
$ sysctl -a|grep tcp_tw
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 0

求解释。。。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

赠意 2022-09-18 20:38:22

主动断开连接的一方进入TIME_WAIT的条件是收到被动端回应的FIN+ACK.你使用Ctrl+C,本端(尅护短)发送FIN之后内核就把socket和TCP状态机删除了,自然也就不存在TIME_WAIT状态了

被动端(服务器)就没有TIME_WAIT这个状态!如果你的代码逻辑是收到FIN后也close这个连接,那么会发送FIN+ACK,进入LAST-ACK状态等待客户端回复最后的ACK(当然它是等不到的),最后timeout后删除连接。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文