一般来说,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
求解释。。。
主动断开连接的一方进入
TIME_WAIT
的条件是收到被动端回应的FIN+ACK
.你使用Ctrl+C
,本端(尅护短)发送FIN
之后内核就把socket
和TCP状态机删除了,自然也就不存在TIME_WAIT
状态了被动端(服务器)就没有
TIME_WAIT
这个状态!如果你的代码逻辑是收到FIN
后也close
这个连接,那么会发送FIN+ACK
,进入LAST-ACK
状态等待客户端回复最后的ACK
(当然它是等不到的),最后timeout
后删除连接。