TCP中何时会出现RST(reset)报文?
什么是TCP RST报文?
RST报文段是TCP协议中的一个控制标志位,代表:
连接出现异常,立即中断当前连接
也就是说,RST=强制断开连接
它不经过四次挥手,而是直接告诉对方:别再发了,这个连接无效
RST报文是TCP协议中用来终止一个连接的报文。当一个TCP连接出现异常时,比如主机崩溃、网络中断、连接超时等,TCP会向另一端发送一个RST报文来终止连接。
RST报文的常见触发时机
我们可以分为三大类:无效连接、异常关闭、应用层拒绝
对方不存在的连接
场景:收到非预期的TCP报文
- 服务器端口没在监听(没有listen())
- 客户端乱发了一个SYN以外的数据包
- 收到数据的连接在本地不存在(比如已经被关闭)
常见原因:
- 程序没启动,端口没监听
- 应用崩溃,socket已释放
- 收到过期的包(老连接的残余包)
非正常关闭连接时
场景:进程提前关闭socket,但仍有数据到达
- 应用层超时关闭,但对方还在发包
- 系统异常断开连接(如kill进程)
应用层主动拒绝连接(listen拒绝)
场景:服务器正在运行,但明确拒绝连接
例如:
- 防火墙策略拒绝某个源IP
- 内核backlog队列满了(即TCP三次握手的SYN队列已满)
这时:
- 收到SYN
- 内核拒绝新连接->回复一个RST报文
说明服务器活着,但是拒绝接受连接
应用层主动触发RST
应用层可以通过设置socket选项来触发RST,比如:
1 | setsockopt(sock, SOL_SOCKET, SO_LINGER, &linger_opt, sizeof(linger_opt)); |
当:
1 | linger_opt.l_onoff = 1; |
表示立即关闭连接并发送RST(而不是优雅挥手)
用于:
- 快速中断阻塞连接
- 避免TIME_WAIT堆积
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 JasmineRain's blog!
评论
