TCP 三次握手和四次挥手
TCP(传输控制协议)是一种面向连接的协议,在建立连接和断开连接时分别需要通过 三次握手 和 四次挥手 来确保通信的可靠性和完整性。
1. 三次握手
三次握手是 TCP 建立连接的过程,确保客户端和服务器双方都准备好进行数据传输。
步骤
-
第一次握手:
- 客户端向服务器发送一个 SYN(同步)包,其中 SYN=1,表示请求建立连接。
- 客户端状态从
CLOSED
变为SYN_SENT
。
-
第二次握手:
- 服务器收到 SYN 包后,向客户端发送一个 SYN+ACK(同步+确认)包,其中 SYN=1,ACK=1。
- 服务器状态从
LISTEN
变为SYN_RCVD
。
-
第三次握手:
- 客户端收到 SYN+ACK 包后,向服务器发送一个 ACK(确认)包,其中 ACK=1。
- 客户端和服务器状态都变为
ESTABLISHED
,连接建立成功。
作用
- 确认双方的通信能力:通过三次握手,确保客户端和服务器都能正常发送和接收数据。
- 同步初始序列号:交换初始序列号,用于后续数据传输的可靠性保证。
2. 四次挥手
四次挥手是 TCP 断开连接的过程,确保客户端和服务器双方都完成数据传输并安全关闭连接。
步骤
-
第一次挥手:
- 客户端向服务器发送一个 FIN(结束)包,其中 FIN=1,表示请求关闭连接。
- 客户端状态从
ESTABLISHED
变为FIN_WAIT_1
。
-
第二次挥手:
- 服务器收到 FIN 包后,向客户端发送一个 ACK(确认)包,其中 ACK=1。
- 服务器状态从
ESTABLISHED
变为CLOSE_WAIT
。 - 客户端收到 ACK 包后,状态从
FIN_WAIT_1
变为FIN_WAIT_2
。
-
第三次挥手:
- 服务器完成数据传输后,向客户端发送一个 FIN 包,其中 FIN=1,表示服务器也准备关闭连接。
- 服务器状态从
CLOSE_WAIT
变为LAST_ACK
。
-
第四次挥手:
- 客户端收到 FIN 包后,向服务器发送一个 ACK 包,其中 ACK=1。
- 客户端状态从
FIN_WAIT_2
变为TIME_WAIT
,等待 2MSL(最大报文段生存时间)后进入CLOSED
状态。 - 服务器收到 ACK 包后,状态从
LAST_ACK
变为CLOSED
。
作用
- 确保数据完整性:通过四次挥手,确保双方都完成数据传输并安全关闭连接。
- 防止旧连接的干扰:通过
TIME_WAIT
状态,防止旧连接的报文干扰新连接。