8. 说一下 TCP 的三次握手

发布于:2025-07-13 ⋅ 阅读:(25) ⋅ 点赞:(0)

总结

  1. 第 一 次 握手:客户端->服务器,SYN = 1, seq = x
  2. 第 二 次 握手:服务器->客户端,SYN = 1, ACK = 1, seq = y, ack = x+1
  3. 第 三 次 握手:客户端->服务器,ACK = 1, seq = x+1, ack = y+1

TCP 三次握手详解

TCP 是面向连接的协议,在数据传输前必须通过“三次握手(Three-Way Handshake)”建立可靠的连接。该过程确保客户端与服务器都具备发送和接收数据的能力。


一、三次握手流程图解

客户端                        服务器
   |                             |
   |------- SYN=1, seq=x -------->|
   |                             |
   |<------ SYN=1, ACK=1, seq=y, ack=x+1 ----|
   |                             |
   |------- ACK=1, seq=x+1, ack=y+1 ------>|
   |                             |

二、三次握手详细步骤

✅ 第一次握手

  • 客户端 → 服务器
  • 发送标志位:SYN = 1(同步标志)
  • 序列号:seq = x(随机初始序列号)
  • 状态变化:
    • 客户端由 CLOSED 状态进入 SYN_SENT

📌 作用:客户端告诉服务器,“我想和你建立连接,并且我这边已经准备好发送数据了。”


✅ 第二次握手

  • 服务器 → 客户端
  • 发送标志位:SYN = 1 + ACK = 1(确认标志)
  • 序列号:seq = y(服务器随机生成)
  • 确认号:ack = x + 1(对客户端 seq 的确认)

📌 作用:服务器回应客户端,表示“我收到你的请求,并且我也准备好了通信。”

  • 状态变化:
    • 服务器由 LISTEN 进入 SYN_RCVD

✅ 第三次握手

  • 客户端 → 服务器
  • 发送标志位:ACK = 1
  • 序列号:seq = x + 1
  • 确认号:ack = y + 1(对服务器 seq 的确认)

📌 作用:客户端确认服务器的接收和发送能力正常,连接正式建立。

  • 状态变化:
    • 客户端进入 ESTABLISHED
    • 服务器也进入 ESTABLISHED

三、为什么是三次握手?不是两次或四次?

❓ 为什么不能是两次握手?

如果只进行两次握手:

  • 客户端发送 SYN 后,服务器回复 SYN-ACK 并认为连接已建立。
  • 若客户端因网络延迟未能及时收到 SYN-ACK,可能超时重发,而服务器会为每个请求分配资源,容易遭受 SYN Flood 攻击
  • 此外,服务器无法确认客户端是否能接收数据。

✅ 三次握手的作用:

  1. 防止已失效的连接请求突然传到服务器(避免资源浪费)
  2. 双方都能确认彼此具有发送和接收能力
  3. 提高安全性,防止部分 DDoS 攻击

四、关键字段说明

字段 含义
SYN Synchronize,用于发起连接
ACK Acknowledgment,确认收到对方的数据
seq Sequence Number,序列号,标识本次发送的数据起始位置
ack Acknowledgment Number,确认号,期望收到的下一段数据起始位置

五、总结对比表

握手次数 角色 标志位 序列号 确认号 作用
第一次 客户端 → 服务器 SYN=1 seq=x - 客户端请求建立连接
第二次 服务器 → 客户端 SYN=1, ACK=1 seq=y ack=x+1 服务器确认并同步
第三次 客户端 → 服务器 ACK=1 seq=x+1 ack=y+1 客户端最终确认连接

六、补充知识点:ISN(Initial Sequence Number)

  • 每次握手的 seq 值是一个随机初始序列号(ISN)
  • ISN 不是从 0 开始,而是基于时间戳动态生成,防止攻击者猜测。
  • 目的是增强安全性,防止 TCP 会话劫持(Session Hijacking)。

七、一句话总结

TCP 三次握手是为了在不可靠的网络中建立一个可靠的连接,确保双方都能发送和接收数据,同时防止资源浪费和提升安全性。



网站公告

今日签到

点亮在社区的每一天
去签到