谁在客户端-服务器连接中首先设置了TCP FIN标志

4

完成数据发送后,是服务器首先设置TCP FIN标志还是客户端在接收完整数据后设置?

祝好。

2个回答

15

FIN 是在一方应用程序请求关闭连接时发送的。这并不意味着在接收到另一方的FIN后立即发生关闭,其中一方可以在发送自己的FIN之前发送更多的数据。

TCP连接一旦建立就是完全对称的 - 没有一方可以被看作是“服务器”或“客户端”。这意味着任何一方都可以发送第一个FIN。由于在发送FIN后主机无法再在连接上发送数据,通常是首先知道没有更多数据可发送的一方发送FIN

设计网络协议以使客户端首先关闭连接有一个很好的实际原因 - “第一关闭者”将进入TIME_WAIT状态,该状态持续时间是最大报文段寿命的两倍,即几分钟。这在这几分钟内会占用少量资源 - 但如果这种情况发生在服务器端,而服务器正在处理每秒数百个连接,则这些TIME_WAIT套接字将迅速增加。最好将这种负担分散在客户端之间。


更多关于TIME_WAIT的细节可以在这里找到:http://www.serverframework.com/asynchronousevents/2011/01/time-wait-and-its-design-implications-for-protocols-and-scalable-servers.html - Len Holgate
@caf 请查看http://blogs.technet.com/b/networking/archive/2009/08/12/where-do-resets-come-from-no-the-stork-does-not-bring-them.aspx,他们说双方都会遭受TIME_WAIT的影响。 - onmyway133
3
不,它不是。无论如何,你可以随时查阅包含TCP状态图的参考资料,以了解第一个关闭者进入“TIME_WAIT”的情况。第二个关闭者则经历“CLOSE_WAIT”和“LAST_ACK”。 - caf

1

这取决于应用层协议。- 来自http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm

TCP连接通常使用特殊的过程终止,其中每个端独立关闭其链接。它通常始于一个应用程序进程向其TCP层发出信号,表明不再需要会话。该设备发送FIN消息以告知其他设备它想要结束连接,然后得到确认。当响应设备准备好时,它也会发送一个FIN并得到确认;等待一段时间以接收ACK后,会话将关闭。

实际上,通常应该是客户端,但没有理由必须如此。


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