一、铁律
- 三次握手 = 建立连接 → 只能由客户端主动发起
- 四次挥手 = 断开连接 → 客户端、服务器谁都可以先发起关闭
二、TCP 报文里必须认识的标志位
- SYN :同步序号,用来发起连接
- ACK:确认应答,表示 "我收到了"
- FIN:结束,表示 "我要关闭连接"
- seq :本方发送的序列号
- ack :期望收到对方下一个字节的确认号
三、TCP 三次握手(建立连接)
角色:
- 客户端(Client):主动发起连接
- 服务器(Server):被动接受连接
完整流程(逐行解释)
第一次握手:客户端 → 服务器
- 客户端发送:SYN = 1,seq = x
- 含义:"喂,我想和你建立连接,我的起始序号是 x。"
第二次握手:服务器 → 客户端
- 服务器回复:SYN = 1,ACK = 1,seq = y,ack = x + 1
- 含义:"收到你的连接请求!我同意了。我的起始序号是 y,我期望你下一次发 x+1。"
第三次握手:客户端 → 服务器
-
客户端发送:ACK = 1,seq = x + 1,ack = y + 1
-
含义:"收到你的同意!我下一个发 y+1,连接正式建立!"
客户端 服务器
| |
| SYN, seq=x |
|------------------------------->|
| |
| SYN+ACK, seq=y, ack=x+1 |
|<-------------------------------|
| |
| ACK, seq=x+1, ack=y+1 |
|------------------------------->|
| |
连接建立
总结三次握手
- 客户端发 SYN:我要连你
- 服务器回 SYN+ACK:同意,我也准备好
- 客户端回 ACK:收到,连接成功
四、TCP 四次挥手(断开连接)
特点:
- 双向独立关闭
- 客户端、服务器谁都可以先发起关闭
- 必须 4 步,因为双方都要确认 "我发完了""我收完了"
假设:客户端先发起关闭(服务器发起也一样)
第一次挥手:客户端 → 服务器
- 发送:FIN = 1,seq = u
- 含义:"我数据发完了,我要关闭发送方向。"
第二次挥手:服务器 → 客户端
- 回复:ACK = 1,ack = u + 1,seq = v
- 含义:"收到你要关闭。我确认,但我可能还有数据要发。"
第三次挥手:服务器 → 客户端
- 服务器发完自己的数据后,发送:FIN = 1,ACK = 1,seq = w,ack = u + 1
- 含义:"我也发完了,我也要关闭了。"
第四次挥手:客户端 → 服务器
-
客户端回复:ACK = 1,ack = w + 1,seq = u + 1
-
含义:"收到你关闭,连接彻底断开。"
客户端 服务器
| |
| FIN, seq=u |
|------------------------------->|
| |
| ACK, seq=v, ack=u+1 |
|<-------------------------------|
| |
| FIN, seq=w, ack=u+1 |
|<-------------------------------|
| |
| ACK, seq=u+1, ack=w+1 |
|------------------------------->|
| |
连接关闭
总结四次挥手
- 一方发 FIN:我关了
- 对方回 ACK:知道了(但可能还在发数据)
- 对方发完再发 FIN:我也关了
- 一方回 ACK:收到,彻底断开
五、最关键的区别
三次握手(建连接)
- 客户端主动发起
- 3 步完成
- SYN、ACK
四次挥手(断连接)
- 双方都可发起
- 必须 4 步
- FIN、ACK