
- 🏠 博客主页:小谢同学的小破站
- ✍️ 本文由 小谢同学的小破站 原创,首发于 CSDN💻
- ☕ Java学习专栏:java
- 📗 MySQL专栏:MySQL
- 🧩 数据结构与算法:Java 数据结构与算法
- 🌐C语言专栏: C语言
- 👍 欢迎点赞👍 收藏⭐ 留言📝,发现错误欢迎指正!
- ✨ 脚踏实地,持续深耕,奔赴自己的目标✨
-- -- -- -- -- 💫分割线💫----------
Fiddler与HTTP 协议报文格式
- [1. 抓包工具](#1. 抓包工具)
- [1.1 下载Fiddler 抓包工具](#1.1 下载Fiddler 抓包工具)
- [1.2 Fiddler 基础实操步骤](#1.2 Fiddler 基础实操步骤)
- [1.3 抓取:HTTP 协议](#1.3 抓取:HTTP 协议)
- [2. HTTP协议](#2. HTTP协议)
- [2.1 HTTP 请求报文基本格式](#2.1 HTTP 请求报文基本格式)
- [2.2 HTTP 响应报文基本格式](#2.2 HTTP 响应报文基本格式)
- [2.2.1 HTTP 常见的键值对](#2.2.1 HTTP 常见的键值对)
- [2.3 网络中关于HTTP中不太准确的说法](#2.3 网络中关于HTTP中不太准确的说法)
前言:
这里是小谢同学有关于Fiddler和HTTP协议的一些相关见解,整理了有关于工具的使用与HTTP协议笔记。笔记用于自我复盘巩固,有错误欢迎大家指出,专栏还有 Java、网络、C 语言系列笔记欢迎翻阅.
1. 抓包工具
抓包工具介绍:
- Fiddler 是运行在 Windows 上、免费开源的 HTTP/HTTPS 代理抓包工具。
- 它的核心原理:启动 Fiddler 之后,会自动将自己设置为电脑的系统代理。浏览器所有向外 发送的网络请求 ,都必须先经过 Fiddler ,再转发给服务器 。这样 Fiddler 就能够完整捕获客户端和服务器之间一来回所有的请求报文、响应报文。
1.1 下载Fiddler 抓包工具
Fiddler 是一款免费工具,优先从官方网站下载 ,避免第三方捆绑安装包 => Fiddler官方下载地址
完善个人信息之后,就可以点击下载~
注意: 如果点击没有任何反应,可以使用当前连接下载=> FiddlerSetup.exe安装流程:
- 双击下载好的
FiddlerSetup.exe- 点击
I Agree同意许可协议- 选择安装路径(默认 C 盘,可以按照自己的喜好安装到对应的盘)
- 点击
Install等待安装完成,最后点击Close结束安装
刚装好的Fiddler是大概率是不会抓到HTTP数据包的,此时我们需要手动配置证书
配置过程:
- 打开 Fiddler,顶部菜单栏选择
Tools→Options
- 切换到
HTTPS标签页勾选以下几个选项
- 在弹出的证书安装窗口,点击「是」,信任 Fiddler 根证书
全部完成之后,就可以去尝试抓包:
Fiddler 查看报文的常用面板
- Raw :展示完整、未经加工的 HTTP 原始报文。
- Headers:展示请求头 / 响应头的键值对,方便快速浏览头字段。
- TextView:纯文本形式展示报文正文。
- SyntaxView:带语法高亮展示正文代码,可读性更高。
- 其余面板(WebForms、Cookies、JSON 等)为专项视图,后续学到对应知识点再使用
1.2 Fiddler 基础实操步骤
打开软件,左下角
Capturing文字亮起,就代表已经开启抓包;点击一下文字就关闭抓包。
查看原始报文:双击其中一条抓到的包就进入了
Inspectors(选项卡)位置:
- 上半区域:Request(客户端发给服务器的
请求),选择Raw标签查看未经格式化的原始报文- 下半区域:Response(服务器返回给客户端的
响应),同样选择Raw查看完整响应报文
最常用: 按域名过滤:
打开
Filters标签页,勾选Use Filters,可以根据域名过滤,只抓取目标网站请求,可以避免大量无关数据包干扰;点击
Filters打开后找到板块:
Hosts下拉说明:
-No Host Filter‑:不过滤域名,显示全部流量Show only traffic to Hosts:仅显示列表中的域名Hide traffic to Hosts:隐藏列表中的域名
按 URL 网址关键字过滤(Request Headers 板块)
如果只想抓取网址中包含某个文字的请求才会使用URL关键字过滤;
找到板块:
Request Headers勾选:
Show only if URL contains在右侧输入框填写关键词,例如:
baidu
Hide if URL contains:填入关键词,隐藏 包含该文字的请求效果:只要请求 URL 里面包含
baidu文字就会被展示出来。
按响应状态码过滤(Response Status‑Code 板块)
用来筛选 / 隐藏成功、重定向、报错请求
Hide success(2xx):隐藏 200 成功的请求Hide redirects(300,301...):隐藏重定向请求Hide non‑2xx:隐藏所有非 200 的请求
过滤文件类型(Response Type and Size 板块)
Block image files:会拦截图片资源的请求
Block CSS files:会拦截 css 样式的文件
返回目录
1.3 抓取:HTTP 协议
例如:我们想要抓CSDN的包:
填写好我们想要的参数之后,我们就可以在软件左侧看见有关于CSDN的HTTP协议相关的包;
双击点开其中一个HTTP包,再次点击
Raw,此时我们就能看见当前HTTP报文的格式;
2. HTTP协议
HTTP 全称超文本传输协议 ,是互联网应用最广泛的应用层协议 ,底层基于 TCP 协议传输,是一种: 一问一答的客户端‑服务器模式。
- 客户端(浏览器)发出:HTTP 请求报文
- 服务器返回:HTTP 响应报文
正如我们输入一个网址(URL)的时候:我们客户端给服务器发送请求,服务器返回一个页面给我们客户端
2.1 HTTP 请求报文基本格式
一条完整的 HTTP 请求报文由四部分组成:请求行、请求报头、空行、请求正文
请求行 :
请求方法 + URL + HTTP版本
方法:
| 方法 | 说明 | 支持的HTTP协议版本 |
|---|---|---|
GET |
获取资源 | 1.0、1.1 |
POST |
传输实体主体 | 1.0、1.1 |
PUT |
传输文件 | 1.0、1.1 |
| HEAD | 获得报文首部 | 1.0、1.1 |
DELETE |
删除文件 | 1.0、1.1 |
| OPTIONS | 询问支持的方法 | 1.1 |
| TRACE | 追踪路径 | 1.1 |
| CONNECT | 要求用隧道协议连接代理 | 1.1 |
| LINK | 建立和资源之间的联系 | 1.0 |
| UNLINE | 断开连接关系 | 1.0 |
红色部分为日常开发中见到的最多(GET 与 POST 就相当于曹植 ,就像谢灵运所说:
天下之才共八斗,曹植独占七斗,我谢灵运得一斗。)绝大多数业务都是由get与post包揽
| 对比项 | POST | PUT |
|---|---|---|
| 主要作用 | 创建、新增资源 | 更新、替换已有资源 |
| 幂等性 | 非幂等,发两次就创建两条数据,每次结果都不同 | 幂等,发多少次结果都一样 |
| URL设计 | 访问集合地址 /user |
访问具体资源 /user/1001(带上id) |
| 例子 | 注册账号、发一条新朋友圈 | 修改id=1001用户的昵称 |
| 浏览器普通网页 | 表单非常常见 | 普通网页几乎见不到,多用于后端接口 |
- HTTP开发者的建议是让程序员遵从这种开发准则,但是没有对其做出限制,就导致了现在获取/上传/删除等等业务都能使用get来实现
从而引出了一个面试中常见的问题 :
get与post有什么区别?日常使用中本质上没有"本质区别",能用
get的地方,post也能用,能用post的地方,get也能使用;但是在使用习惯上还有一定的区别:
get通常用来表示"获取数据",而`post``通常用来"提交数据"get通常把给服务器的数据放到query string中,而post则通常放到body中;
URL

解释:
协议⽅案名(Scheme): 常见的有
http和https登陆信息(Userinfo): 现在的网站身份验证一般不用URL来进行身份验证了,一般都会省略(明文形式极度不安全)
服务器地址(Host): 一般填写的是域名,类似于
www.baidu.com这样的形式(可以写域名也可以写IP地址)服务器端口号(Port): 表示当前程序在哪一个端口上运行,当端口号背隐藏的时候,浏览器会根据协议类型来确定使用哪一个端口,
http为80,https为443带层次的文件路径(Path): 服务器上文件/接口的位置路径(一个服务器可能有很多种资源,用来区分不同资源,例如:图片,视频等)
查询字符串(Query): 给服务器传递的参数,
?后面,键值对形式,会发给服务器片段标识符(Fragment): 页面内跳转标记,#后面的内容不会发送到服务器,仅浏览器本地生效(类似于目录)
引出了新的问题:如果发送给的query string中,服务器在进行解码的时候,不小心解码成特殊符号了怎么办?此时就需要在发送的时候进行encode转码=>(把要转义的内容,每个字节拿出来,使用十六进制表示,每个字节前面加上%)
类似于此处就使用了转码:

- 在 解析的时候服务器就知道了此处需要用同样的方式进行解码
空行 :用来标记头部字段结束、正文(实体主体)开始。
请求正文: 客户端发给服务器,位于 HTTP 头部空行之后的数据内容。
返回目录
2.2 HTTP 响应报文基本格式
响应报文同样分为 4 个部分:状态行、响应头、空行、响应体
解释:
- 版本号: 解释了当前响应是HTTP报文的哪一个版本
- 服务器返回的附加信息,包含返回数据类型、长度等
- 状态行 :
HTTP版本 + 状态码 + 状态描述
2xx 成功,3xx 重定向,4xx 客户端错误,5xx 服务器错误比较重要的:
404:访问的资源服务器上不存在,
403:表示你没有权限访问当前网站,
405:服务器不支持这个方法,
500:表示服务器挂了,
505:服务器繁忙,
301:永久重定向,
302:临时重定向重定向概念:重定向就是服务器告诉浏览器:你要访问的资源搬家了,请你重新去访问另一个新的 URL 地址。
它属于服务器的指令 ,服务器返回一个特殊的状态码 +
Location响应头,浏览器收到之后,会自动发起第二次全新的 HTTP 请求,跳转到新地址
- 空行:表示响应头结束
- 响应体:服务器返回的真实资源内容(网页、JSON、图片等)
返回目录
2.2.1 HTTP 常见的键值对
常见的键值对有:
Host:指定请求访问的服务器域名+端口User‑Agent(UA):告诉服务器客户端是什么浏览器、操作系统
- 我们可以认识一个大概: Chrome、Safari、Mozilla、AppleWebKit 这些历史遗留的字符串,属于 UA 的老传统 ,然后我们能看见
Windows版本,以及chrome浏览器也就是现在的(Edge)
Referer:当前页面是从哪个网址跳转过来的
- 此处的
refere就是当前这个页面是从这个网站跳转过来的(也可以用于广告的统计,每当有一个人点击了这个连接,服务器上就会记录一条refere数据);
拓展:在早年全网以 HTTP 明文 访问网站的时代(2012‑2015 年,高峰约 2014 年),宽带运营商处在 >>TCP 链路的中间节点。
HTTP 报文没有任何加密,运营商网关可以看见、并且随意篡改请求头里的 Referer 字段。
- 修改 Referer 来源地址,伪装流量来自推广页面
- 骗取平台广告分成佣金
- 导致网站防盗链校验失效
这就导致打广告的人和发布广告的数据对不上,造成损失(
后续为了避免这种情况就出现了HTTPS)
Accept:客户端能接收服务器返回哪些类型的数据Accept‑Encoding:客户端支持哪种压缩格式(gzip),服务器可压缩响应体Accept‑Language:客户端偏好的语言Content‑Type:请求正文的数据格式常见的格式有:
text/html:html格式text/css:css格式application/javascript:javascript格式application/json:json格式网页前端开发:html 网页结构(骨),css网页样式(皮),javascript 网页行为(魂)->服务器保存了这些代码文件浏览器通过http请求,获取到这些代码文件下载到浏览器上,最终由浏览器负责执行
image/jpg:jpg格式image/png:png格式
Content‑Length:请求正文的字节长度(可以理解为发送/接收的数据是多少字节)Cookie:浏览器本地存储的数据,自动携带发给服务器,维持会话(存储在浏览器本地的一小段键‑值数据 ,用来维持客户端与服务器之间的会话状态 。)
例如:
此时,我们下次进行访问网站的时候就不需要我们重新进行登录~
此处能看见当前网站的一个cookie;
返回目录
2.3 网络中关于HTTP中不太准确的说法
1.GET请求一般是实现成"幂等",POST请求没有"幂等"的要求
这是一种错误的一种说法,HTTP的创造者只是在语法形式上
建议get方法实现成幂等,而不是只能实现幂等,当然,post在代码层面上也可以实现成幂等
2.GET请求不安全,POST请求更安全
安全是相对的,不管是使用get实现用户登录,还是用post实现登录
都不安全,get实现的登录户名密码一般放在query string中,post实现的登录,户名密码一般放在body,在这种明文传输的情况之下,黑客也能进行抓包获取到对应的账户密码~>都不安全
3.GET请求单次传输的数据量比较小,POST请求单次传输的数据量更大**(GET数据在 URL中,URL的长度有上限(1KB,2KB,10KB,1024KB...)**
在这个时代看来,这个说法也是错误,这个
GETURL长度的上限只针对于上古时期IE浏览器对URL的长度有限制,但是在这个时代,GET的一个URL可以有很长
4.针对GET请求只能传输文本数据,POST可以传输文本和二进制数据
二进制数据,可以通过urlencode/base64转化为文本,通过GET的URL来进行传输,但是如果严格意义上GET请求的确不能传输二进制数据
返回目录





















