📄 一句话概括
write() 塞进去、read() 取出来;管道双向且顺序不乱;消息从哪起到哪止由 HTTP 的 Content-Length 表达,协议栈只管原样搬运。
📝 本节和前面几节的关系
管道接通了;本篇走数据——一次 HTTP 往返的时序。
一、一来一回
浏览器 write 请求 → 服务器 read 收下 → 服务器 write 响应 → 浏览器 read 收下。 HTTP 的请求-响应各占一来一回。
二、协议栈不问内容
协议栈只管把字节原样送到对面; 【消息边界】是 HTTP 的事——靠头部的 Content-Length 等表达。
三、动手 Demo:通信阶段的一来一回
把一次往返写成时间线:
seq = ['浏览器: write(3, 请求消息) ----请求--->',
'服务器: read(...) 收下并找出数据',
'浏览器: read(3) <---响应----',
'浏览器: 交给渲染']
for s in seq: print(s)
实跑输出:
--------------------------------------------------------------------
通信阶段的一来一回
--------------------------------------------------------------------
HTTP 的一次往返,时序如下:
浏览器: write(3, 请求消息) ----请求---->
服务器: read(...) 收下请求,
找出 HTML 数据
浏览器: read(3) <----响应----
浏览器: 拿到数据,交给渲染
规矩两条:
1) 管道双向——写进去的都会从对面出来,顺序不乱
2) 消息长度协议栈不问——它只管原样搬运,
消息从哪起到哪止由 HTTP 自己的 Content-Length 表达
2026 年 HTTP/2、HTTP/3 已能在一条连接上多路复用多条流, 但那是对【管道用法】的升级——管道本身的形状没变。
30 秒实验
- 用 Python 本机回环写一对 client/server,各发一句话收一句话。
- 把发送顺序倒过来(先 read 后 write),看会发生什么(阻塞)。
- 在网络面板看一条请求的 Content-Length 值。
常见误区
- 以为协议栈理解消息内容——它只搬运字节。
- 以为 write 返回就是对面收到了——只是进了本端协议栈。
自测三问(点开对答案)
1. 收发数据用哪两个函数? —— write 和 read。 2. 消息边界靠什么表达? —— HTTP 头部(如 Content-Length),不是协议栈。 3. 协议栈搬运时改内容吗? —— 不改,原样送到对面。- ☐ 下一节(1.4.5 断开阶段:收发数据结束)
相关笔记
- 断开阶段:收发数据结束 —— 最后一拍
- 用TCP对数据进行分割处理(序列号、ACK号) —— 顺序不乱的底层保证
- 🔌 网络是怎样连接的 · 索引