✉️ 第二篇:《拆解一封网络信:HTTP 报文详解》
上一篇我们知道:HTTP 是浏览器和服务器之间的一种"交流语言"。
那么,这门语言到底长什么样?浏览器到底说了什么话?服务器又是怎么回答的?
本篇,我们就要把这封"网络信"------HTTP 报文,彻底拆开看个明白。
一、HTTP 报文是什么?
在浏览器访问一个网站时,比如输入:
https://www.example.com/
你看到的网页,其实是浏览器发送了一封"请求信"(Request),服务器收到后回了一封"回信"(Response)。
这两封信就是我们常说的 HTTP 报文(HTTP Message)。
所以:
- 请求报文:客户端(浏览器)发出的信;
- 响应报文:服务器回来的信。
二、HTTP 报文的三大组成部分
HTTP 报文结构非常规整,分为三部分:
起始行(Start Line)
请求/响应头(Headers)
消息体(Body)
我们先来看看 请求报文 长什么样👇
(1)请求报文实例
假设我们用浏览器访问百度:
GET / HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0
Accept: text/html
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
🔍 分析:
-
第一行:请求行(起始行)
- GET → 请求方法(表示要获取资源)
- / → 资源路径
- HTTP/1.1 → 协议版本
-
后几行:请求头(告诉服务器一些额外信息)
-
空一行后(这里没有 Body)→ 请求体
🌰 举个例子
就像你发快递时,快递单上写着:
收件人:服务器
快递内容:我想要这个网页
备注:我是谁,用什么浏览器看的
(2)响应报文实例
服务器收到请求后,回信如下:
HTTP/1.1 200 OK
Date: Sun, 27 Oct 2025 05:00:00 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 1256
Connection: keep-alive
<!DOCTYPE html>
<html>
<head><title>百度一下</title></head>
<body>...</body>
</html>
🔍 分析:
-
第一行:状态行
- 协议版本:HTTP/1.1
- 状态码:200
- 状态描述:OK(请求成功)
-
接下来是响应头(告诉浏览器内容类型、长度等信息)
-
空行后是响应体(HTML 网页内容)
三、请求方法:GET、POST、PUT、DELETE......
HTTP 提供了很多"动词"来表达请求意图:
| 方法 | 作用 | 示例 |
|---|---|---|
| GET | 获取资源 | 访问网页、加载图片 |
| POST | 提交数据 | 提交表单、登录信息 |
| PUT | 更新资源 | 修改用户资料 |
| DELETE | 删除资源 | 删除帖子 |
| HEAD | 获取响应头,不要内容 | 检查资源是否存在 |
| OPTIONS | 查看服务器支持哪些方法 | 预检请求(CORS 用) |
🔧 小实验:
在命令行输入:
bash
curl -v https://www.baidu.com
可以看到浏览器"说的话"和服务器"回的话"全过程,非常直观!
四、HTTP 状态码全家桶
状态码是服务器告诉浏览器:"这事儿我干得怎么样"的数字信号。
| 状态码 | 分类 | 含义 |
|---|---|---|
| 1xx | 信息响应 | 已接收,继续处理 |
| 2xx | 成功 | 一切正常 |
| 3xx | 重定向 | 去别的地方看看吧 |
| 4xx | 客户端错误 | 你请求错了 |
| 5xx | 服务器错误 | 我这边出问题了 |
常见状态码:
| 状态码 | 含义 |
|---|---|
| 200 OK | 请求成功 |
| 301 Moved Permanently | 永久重定向(比如 HTTP→HTTPS) |
| 302 Found | 临时重定向 |
| 404 Not Found | 页面不存在 |
| 500 Internal Server Error | 服务器挂了 |
| 503 Service Unavailable | 服务器暂时忙 |
💡 比如:当你访问了不存在的页面,服务器返回的就是:
HTTP/1.1 404 Not Found
五、HTTP 头:浏览器与服务器的"沟通信号"
HTTP 头信息其实就像一堆"附言",告诉对方这次通信的详细情况。
📬 请求头常见字段
| 字段名 | 说明 |
|---|---|
| Host | 请求的主机名(域名) |
| User-Agent | 浏览器信息 |
| Accept | 接受的内容类型 |
| Accept-Encoding | 支持的压缩格式 |
| Cookie | 携带登录状态 |
📤 响应头常见字段
| 字段名 | 说明 |
|---|---|
| Content-Type | 返回内容类型(HTML、JSON、图片等) |
| Content-Length | 内容长度 |
| Set-Cookie | 设置浏览器 Cookie |
| Cache-Control | 缓存策略 |
| Server | 服务器软件信息 |
六、HTTP Body:真正的"数据载体"
报文体(Body)部分就是实际传输的数据。
不同方法有不同内容:
- GET 请求:通常没有 Body;
- POST 请求:表单数据或 JSON 放在 Body 中。
🌰 例如 POST 登录请求:
POST /login HTTP/1.1
Host: example.com
Content-Type: application/json
Content-Length: 48
{"username": "joon", "password": "123456"}
七、实战:用浏览器开发者工具观察 HTTP 报文
-
打开任意网页(如百度)
-
按下
F12→ 切换到 Network(网络) 面板 -
刷新页面
-
点击第一个请求(一般是主页)
-
你会看到:
- Headers:请求头、响应头
- Preview:网页内容
- Timing:请求耗时
这就是 HTTP 报文的可视化形态。非常推荐你亲手操作一遍。
八、总结
| 部分 | 含义 |
|---|---|
| 请求行 / 状态行 | 说明操作意图或返回状态 |
| 头部 | 附加信息(谁发的、要什么、返回什么) |
| 空行 | 分隔标志 |
| 消息体 | 实际内容(网页、图片、数据等) |
九、下一篇预告 🚀
我们了解了"HTTP 报文"的样子,但它们是怎么在网络上传输的?
点击网页的一瞬间,数据经历了什么?
👉 下一篇:《从点击到响应:HTTP 请求是如何传出去的》
我们将带你走进 TCP、IP、DNS 的世界,看看一个请求的完整旅程!