完成数据发送后,是服务器首先设置TCP FIN标志还是客户端在接收完整数据后设置?
祝好。
完成数据发送后,是服务器首先设置TCP FIN标志还是客户端在接收完整数据后设置?
祝好。
FIN
是在一方应用程序请求关闭连接时发送的。这并不意味着在接收到另一方的FIN
后立即发生关闭,其中一方可以在发送自己的FIN
之前发送更多的数据。
TCP连接一旦建立就是完全对称的 - 没有一方可以被看作是“服务器”或“客户端”。这意味着任何一方都可以发送第一个FIN
。由于在发送FIN
后主机无法再在连接上发送数据,通常是首先知道没有更多数据可发送的一方发送FIN
。
设计网络协议以使客户端首先关闭连接有一个很好的实际原因 - “第一关闭者”将进入TIME_WAIT
状态,该状态持续时间是最大报文段寿命的两倍,即几分钟。这在这几分钟内会占用少量资源 - 但如果这种情况发生在服务器端,而服务器正在处理每秒数百个连接,则这些TIME_WAIT
套接字将迅速增加。最好将这种负担分散在客户端之间。
这取决于应用层协议。- 来自http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm。
TCP连接通常使用特殊的过程终止,其中每个端独立关闭其链接。它通常始于一个应用程序进程向其TCP层发出信号,表明不再需要会话。该设备发送FIN消息以告知其他设备它想要结束连接,然后得到确认。当响应设备准备好时,它也会发送一个FIN并得到确认;等待一段时间以接收ACK后,会话将关闭。
实际上,通常应该是客户端,但没有理由必须如此。