一句话说透计算机网络里面的tcp三次握手机制

184 阅读2分钟

一句话总结:
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。
一来一回再确认,双向通信无烦恼。
历史连接防干扰,随机序号防伪造。