TCP 中的 RST(Reset)报文 用于立即强制关闭连接,通常在异常或错误情况下触发。以下是常见场景:
1. 连接请求被拒绝
- 端口未监听:当客户端尝试连接服务器未监听的端口时,服务器会回复 RST(而非 SYN-ACK)。
- 防火墙拦截:防火墙可能直接发送 RST 阻断连接请求。
2. 异常终止连接
- 进程崩溃或强制关闭:若一端进程异常终止(如崩溃),操作系统会发送 RST 通知对方,而非正常四次挥手。
- 应用层主动重置:如调用
socket.close()
强制关闭(如设置 SO_LINGER 选项超时为 0)。
3. 处理半开连接(Half-Open Connection)
- 一方意外断开:例如服务器重启后,客户端仍发送数据,服务器因无对应连接信息而回复 RST。
- 非正常关闭:如一方直接断电,另一方发送数据时会收到 RST。
4. 协议状态不一致
- 接收非法报文:在非预期状态收到报文(如 ESTABLISHED 状态下收到 SYN 包)。
- 序列号无效:若报文序列号不在接收窗口范围内,可能触发 RST(取决于实现)。
5. 安全或策略干预
- 防御攻击:如检测到 SYN Flood 攻击,服务器可能发送 RST 拒绝连接。
- 中间设备阻断:代理或防火墙可能主动发送 RST 终止可疑连接。
6. 关闭已关闭的连接
- 重复 FIN 或数据:在连接已关闭后收到数据或 FIN,会回复 RST。
总结
RST 报文的本质是 强制终止连接,常见于协议错误、资源不可达或安全策略场景。与正常关闭(FIN)不同,RST 不保证数据完整性,可能导致数据丢失。