HTTP 协议的基本格式和 fiddler 的用法

HTTP 协议基本格式与 Fiddler 抓包实战总结

HTTP(超文本传输协议)是 Web 通信的基石,理解它的报文格式是排查问题的第一步。而 Fiddler 则是观察 HTTP 通信最直观的窗口,它将抽象的协议文本变成了可以查看、甚至修改的会话。

本文先梳理 HTTP 请求与响应的标准格式,再介绍 Fiddler 的核心功能,最后将它们结合起来,看看如何在抓包工具中读懂一次真实的 HTTP 交互。


一、HTTP 报文的基本格式

HTTP 报文分为请求报文 和响应报文 ,结构上高度相似,都由三大部分组成:起始行 + 头部字段集合 + 消息正文 ,中间用一个空行将头部与正文隔开。

text 复制代码
起始行
头部字段1: 值1
头部字段2: 值2
空行
消息正文(可选)

空行不是可有可无的装饰,它是头部结束、正文开始的唯一分界标志。如果在头部中间多了一个空行,空行之后的内容会被整体视为正文。

1. 请求报文

请求报文的起始行称为请求行,格式为:

text 复制代码
请求方法  请求目标(URI)  HTTP版本

例如:

http 复制代码
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html

请求方法表达对资源的"动作意图"。常见的包括:

  • GET:获取资源,参数通常附在 URL 上。
  • POST:提交数据,参数放在请求体中。
  • PUT:修改资源。
  • DELETE:删除资源。
  • HEAD:只获取响应头,不获取正文。
  • OPTIONS:查询服务器支持的请求方法,常用于跨域预检。

GET 与 POST 的差异不仅在于参数位置。GET 是幂等的(重复执行结果一致),会被浏览器缓存;POST 默认不幂等,也不会被缓存,更适合传输敏感或会产生副作用的数据。

2. 响应报文

响应报文的起始行称为状态行,格式为:

text 复制代码
HTTP版本  状态码  原因短语

例如:

http 复制代码
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 28

{"code":0,"msg":"success"}

状态码用一个三位数字概括处理结果:

类别 含义 常见例子
1xx 信息性状态 100 Continue
2xx 成功 200 OK、201 Created
3xx 重定向 301 Moved Permanently、302 Found
4xx 客户端错误 400 Bad Request、404 Not Found
5xx 服务器错误 500 Internal Server Error

原因短语是给人看的补充说明,程序判断结果应以状态码为准。

3. 头部字段的关键规则

头部字段是 key: value 形式的键值对,规则虽然简单,但细节决定了它们能否被正确解析:

  • 字段名不区分大小写 ,但习惯上采用首字母大写的连字符形式(如 Content-Type)。
  • 字段名后必须紧跟冒号,冒号前不能有空格;冒号后的值前可以有空格。
  • 字段名中不能出现空格 ,可以使用连字符 -,但下划线 _ 可能导致部分服务器不解析。
  • 字段顺序没有语义,可以任意排列。
  • 字段一般不能重复,除非该字段本身的语义允许(如 Set-Cookie)。

常见的头部字段大致分为三类:

  • 请求字段 :只在请求中出现,如 Host(目标主机)、Referer(来源页面)。
  • 响应字段 :只在响应中出现,如 Server(服务器软件信息)、Set-Cookie。
  • 通用字段 :请求和响应都可以出现,如 Content-Type(正文类型)、Connection(连接管理)、Cache-Control(缓存策略)。

二、Fiddler 的核心用法

Fiddler 的工作原理是在本地启动一个代理服务器 (默认端口 8888),所有经过它的 HTTP/HTTPS 流量都会被截获并记录下来。它不是"被动地看",而是站在客户端和服务器之间,因此不仅能查看,还能修改、重放、伪造。

1. 必做配置:让 HTTPS 可读

Fiddler 默认无法解密 HTTPS,只能看到加密的隧道。要查看 HTTPS 的明文内容,必须完成证书信任:

  1. 打开 Tools → Options → HTTPS。
  2. 勾选 Capture HTTPS CONNECTs 和 Decrypt HTTPS traffic。
  3. 点击 Actions → Trust Root Certificate,按提示将 Fiddler 的根证书安装到系统中。
  4. 重启 Fiddler 使配置生效。

对于移动端抓包,还需要将手机 Wi-Fi 的代理指向电脑的 IP 和 8888 端口,并在手机浏览器中访问 http://<电脑IP>:8888 下载并信任证书。

2. 界面速览:会话列表与 Inspectors

Fiddler 主界面分为左右两栏。左侧是会话列表 ,每一行代表一次完整的请求-响应交互,列出状态码、协议、主机、URL 和耗时等信息。右侧是 Inspectors 面板,用于查看选中会话的详细内容。

在 Inspectors 中,上半部分是请求 ,下半部分是响应。常用子标签包括:

  • Headers:以结构化方式展示起始行和头部字段。
  • WebForms:自动解析请求体中的表单参数或查询字符串。
  • Raw :显示未经加工的原始报文文本,是对照 HTTP 格式最直接的视图。
  • JSON / TextView:格式化展示 JSON 或文本响应,便于阅读。

双击左侧任意会话,右侧 Inspectors 就会加载该次交互的完整数据。

3. 过滤:从海量请求中定位目标

