下面是 TCP 三次握手(建立连接)与四次挥手(断开连接)过程的详细解释,配合图示说明非常好理解👇
目的是:在客户端与服务端之间建立可靠连接,双方确认彼此的接收/发送能力。
步骤 | 发送方 | 接收方 | 描述 |
---|---|---|---|
第一次握手 | 客户端 → 服务端 | 客户端发送 SYN 报文,随机一个初始序号 seq = x |
|
第二次握手 | 服务端 → 客户端 | 服务端收到 SYN,回复 SYN+ACK
报文,seq = y ,ack = x+1 |
|
第三次握手 | 客户端 → 服务端 | 客户端收到 SYN+ACK,回复 ACK 报文,ack = y+1 |
🔁 连接建立后,双方进入 ESTABLISHED 状态,开始数据传输。
目的是:优雅地关闭连接,确保双方数据都收发完毕。
步骤 | 发送方 | 接收方 | 描述 |
---|---|---|---|
第一次挥手 | 客户端 → 服务端 | 客户端发送 FIN 报文,请求关闭连接 | |
第二次挥手 | 服务端 → 客户端 | 服务端收到 FIN,回复 ACK 报文 | |
第三次挥手 | 服务端 → 客户端 | 服务端处理完数据后,发送自己的 FIN 报文 | |
第四次挥手 | 客户端 → 服务端 | 客户端收到 FIN 后,回复 ACK,进入 TIME_WAIT 状态 |
🔁 服务器进入 CLOSED,客户端在 TIME_WAIT 状态保持一段时间(通常 2MSL),确保最后 ACK 能被收到。
FIN
和 ACK
分开发送,需要两次
FIN,配两个 ACK,共四步。名称 | 步数 | 关键字 | 双向确认 | 保证内容 |
---|---|---|---|---|
三次握手 | 3 | SYN / ACK | ✅ | 建立可靠连接 |
四次挥手 | 4 | FIN / ACK | ✅ | 安全释放连接 |
客户端 服务端
| --- SYN (seq=x) ------> |
| |
| <-- SYN+ACK (seq=y) --- |
| |
| --- ACK (ack=y+1) ----> |
连接建立完成 ✅
客户端 服务端
| --- FIN (seq=u) ------> |
| |
| <-- ACK (ack=u+1) ----- |
| |
| <-- FIN (seq=v) ------- |
| |
| --- ACK (ack=v+1) ----> |
连接断开 ✅
你可以看见C函数各个socket编程函数操作与三次握手四次挥手的关系。
一端发送 FIN 后,进入半关闭状态,表示该端不再发送数据但可接收。
另一端仍可发送数据直到自己关闭连接。