我的理解是,有两种方式可以关闭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连接,但这是愚蠢的想法,这就是为什么我不记录它的原因之一,所有未完成的数据都将丢失。