据我了解,有两种方法可以关闭 TCP 连接:
- 发送 FIN 标志
- 发送 RST 标志
RST 会导致连接立即终止,而在 FIN 中您会得到确认。
我是否理解这一点,两者之间还有其他区别吗?这两个标志可以一起使用吗?
据我了解,有两种方法可以关闭 TCP 连接:
RST 会导致连接立即终止,而在 FIN 中您会得到确认。
我是否理解这一点,两者之间还有其他区别吗?这两个标志可以一起使用吗?
FIN 说:“我已经和你谈完了,但我仍然会听你说的一切,直到你说你已经完成了。”
RST 说:“没有对话。我不会说什么,也不会听你说什么。”
如果您的 TCP 连接持久且流量很小,RST 很有用。如果其中一台计算机重新启动,它会忘记连接,并且另一台计算机在发送另一个数据包后立即获得 RST。
在以下情况下将发送 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)
来自 RFC 1122,每个人都在引用,但实际上并没有引用,反对我:
TCP 连接可能以两种方式终止:(1) 使用 FIN 握手的正常 TCP 关闭序列,以及 (2) 发送一个或多个 RST 段并立即丢弃连接状态的“中止”。
不能同时使用两者。这个概念甚至没有开始变得有意义。
可以通过我不会在这里描述的诡计来关闭使用 RST 而不是 FIN 的 TCP 连接,但这是一个愚蠢的想法,这就是为什么我没有记录它的原因。一方面,所有待处理的数据都丢失了。