一、 TCP协议的在建立连接时三次握手和关闭连接时的四次握手
如下图所示:
在建立连接阶段:
1:客户端向服务器发送SYN包,并进入SYN_SEND状态
2:服务器接收到SYN包,确认客户端的SYN包并发送自己的SYN包给客户端,即(SYN+ACK),进入SYN_RCVD状态
3:客户端收到服务器的SYN+ACK, 向服务器发送确认包ACK,服务器和客户端建立连接完成,并都春雨ESTABLISHIED状态。
传输数据======
断开连接:
可以由服务器请求断开连接也可以由客户端请求。我们以图中的客户端请求终止连接为例
1:客户端发送FIN包给服务器,告诉服务器“我这里已经没有需要传送的数据,但是我不会关闭连接,你数据没有传送完的话继续传输”,进入FIN_WAIT状态
2:服务器收到FIN包,但是自己的数据还没有传输完毕,向客户端发送确认包ACK "收到你的FIN包了,但是请等我一下,我的数据没有传输完成"
3:服务器的数据全部发送完成了,发送FIN包给客户端“我的数据全部传输完成,可以关闭连接啦”
4:客户端收到FIN包,知道自己可以关闭连接了,但是担心服务器担心自己没有收到FIN的消息,就发送ACK给服务器"我收到你的消息了,准备关闭了"
5:服务器收到ACK包之后关闭连接
6:客户端等了T时间之后没有收到回复,说明服务器端正常关闭。此时客户端也关闭了。
注:
1: 在TIME_WAIT状态中,如果客户端最后一个发送的ACK丢失,将会重新发送。等待T之后正式关闭连接,释放所有的资源(包括端口号)
2:为什么连接三次握手,关闭四次握手?
当服务器收到客户端的SYN请求之后,可以直接发送SYN+ACK应答以及同步。在关闭连接的时候,服务器收到FIN报文时,因为数据可能没有全部传送完毕,不会立刻关闭SOCKET,因此只能先回复ACK包,当所有报文发完之后,才会发送FIN包。