Skip to content

什么是 RST

RST:用来异常地关闭一个连接。它是一个 TCP 包头中的标志位

  • 正常情况下,不管是发出,还是收到置了这个标志位的数据包,相应的内存、端口等连接资源都会被释放。从效果上来看就是 TCP 连接被关闭了。
  • 而接收到 RST 的一方,一般会看到一个 connection resetconnection refused 的报错。
  • 想要感知是否收到 RST,需要本端应用层执行
    • 读数据:会收到Connection reset by peer 的报错,意思是远端已经关闭连接
    • 写数据:会收到 Broken pipe 的报错,意思是发送通道已经坏了。
  • 常见 RST 场景:
    • 端口不可用:
      • 端口未监听
      • 程序启动了但是崩了(这个时候如果有一层 nginx,会返回 502,这个时候一般是发生了 OOM/空指针 等导致程序崩溃的场景)
    • Socket 提前关闭:
      • 本端提前关闭:socket 接收缓冲区还有数据未读,提前调用 close,会先把接受缓存区的数据清空,然后给远端发送一个 RST
      • 远端提前关闭:远端已经close()socket,此时本端还尝试发数据给远端。那么远端就会回一个 RST。
  • 收到 RST 包,不一定会断开连接,seq 不在合法窗口范围内的数据包会被默默丢弃。避免恶意通过构造合法窗口范围内 seq,可以造成 RST 攻击

正在精进