根据:https://www.cnblogs.com/zpchcbd/p/12291007.html,大家都可以大致了解了,那么直接可以讲了
有关TCP标志位 flags:
SYN(synchronous建立联机)
ACK(acknowledgement 确认)
PSH(push传送)
FIN(finish结束)
RST(reset重置)
URG(urgent紧急)
Sequence number(顺序号码)
Acknowledge number(确认号码)
大家要先知道TCP连接是双向的,在四次挥手中,前两次挥手用于断开一方方向的连接,后两次挥手用于断开另一方的方向的连接。
注意的是:谁先断不一定,比如HTTP请求中,若connection 模式为CLOSE,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求。
第一次挥手: 客户端先发送一个带有FIN(结束标志位)以及随机Sequence number
的数据包,然后客户端会进入FIN-WAIT-1状态
第二次挥手: 服务端收到后,返回一个带有ACK(确认标志位)的数据包,其中Acknowledge number
为第一次挥手数据包的SEQ+1
和再次随机的Sequence number
,服务端会进入CLOSE-WAIT(关闭等待)状态
,客户端收到该应答后,进入FIN-WAIT-2状态
,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
注意:第二次挥手完成后,客户端到服务端方向的连接已经释放,但服务端到客户端方向的连接仍然存在,服务器若发送数据,客户端依然要接受
第三次挥手: 所以此时服务端继续发送一个数据包为ACK确认标志位
、FIN结束标志位
、Acknowledge number
为第一次挥手数据包的SEQ+1
,再次随机的Sequence number
给客户端,服务端就进入了LAST-ACK(最后确认)状态
,等待客户端的确认。
第四次挥手: 客户端收到服务端的结束数据包之后,向服务器发送一个应答包ACK确认标志位
、Sequence number
为第三次挥手的Acknowledge number
、当前的Acknowledge number
为第三次握手的SEQ+ 1
,客户端就进入了TIME-WAIT(时间等待)状态,这个期间TCP连接还未释放,若该时间段内没有服务端的重发请求的话,客户端就进入CLOSED状态,服务端只要收到了客户端发出的确认,立即进入CLOSED状态
。
这里也可以看出服务端比客户端早结束通信过程,但并不是一定!