✅ TCP三次握手与四次挥手详解(含标志位示例)
🚀 一、TCP三次握手
目的:在客户端与服务器之间建立可靠的双向连接。
标志位:SYN
(同步)、ACK
(确认)。
💡 握手过程
1️⃣ 第一次握手:客户端 → 服务器
- 客户端向服务器发送连接请求。
- 报文段中:
SYN = 1
:表示同步请求。seq = x
:初始序列号,x
是随机生成的。
- 标志位:
SYN
- 📄 示例报文
客户端 → 服务器:SYN=1, seq=x
2️⃣ 第二次握手:服务器 → 客户端
- 服务器接收连接请求,同意建立连接。
- 报文段中:
SYN = 1
:表示同意同步。ACK = 1
:确认收到客户端的请求。seq = y
:服务器生成自己的初始序列号。ack = x + 1
:确认号,表示客户端的下一个期望序号。
- 标志位:
SYN + ACK
- 📄 示例报文
服务器 → 客户端:SYN=1, ACK=1, seq=y, ack=x+1
3️⃣ 第三次握手:客户端 → 服务器
- 客户端确认服务器的回应。
- 报文段中:
ACK = 1
:确认收到服务器的响应。seq = x + 1
:客户端发送的序号。ack = y + 1
:确认号,表示服务器的下一个期望序号。
- 标志位:
ACK
- 📄 示例报文
客户端 → 服务器:ACK=1, seq=x+1, ack=y+1
✅ 三次握手完成后,双方建立了可靠的TCP连接,开始传输数据。
🛑 二、TCP四次挥手
目的:断开TCP连接,保证数据传输完整。
标志位:FIN
(结束)、ACK
(确认)。
💡 挥手过程
1️⃣ 第一次挥手:客户端 → 服务器
- 客户端发起关闭请求。
- 报文段中:
FIN = 1
:表示请求终止连接。seq = u
:客户端当前序号。
- 标志位:
FIN
- 📄 示例报文
客户端 → 服务器:FIN=1, seq=u
2️⃣ 第二次挥手:服务器 → 客户端
- 服务器确认客户端的关闭请求。
- 报文段中:
ACK = 1
:确认收到客户端的关闭请求。seq = v
:服务器当前序号。ack = u + 1
:确认号,表示服务器已接收客户端的 FIN。
- 标志位:
ACK
- 📄 示例报文
服务器 → 客户端:ACK=1, seq=v, ack=u+1
✅ 服务器此时处于CLOSE_WAIT
状态,继续处理剩余数据。
3️⃣ 第三次挥手:服务器 → 客户端
- 服务器处理完数据后,向客户端发起关闭请求。
- 报文段中:
FIN = 1
:请求终止连接。seq = w
:服务器当前序号。
- 标志位:
FIN
- 📄 示例报文
服务器 → 客户端:FIN=1, seq=w
4️⃣ 第四次挥手:客户端 → 服务器
- 客户端确认服务器的关闭请求。
- 报文段中:
ACK = 1
:确认服务器的 FIN。seq = u + 1
:客户端当前序号。ack = w + 1
:确认号,表示客户端已接收服务器的 FIN。
- 标志位:
ACK
- 📄 示例报文
客户端 → 服务器:ACK=1, seq=u+1, ack=w+1
✅ 四次挥手完成后,TCP连接正式断开。
🔥 三次握手 & 四次挥手过程图解
三次握手:
客户端 服务器
|------- SYN(seq=x) --------->|
|<------ SYN+ACK(seq=y, ack=x+1) ----|
|------- ACK(ack=y+1) ------->|
| 建立连接成功 |
四次挥手:
客户端 服务器
|------- FIN(seq=u) --------->|
|<------ ACK(ack=u+1) --------|
|<------ FIN(seq=w) ----------|
|------- ACK(ack=w+1) ------->|
| 连接关闭完成 |
✅ 示例代码
下面是使用 Go 实现的 TCP 客户端与服务器,展示握手与挥手过程:
服务器:
package main
import (
"fmt"
"net"
)
func main() {
listener, _ := net.Listen("tcp", ":8080")
defer listener.Close()
fmt.Println("服务器启动,等待连接...")
conn, _ := listener.Accept()
fmt.Println("客户端连接成功")
buffer := make([]byte, 1024)
n, _ := conn.Read(buffer)
fmt.Println("接收数据:", string(buffer[:n]))
conn.Write([]byte("欢迎连接!"))
conn.Close()
}
客户端:
package main
import (
"fmt"
"net"
)
func main() {
conn, _ := net.Dial("tcp", "localhost:8080")
defer conn.Close()
fmt.Println("已连接到服务器")
conn.Write([]byte("Hello, Server!"))
buffer := make([]byte, 1024)
n, _ := conn.Read(buffer)
fmt.Println("服务器回复:", string(buffer[:n]))
}
🚀 总结
- 三次握手
- 确保双方都能接收和发送数据,建立可靠连接。
- 四次挥手
- 确保双方的数据传输完成后,安全释放连接。
✅ 三次握手和四次挥手是 TCP 保证数据传输可靠性的重要机制!🔥