前言:本文将简单介绍一下http协议.同时也借助抓包工具wireshark来对HTTP数据包的结构进行分析
HTTP 报文结构解析
HTTP协议是基于TCP数据报,做出的数据处理,处理后的数据结构在HTTP数据包中的结构也是不得不分析的一个重点
HTTP协议是一个文本协议(HTTP/1.1),文本的组织结构可以分为以下四种
(一) 请求包 (Request)
- 起始行 (Start Line): 包含方法(GET/POST)、URL、版本号。
- 头部 (Headers): 键值对形式,说明元数据(Host, User-Agent, Cookie)。
- 空行: 区分头部和正文的界限(非常重要,Wireshark 中能看到
\r\n)。 - 正文 (Body): 提交的数据。
下面是一个抓到的post请求包:

1. 起始行 (Start Line)
这一行定义了请求的基本动作和目标。
-
POST /mmtls/00003095 HTTP/1.1\r\n-
POST: 请求方法,表示向服务器提交数据。
-
/mmtls/00003095: 请求的具体路径(URI)。从路径看,这是在进行 MMTLS 协议握手或数据传输。
-
HTTP/1.1: 使用的 HTTP 版本协议。
-
\r\n: 回车换行符,代表该行结束。
-
2. 请求头 (Request Headers)
这部分提供了关于客户端环境及请求正文的元数据。
-
Accept: */*\r\n: 告知服务器客户端可以接收任何格式的响应数据。 -
Cache-Control: no-cache\r\n: 强制要求不使用缓存,直接从服务器获取最新数据。 -
Connection: Keep-Alive\r\n: 请求服务器保持 TCP 连接开启,以便后续复用,减少握手开销。 -
Content-Length: 475\r\n: 告知服务器,接下来的"正文"部分长度为 475 字节。 -
Content-Type: application/octet-stream\r\n: 表示正文是二进制流数据(通常用于加密内容或文件传输)。 -
Host: 240e:97c:2f:3046::21\r\n: 目标服务器的 IPv6 地址。 -
Upgrade: mmtls\r\n: 这是一个关键头,表示客户端希望将连接协议升级/切换为微信特有的 mmtls 加密协议。 -
User-Agent: MicroMessenger Client\r\n: 客户端标识,说明发送方是微信客户端。 -
X-Online-Host: 240e:97c:2f:3046::21\r\n: 一个自定义的扩展头,通常用于代理服务器或 CDN 识别真实的目标主机。
3. 空行 (Empty Line)
-
\r\n- 在最后一个请求头(X-Online-Host)之后,有一个完全空白的行。这是 HTTP 协议标准规定的,用于分隔请求头和正文。
4. 正文 (Body / Payload)
-
Data (475 bytes)-
这部分对应截图最下方的
Data栏。 -
由于
Content-Type是application/octet-stream,且涉及到mmtls协议,这些数据(十六进制显示的1a 22 50 18...)是经过加密的二进制数据,无法直接通过肉眼读出具体明文内容。
-
(二) 响应包 (Response)
响应包是对于客户端发来的数据做出的一个处理,格式上与请求包有略微不同
但是总体也是可以分为四个部分
- 起始行: 包含版本号、状态码(200, 404, 500)、状态描述。
- 头部: 包含 Server, Content-Type, Set-Cookie 等。
- 空行: /r/n
- 正文: 返回的 HTML、JSON 或图片数据。
下面是一个使用wireshark的HTTP数据包的抓包结果

1. 起始行 (Status Line / Start Line)
图中第一行:HTTP/1.1 200 OK\r\n
-
版本号:
HTTP/1.1 -
状态码:
200(代表请求成功)。 -
状态描述:
OK。 -
意义: 告诉客户端,服务器已经成功收到了请求并处理完毕。
2. 响应头部 (Response Headers)
从 Content-Length 到 Cache-Control 的这几行都是头部信息:

-
Content-Length: 22 :长度字段.告诉浏览器:接下来的正文只有 22 个字节
-
Content-Type: text/plain :媒体类型声明。告诉浏览器:这是纯文本,直接显示就行,不需要渲染成网页。
-
Date : 服务器发送响应的时间。不仅是展示,也用于客户端判断缓存是否过期。
-
Connection: close : 连接管理。告诉客户端:这个请求发完我就断开 TCP 连接了,别等了(非持久连接)。
-
Cache-Control :缓存策略。允许客户端把这个测试结果存 30 秒,在这期间不需要重新向服务器发请求。
3. 空行 (Empty Line)
图中那一行孤零零的 \r\n:
-
这就是理论中提到的第三部分。它在响应头部(Headers)和响应正文(Body)之间划清了界限。
-
在底层传输中,它是两个连续的换行符。没有它,客户端就不知道头部在哪里结束,正文从哪里开始。
4. 响应正文 (Response Body / Entity Body)

对应图中最后两行展开的内容:
-
File Data: 22 bytes:Wireshark 提示这里有 22 字节的数据。
-
Line-based text data : 具体的内容是
Microsoft Connect Test。
不过要注意到抓包数据中有显示的使用[ ]包裹的数据,要注意这并不是响应数据包内包含的数据,而是工具的辅助分析的数据,我们在点击对应的行时,不会在右边的字节视图中显示对应的字节序列
http数据包中的数据都是明文传输的,这样也就会带来数据泄露的风险,会被他人窃取.https协议就由此而生.
(三)总结与对比
下面是一个HTTP协议的请求包和响应包的总结与对比:
| 特性 | 请求包 (Request) | 响应包 (Response) |
|---|---|---|
| 发送方 | 客户端 (如浏览器、手机 App) | 服务器 (如 Web Server) |
| 接收方 | 服务器 | 客户端 |
| 第一行 (起始行) | 请求行 (Request Line) 示例: GET /index.html HTTP/1.1 |
状态行 (Status Line) 示例: HTTP/1.1 200 OK |
| 核心组成部分 | 方法 (Method)、路径 (URI)、版本号 | 版本号、状态码 (Status Code)、状态描述 |
| 常见关键头部 | Host, User-Agent, Accept, Cookie |
Server, Content-Type, Set-Cookie |
| 正文内容 (Body) | 通常出现在 POST/PUT 中,包含提交的表单数据或上传的文件 | 包含服务器返回的数据,如 HTML 源码、JSON 数据、图片等 |
| 成功标志 | 使用正确的 Method (如 GET) 访问有效资源 | 状态码为 2xx (如 200 OK) |
| 失败标志 | 4xx (请求错误,如 404) | 5xx (服务器错误,如 500) |
有关HTTP协议的相关介绍就到这里了,如有纰漏还请指出