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

新手上路,请多包涵

一般来说,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

求解释。。。

阅读 2.5k
1 个回答

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进