三次握手过程:
- 第一次握手:客户端向服务器发送一个SYN包,并等待服务器确认。此时,客户端进入SYN_SEND状态。
- 第二次握手:服务器收到SYN包后,向客户端回复一个ACK包以确认客户的SYN,同时自己也发送一个SYN包,即SYN+ACK包。此时,服务器进入SYN_RECV状态。
- 第三次握手:客户端收到服务器的SYN+ACK包后,向服务器发送一个确认包ACK,此包发送完毕后,客户端和服务器都进入ESTABLISHED状态,完成三次握手。
在这三次握手过程中,传送的包并不包含数据,只有在三次握手完成后,客户端与服务器才开始正式传送数据。
四次挥手过程:
- 第一次挥手:客户端向服务器发送一个FIN包,表示客户端主动断开连接,并指定一个序列号。此时,客户端进入FIN_WAIT1状态。
- 第二次挥手:服务器收到FIN包后,发送一个ACK包给客户端,表示已经收到客户端的断开请求,并告诉客户端可以断开连接了。此时,服务器进入CLOSE_WAIT状态,客户端收到ACK包后进入FIN_WAIT2状态。
- 第三次挥手:服务器在发送完数据后,向客户端发送一个FIN包,表示服务器也完成了数据发送,并准备断开连接。此时,服务器进入LAST_ACK状态。
- 第四次挥手:客户端收到FIN包后,向服务器发送一个ACK包,表示已经收到服务器的断开请求,然后进入TIME_WAIT状态。服务器收到ACK包后,断开连接,进入CLOSED状态。客户端在TIME_WAIT状态等待一段时间后(通常是2MSL,即最长报文段寿命的两倍),也进入CLOSED状态,完成四次挥手。