TCP 三次握手细节:
-
第一次握手:客户端向服务器发送一个SYN(同步序列号)报文段,该报文段包含客户端打算连接的服务器的端口,以及初始序号(Sequence Number,记为seq=x)。此时客户端进入SYN-SENT状态。这一步是客户端主动发起连接请求,告诉服务器它想建立连接。
-
第二次握手:服务器收到客户端的SYN报文段后,会发送一个SYN+ACK报文段作为应答。其中SYN表示服务器同意建立连接,ACK是确认序号(Acknowledgment Number),值为客户端的初始序号加1,即ack = x + 1,同时服务器也会发送自己的初始序号(假设为seq = y)。此时服务器进入SYN-RCVD状态。这表明服务器收到了客户端的连接请求并同意连接。
-
第三次握手:客户端收到服务器的SYN+ACK报文段后,会向服务器发送一个ACK报文段,确认序号ack = y + 1,序号seq = x + 1 。服务器收到该ACK报文段后,连接建立成功,双方都进入ESTABLISHED状态。这一步完成了连接的建立,双方可以开始进行数据传输。
TCP 四次挥手细节:
-
第一次挥手:客户端发送一个FIN(结束标志)报文段,用来关闭客户端到服务器的数据传送,序号为seq = u(u为客户端已经传送的数据的最后一个字节的序号加1),此时客户端进入FIN-WAIT-1状态。这表示客户端没有数据要发送给服务器了。
-
第二次挥手:服务器收到客户端的FIN报文段后,会发送一个ACK报文段作为确认,确认序号ack = u + 1,序号seq = v(v为服务器已经传送的数据的最后一个字节的序号加1),此时服务器进入CLOSE-WAIT状态。客户端收到这个ACK报文段后,进入FIN-WAIT-2状态。这表明服务器已经收到客户端关闭连接的请求。
-
第三次挥手:服务器处理完剩余数据后,发送一个FIN报文段,序号为seq = w(w通常等于之前的v 加上这段时间新发送的数据字节数),ack = u + 1 ,此时服务器进入LAST-ACK状态。这表示服务器也没有数据要发送给客户端了。
-
第四次挥手:客户端收到服务器的FIN报文段后,发送一个ACK报文段,确认序号ack = w + 1,序号seq = u + 1 ,然后客户端进入TIME-WAIT状态,服务器收到ACK报文段后进入CLOSED状态。至此,连接完全关闭。
TIME-WAIT状态的作用:
-
保证可靠关闭连接:确保最后一个ACK报文段能够到达服务器。如果服务器没有收到最后的ACK,它会重发FIN报文段。处于TIME-WAIT状态的客户端可以重新发送ACK,保证连接可靠关闭。
-
防止已失效的连接请求报文段出现在新连接中:在网络中,旧的分组可能会在网络中滞留一段时间。如果没有TIME-WAIT状态,当客户端快速重新建立与服务器的连接时,可能会收到之前旧连接中残留的报文段,导致数据混乱。TIME-WAIT状态保证了在该时间段内,网络中旧连接的所有报文段都已经消失,避免了这种情况的发生。