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

断开用 FIN 互告——谁先说完谁先关,四个报文各表【我说完了】与【知道了】。

📝 本节和前面几节的关系

响应收完,管道完成使命;本篇看拆管的报文账。

一、四次往来

服务器发 FIN(我说完了)→ 客户端 ACK(知道了)→ 客户端发 FIN(我也完了)→ 服务器 ACK(知道了)。 比握手多一次:两边要各说一次完事。

二、Web 的节奏

HTTP/1.1 的典型连接是【请求-响应-断开】短连接; 长连接(keep-alive)只是把断开推迟到多轮之后。

三、动手 Demo:断开的报文流

四个报文收尾:

for s in ['服务器 -> 客户端  FIN    (我说完了)',
          '客户端 -> 服务器  ACK    (知道了)',
          '客户端 -> 服务器  FIN    (我也完了)',
          '服务器 -> 客户端  ACK    (知道了)']:
    print(s)

实跑输出:

--------------------------------------------------------------------
断开的报文流
--------------------------------------------------------------------
  服务器先关(响应发完了):

    服务器 -> 客户端   FIN       (我说完了)
    客户端 -> 服务器   ACK       (知道了)
    客户端 -> 服务器   FIN       (我也完了)
    服务器 -> 客户端   ACK       (知道了)

  共 4 次往来——比连接多一次,因为两边要各说一次完事。

⭐ 2026 现状:HTTP/2、HTTP/3 的连接生命周期更长, 短连接已不是主流——四次挥手机制不变。

30 秒实验

  1. Wireshark 过滤 tcp.flags.fin==1 抓一次断开。
  2. curl 访问时观察连接是保持还是立即关闭。
  3. 想想为什么 FIN 与 ACK 不能像握手那样合包。

常见误区

  1. 以为断开一个 FIN 就够——两边各一轮。
  2. 以为断开即资源全还——还有等待期(下节)。
自测三问(点开对答案) 1. 断开共几个报文? —— 四个(双方各 FIN+ACK)。 2. 谁先发 FIN? —— 先说完数据的一方(典型是服务器)。 3. 为什么比握手多一次? —— 两方要分别声明结束。

相关笔记