📄 一句话概括
浏览器 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 秒实验
- 写 Python 收包循环到 read 返回 0 为止。
- 用 curl -v 看响应头里的 Content-Length。
- 想想为什么不能靠【连接关了】之外的方式判结束。
常见误区
- 以为 read 一次能拿到整个响应——大响应要循环收。
- 以为返回 0 是错误——是正常的【收完了】信号。
自测三问(点开对答案)
1. read 返回 0 是什么意思? —— 对端关闭,响应收完。 2. 拼齐的判据是什么? —— 按 Content-Length 累计。 3. 收完之后交给谁? —— HTTP 解析,再交渲染。- ☐ 下一节(2.4.1 数据发送完毕后断开连接)
相关笔记
- 发送请求后会收到响应 —— 应用层视角
- 数据发送完毕后断开连接 —— 收完就轮到断开
- 🔌 网络是怎样连接的 · 索引