TCP连接中的FIN与RST

Ars*_*ray 35 networking tcp

我理解这一点,有两种方法可以关闭TCP连接:

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

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

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

esc*_*ram 77

  • FIN说:"我告诉了你,但是在你说你已经完成之前,我仍会听你要说的一切."

  • RST说:"没有谈话.我不会说什么,我也不会听你说的任何话."

    如果您具有持久的TCP连接且流量很小,则RST非常有用.如果其中一台计算机重新启动,它会忘记连接,另一台计算机一发送另一个数据包就会获得RST.


小智 7

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


use*_*421 6

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

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

不可能同时使用两者.这个概念甚至没有意义.

有可能通过技巧我不会在这里描述用RST而不是FIN关闭TCP连接,但这是一个愚蠢的想法,这就是我没有记录它的原因.首先,飞行中的所有未决数据都将丢失.

  • RST 不一定表示错误情况。这可能只是意味着 RST 的发送者不想再收到您的消息,并且不一定会处理任何仍为连接缓冲的数据。将两个标志设置在一起对于一半的连接来说是多余的,但不是禁止的。在某些情况下,在 FIN 之后不久 RST 出现当然并不少见。 (2认同)