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

浏览器 read 循环收数据:read 返回 0 表示服务器关了管道(收完了);拼出完整响应再交给 HTTP 解析。

📝 本节和前面几节的关系

发完了看收——本篇把第一章 1.1.6 的【收到响应】补上传输层细节。

一、read 的三种结局

返回正数=收到一块;返回 0=对端关闭(响应收完); 阻塞中=数据还没到。 浏览器按 Content-Length 判断拼齐没有。

二、交给上层

拼完整后交 HTTP 解析——状态码、头部、体各归各位, 渲染管线接着干(21 课的十一步)。

三、动手 Demo:收响应

read 循环的判断树:

for s in ['read 返回 0 ?  -> 服务器关了管道(收完了)',
          '收满 Content-Length ? -> 完整响应到手',
          '否则 -> 继续等下一块']:
    print(s)

实跑输出:

--------------------------------------------------------------------
收响应
--------------------------------------------------------------------
  浏览器 read 时的三段判断:

    read 返回 0 ?  -> 服务器关了管道(响应收完了)
    收满 Content-Length ? -> 完整响应到手
    否则 -> 继续等下一块

  拼完整的响应再交给 HTTP 解析——1.1.6 的状态码出场。

⭐ 2026 现状:HTTP/2 不再靠关闭表示结束—— 流内 END_STREAM 标志承担此职。

30 秒实验

  1. 写 Python 收包循环到 read 返回 0 为止。
  2. 用 curl -v 看响应头里的 Content-Length。
  3. 想想为什么不能靠【连接关了】之外的方式判结束。

常见误区

  1. 以为 read 一次能拿到整个响应——大响应要循环收。
  2. 以为返回 0 是错误——是正常的【收完了】信号。
自测三问(点开对答案) 1. read 返回 0 是什么意思? —— 对端关闭,响应收完。 2. 拼齐的判据是什么? —— 按 Content-Length 累计。 3. 收完之后交给谁? —— HTTP 解析,再交渲染。

相关笔记