计算机网络:Fiddler 抓包工具使用教程 + HTTP 协议报文格式详解

  • 🏠 博客主页:小谢同学的小破站
  • ✍️ 本文由 小谢同学的小破站 原创,首发于 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. 抓包工具

抓包工具介绍:

  1. Fiddler 是运行在 Windows 上、免费开源的 HTTP/HTTPS 代理抓包工具。
  2. 它的核心原理:启动 Fiddler 之后,会自动将自己设置为电脑的系统代理。浏览器所有向外 发送的网络请求 ,都必须先经过 Fiddler再转发给服务器 。这样 Fiddler 就能够完整捕获客户端和服务器之间一来回所有的请求报文、响应报文
1.1 下载Fiddler 抓包工具

Fiddler 是一款免费工具,优先从官方网站下载 ,避免第三方捆绑安装包 => Fiddler官方下载地址

完善个人信息之后,就可以点击下载~

注意: 如果点击没有任何反应,可以使用当前连接下载=> FiddlerSetup.exe

安装流程:

  1. 双击下载好的 FiddlerSetup.exe
  2. 点击 I Agree 同意许可协议
  3. 选择安装路径(默认 C 盘,可以按照自己的喜好安装到对应的盘)
  4. 点击 Install 等待安装完成,最后点击 Close 结束安装

 刚装好的Fiddler是大概率是不会抓到HTTP数据包的,此时我们需要手动配置证书

配置过程:

  1. 打开 Fiddler,顶部菜单栏选择 ToolsOptions
  2. 切换到 HTTPS 标签页勾选以下几个选项
  3. 在弹出的证书安装窗口,点击「是」,信任 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

解释:

  1. 协议⽅案名(Scheme): 常见的有http https

  2. 登陆信息(Userinfo): 现在的网站身份验证一般不用URL来进行身份验证了,一般都会省略(明文形式极度不安全)

  3. 服务器地址(Host): 一般填写的是域名,类似于www.baidu.com这样的形式(可以写域名也可以写IP地址)

  4. 服务器端口号(Port): 表示当前程序在哪一个端口上运行,当端口号背隐藏的时候,浏览器会根据协议类型来确定使用哪一个端口,http为80,https为443

  5. 带层次的文件路径(Path): 服务器上文件/接口的位置路径(一个服务器可能有很多种资源,用来区分不同资源,例如:图片,视频等)

  6. 查询字符串(Query): 给服务器传递的参数,?后面,键值对形式,会发给服务器

  7. 片段标识符(Fragment): 页面内跳转标记,#后面的内容不会发送到服务器,仅浏览器本地生效(类似于目录)
    引出了新的问题:如果发送给的query string中,服务器在进行解码的时候,不小心解码成特殊符号了怎么办?

  8. 此时就需要在发送的时候进行encode转码=>(把要转义的内容,每个字节拿出来,使用十六进制表示,每个字节前面加上%)

类似于此处就使用了转码:

  1. 在 解析的时候服务器就知道了此处需要用同样的方式进行解码

空行 :用来标记头部字段结束、正文(实体主体)开始

请求正文: 客户端发给服务器,位于 HTTP 头部空行之后的数据内容。
返回目录

2.2 HTTP 响应报文基本格式

响应报文同样分为 4 个部分:状态行、响应头、空行、响应体

解释:

  1. 版本号: 解释了当前响应是HTTP报文的哪一个版本
  2. 服务器返回的附加信息,包含返回数据类型、长度等
  3. 状态行HTTP版本 + 状态码 + 状态描述
  • 2xx 成功,3xx 重定向,4xx 客户端错误,5xx 服务器错误

比较重要的:

404:访问的资源服务器上不存在,

403:表示你没有权限访问当前网站,

405:服务器不支持这个方法,

500:表示服务器挂了,

505:服务器繁忙,

301:永久重定向,

302:临时重定向

重定向概念:重定向就是服务器告诉浏览器:你要访问的资源搬家了,请你重新去访问另一个新的 URL 地址。

它属于服务器的指令 ,服务器返回一个特殊的状态码 + Location 响应头,浏览器收到之后,会自动发起第二次全新的 HTTP 请求,跳转到新地址

  1. 空行:表示响应头结束
  1. 响应体:服务器返回的真实资源内容(网页、JSON、图片等)
    返回目录
2.2.1 HTTP 常见的键值对

常见的键值对有:

  1. Host: 指定请求访问的服务器域名+端口
  2. User‑Agent(UA): 告诉服务器客户端是什么浏览器、操作系统
  • 我们可以认识一个大概: Chrome、Safari、Mozilla、AppleWebKit 这些历史遗留的字符串,属于 UA 的老传统 ,然后我们能看见Windows版本,以及chrome浏览器也就是现在的(Edge)
  1. Referer: 当前页面是从哪个网址跳转过来的
  • 此处的refere就是当前这个页面是从这个网站跳转过来的(也可以用于广告的统计,每当有一个人点击了这个连接,服务器上就会记录一条refere数据);

拓展:

在早年全网以 HTTP 明文 访问网站的时代(2012‑2015 年,高峰约 2014 年),宽带运营商处在 >>TCP 链路的中间节点。

HTTP 报文没有任何加密,运营商网关可以看见、并且随意篡改请求头里的 Referer 字段

  • 修改 Referer 来源地址,伪装流量来自推广页面
  • 骗取平台广告分成佣金
  • 导致网站防盗链校验失效

这就导致打广告的人和发布广告的数据对不上,造成损失(后续为了避免这种情况就出现了HTTPS)

  1. Accept: 客户端能接收服务器返回哪些类型的数据
  2. Accept‑Encoding: 客户端支持哪种压缩格式(gzip),服务器可压缩响应体
  3. Accept‑Language: 客户端偏好的语言
  4. Content‑Type: 请求正文的数据格式

常见的格式有:

  • text/html:html格式
  • text/css:css格式
  • application/javascript:javascript格式
  • application/json:json格式

网页前端开发:html 网页结构(骨),css网页样式(皮),javascript 网页行为(魂)->服务器保存了这些代码文件浏览器通过http请求,获取到这些代码文件下载到浏览器上,最终由浏览器负责执行

  • image/jpg:jpg格式
  • image/png:png格式
  1. Content‑Length: 请求正文的字节长度(可以理解为发送/接收的数据是多少字节)
  2. 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请求的确不能传输二进制数据
返回目录


相关推荐
步行cgn44 分钟前
@Value 详解:Spring 属性注入的核心注解
java·python·spring
2401_850481171 小时前
UVA815
java
点心的游戏开发世界1 小时前
GDScript 入门笔记(二):变量与数据类型
笔记·游戏引擎·godot
霸道流氓气质1 小时前
Spring AI 多租户隔离方案
java·人工智能·spring
不会就选b1 小时前
Linux之socket编程(七)----序列化与反序列化(1)
java·linux·服务器
程序员夏洛1 小时前
HTTP 2.0 和 3.0 有什么区别?
网络·网络协议·http
秋名RG1 小时前
Java 工程师学习路线
java·学习方法
秋名RG1 小时前
Java 基础语法
java·开发语言
蒸蒸yyyyzwd1 小时前
CPP选手秋招准备学习笔记day25
笔记·学习