SSH 隧道如何处理两侧的 TCP RST?

SSH 隧道如何处理两侧的 TCP RST?

假设我有一个从本地计算机到远程服务器上的数据库的 SSH 隧道。

如果我向隧道发送查询,它会从另一端出来,但在发送查询或接收结果的中途,数据库触发 TCP RST,SSH 如何处理?

可以:

  1. 是否要等待任一侧的 ACK 数据包,直到收到来自端点的 ACK?
  2. 缓冲应用程序级数据并重新发送直到成功?
  3. 其他?

我担心的是,如果隧道先于另一端 ACK 进行 ACK,而另一端发送了 RST,则无法将该 RST 传播回去。双方都会挂起。

答案1

怎么会“双方都悬”呢?你真的观察到了吗?

引自《TCP/IP 图解,第 1 卷,第 2 版》第 14 页。 628:

复位段包含序列号和确认号。另请注意,重置段不会引起另一端的任何响应——根本没有得到确认。重置的接收者中止连接并通知应用程序连接已重置。这通常会导致错误指示“连接被对等方重置”或类似的消息。

在上一页上:

中止连接提供了两个功能...任何排队的数据都会被丢弃,并且立即发送重置段...重置的接收者可以知道另一端进行了中止而不是正常关闭。

(您可能还想查看SO_LINGER应用程序的侦听套接字可能使用的套接字选项。)

相关内容