TCP连接中的FIN与RST

时间:2012-10-24 13:04:41

标签: networking tcp

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

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

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

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

3 个答案:

答案 0 :(得分:72)

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

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

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

答案 1 :(得分: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)

答案 2 :(得分:6)

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

  

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

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

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