🔌 第二章 用电信号传输TCP/IP数据
📄 一句话概括

connect 触发三次握手:SYN 带各自的起始序号、ACK 确认——三个报文后两边对齐了【对账的起点】,管道算接通。

📝 本节和前面几节的关系

2.2.1/2.2.2 备好了概念;本篇看接通时线上真实跑的报文。

一、三次往来的剧本

客户端发 SYN(附起始序号 b);服务器回 SYN+ACK(起始号 a+确认 b+1); 客户端再回 ACK(确认 a+1)。三个报文,连接建立。

二、起始序号的意义

两边的序号不是从固定值开始而是随机起始—— 防止上一条同名连接的迟到大包混进这条连接。

三、动手 Demo:连接的三次握手

把剧本按时报文写出来:

for s in ['客户端 -> 服务器  SYN b      (我想连)',
          '服务器 -> 客户端  SYN a+ACK b+1',
          '客户端 -> 服务器  ACK a+1     (连上了)']:
    print(s)

实跑输出:

--------------------------------------------------------------------
连接的三次握手
--------------------------------------------------------------------
  connect 触发的实际报文流(教材叫【1 拉 2 按 3 承认】):

    客户端 -> 服务器   SYN b        (我想连,起始号 b)
    服务器 -> 客户端   ACK b+1      (收到了)
    服务器 -> 客户端   SYN a        (我也要连,起始号 a)
    客户端 -> 服务器   ACK a+1      (收到了)

  实际传输里 SYN 和 ACK 搭一辆车,共 3 次往来。
  各自报的起始号(a、b)后面全程用来对账。

⭐ 2026 现状:三次握手同时承担了 TCP Fast Open、 SYN Cookie 防攻击等新职责——骨架三十年没变。

30 秒实验

  1. Wireshark 过滤 tcp.flags.syn==1,抓一次真实握手。
  2. 数一数握手共几个报文、各带什么标志位。
  3. 想想 SYN 攻击为什么能让服务器瘫(半连接堆满)。

常见误区

  1. 以为握手是【拉网线】的动作——交换的是控制报文。
  2. 以为序号从 1 开始——随机起始,双方各一套。
自测三问(点开对答案) 1. 三次握手各发什么? —— SYN、SYN+ACK、ACK。 2. 起始序号为什么随机? —— 防旧连接的包混入。 3. 握手完成后两边对齐了什么? —— 对账起点(各自的序号)。

相关笔记