TCP FIN 和 TCP RST 的使用

Phi*_*lip 2 networking tcp flags

我最近一直在阅读有关 TCP 协议的内容,因为我对使用某些标志的方式和原因有点好奇。

在我发现的信息中,它谈到了正常关闭 TCP FIN 应该用于关闭连接,但随后它也谈到了 TCP RST 可用于在活动连接上中止关闭。

我的问题是,为什么要使用 RST 来中止/关闭使用 TCP FIN 的活动连接?

(将活动连接称为在标准 3 次握手后两个端点发送和接收数据的连接。我知道当客户端为未侦听的服务器端口发送 SYN 时,服务器可以使用 RST)

joe*_*rty 5

您通常不会看到 TCP RST。我认为第 7 层中止的应用程序可能会生成 RST,但我认为您会发现 RST 最常由两台主机之间的防火墙生成。以下是TCP/IP 指南中的可能原因列表:

从接收该段的设备当前没有连接的任何设备接收任何 TCP 段(除了请求新连接的 SYN)。

收到带有无效或不正确的序列号或确认号字段的消息,表明该消息可能属于先前的连接或以其他方式伪造。

在没有进程侦听连接的端口上收到 SYN 消息。


Fle*_*exo 5

一些网络服务器使用 RST 而不是 FIN 来关闭(持久)连接。这被视为一种“优化”,因为它避免了“半关闭”状态并避免了丢失 FIN 数据包的一些问题(任何进一步的传输只会产生另一个 RST),否则需要记住状态(2xMaximum段时间 IIRC)在服务器端更长。

请参阅:有关连接终止的这篇论文维基百科。(我也会尝试挖掘一些更有趣的参考资料)。

如果套接字的应用程序崩溃(段错误?)、主机重新启动或 NAT 表条目在连接本身之前超时,您可能还会看到 RST!