什么是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
2
3
linger_opt.l_onoff = 1;
linger_opt.l_linger = 0;
close(sock);

表示立即关闭连接并发送RST(而不是优雅挥手)

用于:

  • 快速中断阻塞连接
  • 避免TIME_WAIT堆积