1210 字
6 分钟
TCP协议
TCP 三次握手
TCP(传输控制协议)的三次握手(Three-Way Handshake)是为了建立可靠的连接,确保客户端和服务器之间能够正确通信。三次握手的过程如下:

1. SYN(同步)请求
- 客户端向服务器发送一个 SYN(同步)报文段,表示客户端希望与服务器建立连接。这个报文段中,SYN 标志位被设置为 1,并且客户端生成一个初始序列号(ISN,Initial Sequence Number),比如
ISN=C。 - 此时,客户端处于SYN_SEND状态。
2. SYN-ACK(同步-确认)响应
- 服务器收到客户端的 SYN 报文后,回应一个 SYN-ACK 报文段。这个报文段同时包含两个信息:
- SYN 标志位为 1,表示服务器同意建立连接。
- ACK 标志位为 1,并且确认号为
C+1,即客户端的序列号加 1,表示服务器收到了客户端的 SYN 请求。 - 服务器会为自己选择一个初始序列号(假设是
ISN=S)并将其发送回客户端。
- 此时,服务器处于SYN_RCVD状态。
3. ACK(确认)确认
- 客户端收到服务器的 SYN-ACK 报文后,发送一个 ACK 报文段回服务器,确认号为
S+1(即服务器的序列号加 1),表示客户端已收到服务器的 SYN-ACK。 - 此时,客户端处于ESTABLISHED(已建立连接)状态,服务器也进入ESTABLISHED状态。
总结
- 第一次握手:客户端发送 SYN(请求连接)。
- 第二次握手:服务器回复 SYN-ACK(同意连接)。
- 第三次握手:客户端发送 ACK(确认连接)。
三次握手的作用是确保双方都有能力发送和接收数据,并且为后续的通信过程提供可靠性保证。
TCP 三次握手的原因
- 确认双方都能发送和接收数据。
- 同步序列号。
- 防止旧连接数据干扰,避免资源浪费。
- 确认双方通信能力。
TCP 的四次挥手
TCP 的四次挥手(Four-Way Handshake)是关闭一个 TCP 连接的过程,确保双方都能安全地断开连接,避免数据丢失。四次挥手的过程包括四个步骤:

1. 客户端发送 FIN(终止连接)
- 客户端向服务器发送一个 FIN(Finish)报文段,表示客户端已经没有数据要发送了,请求断开连接。
- 此时,客户端进入FIN_WAIT_1状态。
2. 服务器响应 ACK(确认)
- 服务器收到客户端的 FIN 报文段后,发送一个 ACK(确认)报文段给客户端,表示收到客户端的关闭请求。
- 服务器此时没有完全关闭连接,它可能还需要继续发送剩余的数据,因此服务器进入CLOSE_WAIT状态。
- 客户端收到服务器的 ACK 后,进入FIN_WAIT_2状态。
3. 服务器发送 FIN(终止连接)
- 服务器在完成所有数据的发送后,向客户端发送 FIN 报文段,表示服务器也没有数据要发送了,准备断开连接。
- 服务器此时进入LAST_ACK状态。
4. 客户端响应 ACK(确认)
- 客户端收到服务器的 FIN 报文段后,发送一个 ACK 报文段给服务器,确认收到服务器的关闭请求。
- 客户端进入TIME_WAIT状态,等待足够的时间(通常是 2 倍的最大报文段生存时间,MSL),确保服务器收到确认信息后,客户端才会完全关闭连接。
- 服务器收到客户端的 ACK 后,连接完全断开,进入CLOSED状态。
总结
- 第一次挥手:客户端发送 FIN,表示客户端没有数据要发送。
- 第二次挥手:服务器回复 ACK,确认客户端的关闭请求。
- 第三次挥手:服务器发送 FIN,表示服务器也没有数据要发送。
- 第四次挥手:客户端回复 ACK,确认服务器的关闭请求。
四次挥手的过程确保了数据的完整性和双方的同步关闭,避免出现数据丢失的情况。特别是在客户端和服务器都完成数据发送后,才会进行断开连接的操作。
TCP 四次挥手的主要原因
TCP 四次挥手的主要目的是为了安全、可靠地关闭一个连接,确保双方都能够完成数据传输并正常终止连接。四次挥手的设计是基于 TCP 的全双工通信(即客户端和服务器可以同时发送和接收数据)以及可靠性的需求。下面是四次挥手的主要原因:
- 保证双方的数据都已传输完毕。
- 防止数据丢失。
- 可靠地关闭连接。
- 避免连接资源的提前释放。
- 确保连接的正确关闭。