浏览器一次页面加载可能产生上百个请求。在右侧 Filters 面板中勾选 Use Filters,可以按以下条件筛选:

  • Hosts :只显示特定域名,如 api.example.com。
  • Client Process:只显示某个应用程序发出的请求。
  • Status Code :只显示 200、404 或 5xx 等状态码。

条件设置后点击 Run Filterset Now 立即生效。

4. 断点调试:修改请求与响应

断点是 Fiddler 最实用的调试功能之一。通过 Rules → Automatic Breakpoints 可以设置:

  • Before Requests :请求到达服务器之前暂停,允许修改请求参数、头部甚至 URL。
  • After Responses :响应返回客户端之前暂停,允许修改服务器返回的状态码或正文。

触发断点后,会话在左侧列表中会出现红色图标。在 Inspectors 中修改内容后,点击 Run to Completion 放行。也可以使用命令 bpu <url> 只拦截特定 URL 的请求,bpafter <url> 只拦截特定响应,避免全局断点影响所有流量。

5. Composer:手动构造与重放请求

Composer 面板允许你手动编写一个 HTTP 请求并发送。你可以直接把左侧的会话拖入 Composer,它会自动填充方法、URL、头部和正文,修改后点击 Execute 即可重放。这非常适合在调试接口时快速验证不同的参数组合。

6. AutoResponder:本地 Mock 与自动替换

AutoResponder 可以拦截匹配规则的请求,并用本地文件或预设内容代替真实服务器的响应。典型用法是前端在接口尚未开发完成时,将某个 URL 映射到一个本地 JSON 文件,让页面先跑起来。勾选 Enable rules ,添加匹配规则(如 EXACT:https://api.example.com/user),指定响应文件路径即可生效。


三、在 Fiddler 中读懂一次 HTTP 交互

把 HTTP 格式和 Fiddler 结合起来,一个典型的调试流程是这样的:

  1. 在左侧会话列表中,根据状态码或 URL 找到目标请求。
  2. 选中会话,右侧切换到 Inspectors → Raw ,你会看到和本文第一部分完全一致的报文结构:
    • 上半部分的起始行是 GET /api/user HTTP/1.1 或 POST /api/login HTTP/1.1,下面是 Host、Content-Type 等头部字段,空行之后是请求体(如果有)。
    • 下半部分的起始行是 HTTP/1.1 200 OK,下面是响应头部,空行之后是返回的 JSON 或 HTML。
  3. 如果响应格式异常或字段缺失,可以在 Headers 和 JSON 视图之间对照,快速定位是头部协商问题(如 Content-Type 不匹配)还是正文数据问题。
  4. 需要复现问题时,用 Composer 重放请求,或设置 Before Requests 断点逐次修改参数,观察响应变化。

Fiddler 的价值在于它把 RFC 文档中抽象的"起始行、头部、空行、实体"变成了屏幕上可操作的文本。能准确指出一次请求的起始行、头部和正文分别在什么位置,是使用抓包工具的基本功。


四、总结

维度 核心要点
请求格式 请求行(方法 + URI + 版本)+ 头部 + 空行 + 请求体
响应格式 状态行(版本 + 状态码 + 原因)+ 头部 + 空行 + 响应体
头部规则 键值对、冒号分隔、不区分大小写、慎用下划线
Fiddler 定位 本地代理,截获、查看、修改、重放 HTTP/HTTPS 流量
必做配置 信任根证书,开启 HTTPS 解密
核心面板 会话列表 + Inspectors(查看)、Filters(筛选)、断点(修改)、Composer(重放)、AutoResponder(Mock)

HTTP 格式是"协议的规定",Fiddler 是"观察协议的眼睛"。先记住报文的三段式结构和空行的分界作用,再熟练使用 Fiddler 的 Raw 视图和断点功能,排查网络问题时就能做到有据可依、有的放矢。

相关推荐
cpolar技术支持6 小时前
网关加 gzip,同时开启 chunked,下载回来的包解不开:把两层编码的解压顺序与长度核对做成只读页
python·http·网络编程·socket·内网穿透
Tel199253080048 小时前
温度湿度信号转WiFi/MQTT/Modbus TCP采集模块 无线传输
网络·网络协议·tcp/ip·工业自动化·工控设备
lazy H10 小时前
【计算机网络】第 13 篇:NAT 和端口映射是什么?为什么本地服务外网访问不了?
java·网络·网络协议·学习·计算机网络·408
低慢小uav11 小时前
(已解决)Zynq芯片lwip协议栈,使用tcp作为服务器Service,接收大量数据时,长度接收正常,接收对数据校验,校验和异常分析
网络协议·tcp/ip·fpga开发
骑着蜗牛撵大象32713 小时前
手写一个 HTTP 服务器:从 socket 到 epoll,Linux 上到底怎么把请求变成响应
linux·服务器·网络·http·epoll·socket编程·并发模型
沫璃染墨14 小时前
从零入门计算机网络系列(十):HTTP协议进阶——从资源路径解析到状态码与请求头详解
linux·运维·服务器·网络·c++·http
|_⊙15 小时前
应用层协议HTTP与HTTPS
网络·网络协议·http
byte轻骑兵16 小时前
【PBAP】规范精讲[9]: 蓝牙PBAP的互联互通法则——GOEP互操作性要求深度解析
网络协议·人机交互·蓝牙协议·pbap
路由侠内网穿透.16 小时前
本地部署开源 WSGI HTTP 服务器 Gunicorn 并实现外部访问
运维·服务器·网络·网络协议·http·开源