TCP的三次握手与四次挥手
TCP(Transmission Control Protocol)是面向连接的协议,数据传输前需要建立连接(三次握手),数据传输完成后需要断开连接(四次挥手)。这两个过程的主要目的是确保数据可靠传输。
1. TCP三次握手(Three-Way Handshake)
作用:建立可靠的TCP连接,确保通信双方都具备发送和接收数据的能力,并同步初始序列号(ISN, Initial Sequence Number)。
三次握手过程
假设客户端(Client)与服务器(Server)通信:
-
第一次握手(Client → Server)
- 客户端向服务器发送SYN(同步)报文,表示请求建立连接,并携带一个初始序列号 ISN(c)。
- 报文格式:
SYN=1, Seq=X(X为ISN(c)) - 发送后,客户端进入 SYN_SENT 状态。
-
第二次握手(Server → Client)
- 服务器收到 SYN 请求后,返回一个 SYN-ACK(SYN + ACK)报文:
- SYN=1,表示同意建立连接。
- ACK=1,表示确认收到客户端的 SYN。
- Seq=Y(服务器的初始序列号 ISN(s))。
- Ack=X+1,确认收到客户端的 ISN。
- 报文格式:
SYN=1, ACK=1, Seq=Y, Ack=X+1 - 服务器进入 SYN_RECEIVED 状态。
- 服务器收到 SYN 请求后,返回一个 SYN-ACK(SYN + ACK)报文:
-
第三次握手(Client → Server)
- 客户端收到服务器的 SYN-ACK 后,发送 ACK 报文,表示连接建立完成:
- ACK=1,确认服务器的 SYN。
- Seq=X+1(顺延)。
- Ack=Y+1(确认收到服务器的 ISN)。
- 报文格式:
ACK=1, Seq=X+1, Ack=Y+1 - 发送后,客户端进入 ESTABLISHED(已建立) 状态,服务器收到此ACK后,也进入 ESTABLISHED 状态,通信正式开始。
- 客户端收到服务器的 SYN-ACK 后,发送 ACK 报文,表示连接建立完成:
三次握手示意图
Client Server
| SYN=X --------------------> |
| |
| <-------------------- SYN=Y, ACK=X+1 |
| |
| ACK=Y+1 ------------------> |
| |
[连接建立]
2. 为什么需要三次握手?
- 防止已失效的连接请求重新被服务器接受
如果使用 两次握手,可能会出现旧的连接请求被服务器误接收,导致错误的数据传输。
例如:
- 客户端发送 SYN 请求,但由于网络延迟,该请求未及时到达服务器。
- 客户端以为服务器未响应,便重新发起连接请求并成功建立连接。
- 旧的 SYN 报文迟迟到达服务器,若服务器直接回应 ACK,则可能导致服务器建立错误的连接。
三次握手的第三步 确保了客户端确认连接的有效性,防止了这种情况。
3. TCP四次挥手(Four-Way Handshake)
作用:确保双方数据传输完成后,安全释放连接,避免出现数据丢失。
四次挥手过程
假设客户端(Client)要关闭连接:
-
第一次挥手(Client → Server)
- 客户端向服务器发送 FIN(Finish) 报文,表示数据发送完毕,希望关闭连接。
- 报文格式:
FIN=1, Seq=U - 发送后,客户端进入 FIN_WAIT_1 状态。
-
第二次挥手(Server → Client)
- 服务器收到 FIN 后,返回 ACK 报文:
- ACK=1,确认收到客户端的 FIN。
- Ack=U+1。
- 报文格式:
ACK=1, Seq=V, Ack=U+1 - 服务器进入 CLOSE_WAIT 状态,等待处理剩余业务,客户端进入 FIN_WAIT_2 状态。
- 服务器收到 FIN 后,返回 ACK 报文:
-
第三次挥手(Server → Client)
- 服务器处理完所有任务后,发送 FIN 报文,通知客户端可以关闭连接:
- FIN=1,表示服务器不再发送数据。
- Seq=V。
- 报文格式:
FIN=1, Seq=V - 服务器进入 LAST_ACK 状态。
- 服务器处理完所有任务后,发送 FIN 报文,通知客户端可以关闭连接:
-
第四次挥手(Client → Server)
- 客户端收到 FIN 后,返回 ACK 报文,表示确认:
- ACK=1,确认收到服务器的 FIN。
- Ack=V+1。
- 报文格式:
ACK=1, Seq=U+1, Ack=V+1 - 客户端进入 TIME_WAIT 状态,等待一段时间(通常是2MSL,最大报文存活时间),确保服务器收到了 ACK,随后进入 CLOSED 状态。
- 服务器收到 ACK 后,直接进入 CLOSED 状态,连接完全关闭。
- 客户端收到 FIN 后,返回 ACK 报文,表示确认:
四次挥手示意图
Client Server
| FIN=U --------------------> |
| |
| <-------------------- ACK=U+1 |
| |
| (服务器等待处理完剩余数据) |
| FIN=V --------------------> |
| |
| <-------------------- ACK=V+1 |
| |
[连接关闭]
4. 为什么挥手需要四次?
-
TCP是全双工通信,必须双方都同意关闭
- 三次握手时,双方都发送了 SYN,表示都愿意通信,可以合并ACK和SYN一起发送。
- 四次挥手时,服务器收到 FIN 后,可能还有未发送完的数据,因此需要先发送 ACK 确认,然后再发送 FIN 关闭连接,因而需要额外的一次挥手。
-
TIME_WAIT 状态的必要性
- TIME_WAIT 主要是为了防止旧数据包的影响,确保服务器正确关闭连接。如果直接关闭,可能会导致服务器错误地接受过期数据。
5. 总结
| 过程 | 三次握手 | 四次挥手 |
|---|---|---|
| 目的 | 建立连接 | 断开连接 |
| 报文数 | 3 个 | 4 个 |
| 状态 | SYN_SENT、SYN_RECEIVED、ESTABLISHED | FIN_WAIT_1、FIN_WAIT_2、CLOSE_WAIT、LAST_ACK、TIME_WAIT |
| 特殊状态 | - | TIME_WAIT(确保旧数据不会干扰新连接) |
| 原因 | 防止旧 SYN 报文造成误连接 | 服务器可能还有未处理的数据,需分两步释放 |
总结一句话:
- 三次握手 保证可靠连接建立,防止旧连接误触发;
- 四次挥手 确保数据完整发送,保证双方安全关闭连接。
这些机制确保了TCP的可靠性,使其适用于要求高稳定性的网络通信场景,如HTTP、FTP、SSH等。

1万+

被折叠的 条评论
为什么被折叠?



