一句话总结:
TCP三次握手就像两人见面握手——先伸手(SYN),再回握(SYN-ACK),最后确认(ACK),确保双方都准备好通信!
一、流程拆解(打电话比喻)
假设你想和朋友 可靠地 通话,步骤如下:
1. 第一次握手(客户端 → 服务器)
- 动作:你打电话给朋友,说:“喂,听得到吗?我想和你聊天! ”(发送
SYN包)。 - 意义:客户端告诉服务器:“我要建立连接,这是我的初始序号(
SEQ=100)。”
2. 第二次握手(服务器 → 客户端)
- 动作:朋友回答:“听到啦!我也准备好聊天了,你听得到我吗? ”(回复
SYN-ACK包)。 - 意义:服务器确认收到请求(
ACK=100+1),并告知自己的初始序号(SEQ=300)。
3. 第三次握手(客户端 → 服务器)
- 动作:你最后确认:“听到啦,开始聊吧! ”(发送
ACK包)。 - 意义:客户端确认服务器响应(
ACK=300+1),双方正式建立连接。
二、为什么必须三次?两次行不行?
假设只有两次握手:
- 场景:你第一次打电话给朋友(
SYN),但信号差他没听到,你又打了第二次。 - 问题:朋友可能收到两个请求,以为你要建两个连接,浪费资源。
三次握手的作用:
- 防旧连接干扰:确保当前连接是最新请求,避免历史残留的无效请求占用资源。
- 确认双向通信能力:双方都确认自己能发且能收,避免单向通信故障。
三、技术细节(包结构)
- SYN包:
Flags=SYN, SEQ=客户端初始序号 - SYN-ACK包:
Flags=SYN+ACK, SEQ=服务器初始序号, ACK=客户端序号+1 - ACK包:
Flags=ACK, ACK=服务器序号+1
示例:
客户端 → 服务器:SYN(SEQ=100)
服务器 → 客户端:SYN-ACK(SEQ=300, ACK=101)
客户端 → 服务器:ACK(ACK=301)
四、常见问题解答
1. 为什么初始序号是随机数?
- 防预测攻击:若序号可预测,黑客可能伪造包插入数据。
2. 握手失败会怎样?
- 超时重传:客户端若未收到
SYN-ACK,会重发SYN(默认重试5次)。
3. 三次握手能防止DDoS攻击吗?
- 不能:攻击者可伪造IP发送大量
SYN包,耗尽服务器资源(SYN洪水攻击)。 - 防御:SYN Cookie、限制并发连接数。
五、总结口诀
“三次握手保可靠,一SYN来二ACK。
一来一回再确认,双向通信无烦恼。
历史连接防干扰,随机序号防伪造。