三次握手 (TCP 连接建立)
三次握手的目的是确保双方都具备发送和接收数据的能力,并且能正确同步初始序列号(ISN, Initial Sequence Number)。
过程
-
客户端 → 服务器:SYN
- 客户端发送 SYN(同步)包给服务器,并选择一个初始序列号 (ISN=x)。
- 目的:告知服务器希望建立连接,并告知自己的序列号。
-
服务器 → 客户端:SYN + ACK
- 服务器收到 SYN 后,返回 SYN-ACK(同步 + 确认)包:
- ACK 确认 客户端的 ISN(x+1)
- 服务器自己也生成一个 ISN (ISN=y),并发送 SYN 给客户端。
- 服务器收到 SYN 后,返回 SYN-ACK(同步 + 确认)包:
-
客户端 → 服务器:ACK
- 客户端收到 SYN-ACK 后,发送 ACK 确认:
- 确认 服务器的 ISN(y+1)
- 连接建立,数据可以开始传输。
- 客户端收到 SYN-ACK 后,发送 ACK 确认:
这个握手步骤发生在 DNS 查询之后,TLS 握手(用于创建安全连接)之前。连接可以由连接的每一方独立终止,通过四次挥手,每一方独立地发送和接收一对 FIN(结束)和 ACK 消息。
四次挥手 (TCP 连接终止)
四次挥手的目的是确保数据传输完成后,双方都能优雅地关闭连接。
过程
-
客户端 → 服务器:FIN
- 客户端发送 FIN(Finish)包,表明 不再发送数据,但仍然可以接收数据。
- 进入 FIN_WAIT_1 状态。
-
服务器 → 客户端:ACK
- 服务器收到 FIN 后,发送 ACK 确认。
- 此时连接处于 半关闭 状态,服务器仍然可以向客户端发送数据。
- 服务器进入 CLOSE_WAIT 状态。
-
服务器 → 客户端:FIN
- 服务器在发送完最后的数据后,发送 FIN,表示也要关闭连接。
-
客户端 → 服务器:ACK
- 客户端收到 FIN 后,发送 ACK,确认关闭。
- 进入 TIME_WAIT 状态(等待一段时间,确保服务器收到 ACK)。
- 最终连接关闭。
补充细节
-
为什么三次握手需要三步?
- 防止历史重复连接:如果只有两步,旧的 SYN 可能会被误认为是新连接,造成数据错误。
- 确保双方的发送和接收能力都正常。
-
为什么四次挥手需要四步?
- TCP 连接是 全双工(即双方可以同时发送和接收),所以需要 双方分别关闭 各自的数据流。
- 服务器可能需要等待数据发送完毕后再关闭,所以不能立即发送 FIN。
-
TIME_WAIT 状态的作用
- 客户端在关闭后,会进入 TIME_WAIT 状态,保持一段时间(一般是 2 倍的 MSL,最大段生存时间)。
- 目的:
- 确保最后的 ACK 能够被服务器收到,避免服务器误以为连接未完全关闭。
- 防止旧的重复数据包被误认为是新连接的数据包。
总结
- 三次握手 用于 建立连接,确保通信双方的收发能力正常,并同步初始序列号。
- 四次挥手 用于 终止连接,保证双方都能正确关闭数据流,防止数据丢失。
- TIME_WAIT 状态用于防止旧数据包干扰新连接,确保连接真正关闭。
这就是 TCP 可靠性的关键,也是其区别于 UDP(无连接)的重要特性! 🚀