真实面经题目 · 原创解析

Http 报文里有什么?

HTTP 报文是客户端和服务端交换应用层数据的基本格式。HTTP/1.x 报文由起始行、请求头或响应头、空行、消息体组成。请求报文的起始行叫请求行,包含方法、请求目标和协议版本;响应报文的起始行叫状态行,包含协议版本、状态码和原因短语。头部字段描述元信息,空行分隔头部和消息体,消息体承载实际业务数据。

出现于:阿里巴巴 · 后端开发

60 秒回答模板

HTTP 报文分为请求报文和响应报文,但总体结构类似,都是起始行、头部字段、空行和消息体。请求报文的起始行叫请求行,包含请求方法、请求路径或 URL、HTTP 版本,例如 GET、POST、PUT、DELETE 等方法说明客户端想做什么。响应报文的起始行叫状态行,包含 HTTP 版本、状态码和原因短语,例如 200 成功,301/302 重定向,400 请求错误,401 未认证,403 无权限,404 资源不存在,500 服务端错误。头部字段是键值对,用来描述报文元信息,比如 Host、User-Agent、Accept、Content-Type、Content-Length、Cookie、Set-Cookie、Cache-Control、Authorization。头部后有空行表示头部结束,空行后是消息体。GET 通常没有 body,POST/PUT/PATCH 常见 body;响应 body 可能是 HTML、JSON、图片、文件流等。HTTP/2、HTTP/3 底层是帧,但语义上仍保留方法、状态码、头部和主体概念。

考点 总体结构
主线 请求报文
易错点 只回答 header 和 body,漏掉起始行和空行。

深入解析

01

总体结构

HTTP 报文最核心结构是四段:起始行、头部字段、空行、消息体。起始行决定这是一个什么请求或什么响应;头部字段描述上下文和处理规则;空行是协议格式里的边界标记,用来告诉接收方头部到此结束;消息体承载实际数据。只说 header 和 body 不够完整。

02

请求报文

请求报文由请求行、请求头、空行和请求体组成。请求行包含方法、请求目标、协议版本。方法表示操作意图,例如 GET 获取资源,POST 提交数据,PUT 整体替换资源,PATCH 局部更新资源,DELETE 删除资源,HEAD 只获取响应头,OPTIONS 查询服务端支持能力。请求体不是所有方法都必须有。

03

响应报文

响应报文由状态行、响应头、空行和响应体组成。状态行包含协议版本、状态码和原因短语。1xx 表示信息性响应,2xx 表示成功,3xx 表示重定向,4xx 表示客户端侧错误,5xx 表示服务端侧错误。响应体通常是客户端真正需要的数据,但 204、304 或 HEAD 请求响应通常没有 body。

04

头部字段

HTTP 头部是键值对形式的元信息,决定报文如何被解释、缓存、认证、压缩和转发。请求头包括 Host、User-Agent、Accept、Accept-Encoding、Accept-Language、Cookie、Authorization、Referer、Origin。响应头包括 Server、Date、Content-Type、Content-Length、Set-Cookie、Cache-Control、ETag、Last-Modified、Location、Access-Control-Allow-Origin。

05

消息体

消息体承载业务数据。请求体常见格式包括 application/json、application/x-www-form-urlencoded、multipart/form-data、text/plain 或二进制流。响应体可以是 HTML、JSON、XML、图片、音视频、压缩文件或事件流。接收方依赖 Content-Type 理解媒体类型,依赖 Content-Encoding 判断压缩编码,依赖长度或分块规则判断边界。

06

空行的作用

HTTP/1.x 报文头部结束后必须有空行,也就是连续 CRLF 边界。这个空行不承载业务含义,但它是解析报文结构的关键分隔符。接收方读到空行后,才知道后续内容如果存在就属于消息体。缺少空行会导致解析歧义,可能把 body 误认为头部,或者一直等待更多头部字段。

07

报文边界

HTTP 必须解决接收方如何知道消息体结束。常见方式有 Content-Length、Transfer-Encoding: chunked、连接关闭或特定状态码语义。Content-Length 明确给出 body 字节长度;分块传输适合动态生成或流式输出。HTTP/1.1 默认支持持久连接,所以不能简单依赖 TCP 连接关闭判断响应结束。

08

HTTP 版本差异

HTTP/1.1 报文格式容易直接观察,因为它呈现为文本起始行、文本头部和可选 body。HTTP/2 把语义拆成二进制帧,例如 HEADERS 帧和 DATA 帧,并支持多路复用和头部压缩。HTTP/3 在语义上继承 HTTP/2 模型,但运行在 QUIC 之上。基础题以 HTTP/1.1 结构为主,再补充新版底层编码不同。

易错点

  • 只回答 header 和 body,漏掉起始行和空行。
  • 把请求行和状态行混为一谈,没有区分请求报文与响应报文。
  • 认为 GET 请求协议上绝对不能有 body,忽略语法允许但实践不推荐的差异。
  • 把 Content-Type 理解成内容长度,或者把 Content-Length 理解成内容格式。
  • 认为 HTTP 报文等同于 TCP 报文,混淆应用层和传输层。
  • 认为所有响应都有 body,忽略 204、304、HEAD 响应等特殊情况。
  • 只背常见头部名称,不说明每类头部解决什么问题。
  • 不知道报文边界如何确定,无法解释 Content-Length、chunked 和连接复用的关系。

面试官追问

HTTP 请求报文和响应报文最大区别是什么?

最大区别在起始行。请求报文的起始行是请求行,包含方法、请求目标和 HTTP 版本;响应报文的起始行是状态行,包含 HTTP 版本、状态码和原因短语。除此之外,两者都有头部、空行和可选消息体。

GET 请求一定没有 body 吗?

从协议语法上说,GET 并不是绝对不能携带 body,但很多服务器、代理、缓存和框架不会按有 body 的 GET 来设计,语义上也不推荐依赖 GET body。工程实践中 GET 参数通常放在 URL 查询字符串里。

Content-Length 和 chunked 有什么区别?

Content-Length 直接声明消息体字节长度,接收方按固定长度读取。Transfer-Encoding: chunked 表示消息体拆成多个分块传输,每个分块带自己的长度,最后用结束块表示 body 结束,适合长度一开始未知的响应。

为什么 HTTP 报文头后面需要空行?

空行用于标记头部字段结束。HTTP/1.x 的头部是一行一行解析的键值对,接收方需要明确边界来判断后面的字节是否属于消息体。没有空行就会造成解析歧义。

HTTP 报文和 TCP 报文是一回事吗?

不是。HTTP 是应用层协议,描述客户端和服务端交换的应用语义;TCP 是传输层协议,负责可靠字节流传输。一个 HTTP 报文可能被拆到多个 TCP 段里传输,也可能多个 HTTP 消息复用同一个 TCP 连接。

HTTP/2 还有请求行和状态行吗?

HTTP/2 在线路格式上不再使用 HTTP/1.1 的文本请求行和状态行,而是用二进制帧和伪头字段表达相同语义,例如 :method、:path、:scheme、:authority、:status。基础题先按 HTTP/1.1 回答,再说明底层格式变化。