HTTP 字节装配台 · 边界实验

消息到哪里才算读完?

同一段中文和英文,换一种边界规则,线路上的“结束”信号就完全不同。先改内容,再故意把长度写错,看解析器究竟会少读、等待,还是直接拒绝。

0 B 当前 UTF-8 消息体

线路表示

HTTP/1.1 · 固定长度

          

解析器先从字段区得到总字节数,再从连续字节流中恰好读取这么多内容。

TCP 字节流中的接收批次

下方为十六进制;� 表示字符跨过分段

解析器尚未运行

调整输入和边界规则时,线路表示会立即重算。点击“逐段运行解析器”观察读取过程。

边界明确,消息可完整交付

实际内容
0 B
声明 / 校验
0 B
解析后果
完整读取

固定长度:先承诺,再读取

Content-Length 数的是编码后的字节。写小会留下字节,写大则要等待尚未到达的字节。

分块传输:结束写在流里

每块自带十六进制长度,最后以 0 CRLF CRLF 收尾。它只属于 HTTP/1.1。

DATA 帧:帧长划块,流标志收尾

HTTP/2/3 依靠帧边界与 END_STREAM。即使帧能读完,声明的总长度仍必须和内容总量一致。

实验提示:真实服务不应“猜测”冲突消息的意思。代理与应用若选择了不同边界,后续字节可能被误当成下一条请求,因此成熟实现会尽早拒绝含糊输入。