服务停止监听TCP端口时,已建立的TCP连接会如何处理?
停止监听TCP端口对已建立连接的影响
停止监听端口本质是关闭服务端的监听套接字,该操作和已经完成三次握手的已连接套接字相互独立,已处于ESTABLISHED状态的连接不会被直接中断,所有读写逻辑可正常执行。
结合TCP连接状态的处理流程
完整的场景状态流转如下:
- 停止监听阶段:内核仅移除监听套接字的队列注册信息,不会修改任何存量已连接套接字的状态,所有连接仍保持
ESTABLISHED状态,可正常收发业务数据 - 存量连接处理阶段:如果服务端没有主动触发连接关闭,连接会一直保持
ESTABLISHED直至业务处理完成;如果服务端主动关闭连接,会触发标准四次挥手流程:- 服务端发送FIN包,连接状态从
ESTABLISHED进入FIN_WAIT_1 - 收到客户端ACK应答后,服务端连接进入
FIN_WAIT_2状态,此时客户端连接处于CLOSE_WAIT状态 - 客户端处理完剩余数据后发送FIN包,服务端收到后回复ACK,自身进入
TIME_WAIT状态,客户端收到ACK后进入CLOSED状态,服务端等待2MSL后也会进入CLOSED状态
- 服务端发送FIN包,连接状态从
- 异常场景:如果服务端停止监听后直接退出进程未处理存量连接,内核会自动关闭所有套接字,若还有未发送完成的数据,会直接发送RST包复位连接,连接直接进入
CLOSED状态,不会走四次挥手流程。
已建立连接的优雅关闭实现
你提到的「等客户端收到正常应答后再关闭连接」完全可以实现,这正是TCP优雅关闭的标准逻辑:
- 实现方案为:服务端先执行停止监听操作,拒绝新的连接请求,然后等待所有存量已连接的业务请求处理完成、所有应答数据成功发送到客户端之后,再逐个主动触发四次挥手关闭对应连接
- 注意需要避免停止监听后直接退出进程,否则内核会自动回收套接字,大概率触发RST复位导致客户端收不到完整应答。
内容的提问来源于stack exchange,提问作者boholder
相关产品推荐
相关产品推荐

