44

据我了解,有两种方法可以关闭 TCP 连接:

  • 发送 FIN 标志
  • 发送 RST 标志

RST 会导致连接立即终止,而在 FIN 中您会得到确认。

我是否理解这一点,两者之间还有其他区别吗?这两个标志可以一起使用吗?

4

3 回答 3

101
  • FIN 说:“我已经和你谈完了,但我仍然会听你说的一切,直到你说你已经完成了。”

  • RST 说:“没有对话。我不会说什么,也不会听你说什么。”

    如果您的 TCP 连接持久且流量很小,RST 很有用。如果其中一台计算机重新启动,它会忘记连接,并且另一台计算机在发送另一个数据包后立即获得 RST。

于 2012-10-24T13:15:08.920 回答
12

在以下情况下将发送 FIN 或 RST

  • 您的进程关闭套接字
  • 当您的进程退出而不关闭套接字时,操作系统正在执行资源清理。

    如果您的进程调用 close(),则默认情况下会从关闭端发送 FIN(注意:您可以设置套接字选项 SO_LINGER 以使其发送 RST 而不是 FIN)

    如果您的进程在没有关闭套接字的情况下退出,内核将关闭 tcp 连接并为您的进程进行清理。可以发送 FIN 或 RST。如果您的接收队列中有数据,则会发送 RST。否则,将发送 FIN。

    您可以通过 tcp.c 中的 tcp_close() 循环了解更多详细信息。(我使用的是 redhat 分支的 kernel-2.6.32-573.7.1)

于 2015-11-06T06:01:53.247 回答
10

来自 RFC 1122,每个人都在引用,但实际上并没有引用,反对我:

TCP 连接可能以两种方式终止:(1) 使用 FIN 握手的正常 TCP 关闭序列,以及 (2) 发送一个或多个 RST 段并立即丢弃连接状态的“中止”。

不能同时使用两者。这个概念甚至没有开始变得有意义。

可以通过我不会在这里描述的诡计来关闭使用 RST 而不是 FIN 的 TCP 连接,但这是一个愚蠢的想法,这就是为什么我没有记录它的原因。一方面,所有待处理的数据都丢失了。

于 2012-10-24T21:23:00.663 回答