2.4.1 数据发送完毕后断开连接
- 协议栈在设计上允许任何一方先发起断开过程。
- 以服务器断开为例:
首先,服务器一方的应用程序会调用Socket库的close程序。
然后,服务器的协议栈会生成包含断开信息的TCP头部,就是将控制位的FIN比特设置为1。
当收到服务器发来的FIN为1的TCP头部时,客户端协议栈会将自己的套接字标记为进入断开操作状态,然后为了告知服务器已收到FIN为1的包,客户端向服务器返回一个ACK号。
当客户端应用程序把全部返回数据都读取完毕后,客户端应用程序会调用close来结束收据收发操作,这时客户端会向服务器发送FIN为1的包,然后服务器返回ACK号确认断开。
2.4.2 删除套接字
- 通信结束之后不会立刻删除套接字而是会等待一段时间,这是为了防止误操作。
比如客户端主动发起断开连接发送FIN,服务器返回ACK,服务器发送FIN,客户端返回ACK。如果最后客户端返回的ACK丢失了,服务器会重发FIN,而此时客户端把套接字删除了,并且这个端口被另外新启动的应用程序占用了,那么这个FIN就会错误的跑道新套接字里面,新套接字就开始执行断开操作了。 - 等待时间和包重传的操作方式有关。
网友评论