TCP连接中的FIN vs RST

47

我的理解是,有两种方式可以关闭TCP连接:

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

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

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

3个回答

106
  • FIN表示:“我和你的谈话结束了,但在你表示结束之前,我仍然会听取你所有想说的话。”

  • RST表示:“没有对话。我不会说任何话,也不会听你说的任何话。”

    如果您拥有持续时间较长且流量较小的TCP连接,RST是有用的。如果其中一台计算机重新启动,则会忘记该连接,而另一台计算机在发送另一个数据包时立即收到RST。


13

在以下情况下将发送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)


10

根据大家一直引用但实际上没有引用到我的RFC 1122:

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

不可能同时使用两种方式。这个概念甚至开始就没有意义。

通过我不会在这里描述的诡计,可以使用RST而不是FIN关闭TCP连接,但这是愚蠢的想法,这就是为什么我不记录它的原因之一,所有未完成的数据都将丢失。


@downvoter 请解释一下您对这个答案的问题。 - user207421
“同时使用两者是不可能的。” 从技术上讲,这是可能的。只是像你说的,“这个概念根本就没有意义”。(虽然我不是那个点踩的人)。 - bchurchill
2
RST并不一定表示错误条件。它可能只是意味着发送RST的方不再希望收到您的消息,并且不一定会处理仍在连接中缓冲的任何数据。将两个标志设置在一起对于连接的一半来说是多余的,但并不被禁止。在某些情况下,RST很快在FIN之后出现并不那么不寻常。 - Dave
@EJP - RST在RFC 793和1122中有多种用途。其中之一就像你描述的那样 - 表示“没有这样的连接”存在,或者不再存在。 - Dave
我的回答是针对“是错误条件”(并非总是)和“不可能”(是的,我经常看到它)而不是断言它是不干净的。顺便说一句,许多防火墙和负载均衡器实现滥用RST来关闭已建立连接甚至在SYN握手期间出于RFC 793和1122中未列明的其他原因。这促使了RFC 3360的出现。 - Dave
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接