Fiddler抓包VSCode和探索
前言: 最近在使用 VSCode 调试 web 程序时,遇到一些问题,当时不知道如何是好。所以决定抓看来看一看,然后一顿操作猛如虎,成功安装了抓包软件 – Fiddler Classic。我并没有使用 Postman 这种重量级的 HTTP 测试软件,而是直接使用了 VSCode 的插件 – REST Client。然后,我发现在 Fiddler 里面居然无论如何都是看不见这个插件发出来的数据包,或者更直接一点,看不到 VSCode 的包。经过一番在互联网上的搜索,最后发现了需要在 VSCode 中配置代理才行。不过,正是这番折腾也让我重新思考起了以前一个困惑我的问题,抓包软件的工作原理是什么?我曾经对这个很好奇,知道了它是通过代理来实现的,但是这种浅显的理解,遇到问题时还是会显得束手无策。下面就让我们再去探索一番,如果每一次探索都能获取到更深一层的理解,那便是最好不过的事情了。所以学习更像是一种螺旋上升的过程,不是一蹴而就,当然了如果不持续努力就会一直原地踏步,甚至缓慢下降。
VSCode 抓包配置
先看看一下这个问题的解决方案吧!这里先来一个示例,查看指定QQ号的头像,这是一个在网上公开可查询的 API,我相信大家的为人,所以这里我没有使用自己的 QQ 号。
浏览器抓包测试
然后在 Fiddler 中可以查看该请求,注意我在上面禁用了缓存,防止因为缓存导致看不到图片了。这里可能数据包太多了,导致看不过来,可以在抓到数据包后暂停抓包或者在上面的列中进行搜索或者过滤。现在是浏览器的包,这是一切正常的,下面我们来使用 VSCode 的 REST Client 插件来请求这个接口试试。
VSCode 抓包测试
首先在 VSCode 中访问,这是没有问题的,可以正常请求到数据,而且它还很贴心的直接渲染成图片了。
这里我设置只抓取非浏览器的数据包,不然数据包太多了,看起来很麻烦。
然后你猜怎么着?我本来是想演示,VSCode 不配置是抓不到包的,结果今天在我自己的电脑上,它就正常了。因为我之前是在其它电脑上操作的,换了一个环境,结果它就正常了。不过现在我想要的是不正常的结果。不过,我现在对这一块也有了解,不至于像上次一样手足无措了。既然,正常了,那就直接去看下一部分,待会再聊这个话题。
注意:因为我使用的 VSCode 版本较新,可能是新版的配置变更了。所以我贴出来我的版本,如果你的表现或者配置与我不一致,可以考虑更新到同一版本或者更高的版本。
注意:经过我的又一次分析,我发现 VSCode 的包 Fiddler 抓不到是因为它们两个之间启动顺序的关系。VSCode 是基于开源的 Chromium 内核的,就是浏览器内核,所以按理说它是可以自动识别代理的。所以,其实问题就是因为我是先开的 VSCode,然后启动的 Fiddler,但是 VSCode 不会自动识别代理的开启和关闭,必须重启 VSCode 才行,这确实是一个未曾想到的坑。
Fiddler 抓包的原理
当我们正常的访问网络服务时,忽略其它的因素的存在(专业一点应该叫透明),我们是直接访问远程服务的。然后开启代理之后,我们是通过代理来访问远程服务的,即我们先把请求发给代理,代理再去请求远程,然后把响应信息返回给应用程序。我这里使用单箭头,因为我只是画了请求的过程,哈哈,似有不妥,但是你理解就好了。
注意:在 Fiddler 中讨论的是 HTTP 代理,它应该是使用最广泛的了,不过代理不止只有 HTTP 代理。
所以,现在我们去看看 Fiddler,启动它之后,它会开启一个代理服务器,并监听 8888 端口。我们打开菜单,查看 connections 栏,可以看见下面这个弹窗。
Fiddler Classic can debug traffic from any application that accepts a HTTP Proxy. All WinINET trafic is trouted through Fiddler Classis when “File > Capture Traffic” is checked.
这里最重要的就是这个第一句了:Fiddler Classic 可以调试接受 HTTP 代理的任何应用的流量。这里的关键字是接受,所以那就有人可以 reject ,拒绝 喽!其它的信息,这里忽略不去理会,因为并不属于这里的重点。
注:有些软件因为一些原因,不会走代理,例如有道词典,我就没有抓到它的包(我上次见的说法是它不使用 HTTP 协议,也有可能是它不走代理,不过具体不了解,表现就是代理看不到它的请求信息)。
也就是说,Fiddler 开了一个代理服务器,所有的应用程序(接受 HTTP 代理)都会它发送请求,然后由它进行中转发送,并接受响应数据,然后再转给发送者。那你有没有想过,其它程序为什么会知道 Fiddler 的代理呢?或者它们为什么会相信一个未知的软件呢?这其实是一个很有趣的问题。因为它们并不知道 Fiddler,也不会去关心它的存在(当然了,得排除哪些不想让你调试它们的软件)。
答案其实很简单,系统代理,操作系统都是会支持网络代理功能的。但是它并不是真正工作的代理软件,只是告诉其它软件,这里启用了系统代理,因为是操作系统,所以应用软件都能知道系统启用了代理功能。
而 Fiddler 就是真正工作的 代理软件,如下图的 Gateway(网关)这里的截图。
然后去 Windows 中查看系统代理,不同版本的系统截图可能不一致,不过大体上也不会相差太大的。我现在使用的是 Window11,下面是我的系统的截图。不过这里居然没有设置端口而是直接在URL中指定了,可能这样也是可以正常工作的吧。所以,你现在应该大致上明白了吧。因为操作系统是支持代理这个功能的,而且这也是必须由操作系统支持的,因为通过代理上网是非常必要的功能。既然系统支持了,那么软件就不可能不支持了,否则用户启用了代理,而软件不走代理,那么就会导致软件的行为和用户的预期不一致了,这是 BUG呀!有些工作是必须通过代理上网的,代理的运用是很广泛的,例如企业内部的 VPN 服务。
现在的浏览器都践行这种 KISS 原则,它会自动检测到代理开启,所以不需要用户去手动配置了。不过,对于我们这些非普通的用户,还是有必要了解代理的工作原理的。不然,如果出现问题了,你就会变成真正的傻瓜了。
注:KISS(Keep It Simple and Stupid)傻瓜原则
所以,我们可以看清 Fiddler 的本质其实是一个 HTTP 代理软件,兼具抓包功能(这个功能比较强大,反而让人忽视了它的本质)。因为代理本质上就是数据的中转站,那它自然就可以选择查看或者不查看用户的请求了。如果它不看,那它就是纯粹的代理软件 如果它看了那它是抓包软件了。
VSCode 的代理配置
打开下面这个界面,然后搜索 http: proxy
,可以看见下面这些配置。最上面的这个是代理配置,如果没有设置的话,它会继承 http_proxy
和 https_proxy
这两个环境变量,不过我也没有设置它们,并且查看了确实没有。然后是下面的这个配置 Http: Proxy Support
,它下面写着它的作用:Use the proxy support for extensions
. (对插件使用代理支持),因为我这里没有在 VSCode 中开启代理,看起来是这个配置的作用。
注意:这里可以看到我改了 Http: Proxy Authorization
,这个是代理认证相关的属性,我只是点击进去,它给配置了默认的 null 值,然后我就退出来了。不过,这里我也没有使用需要认证的代理,所以也没关系的。
下面我把这个配置给关掉再试一试!这个默认的配置项 override
的作用就是,对插件启用代理支持,覆盖默认的请求选项。现在改成 off
,禁用插件的代理支持。然后多次请求那个查看 QQ 头像的接口,可以发现已经无法再看到相应的请求了。这里现在设置了只查看 VSCode 的请求数据。这个 code 进程就是 VSCode。所以,以后如果遇到 VSCode 无法抓包的问题就开启下面这个选项就行了(注意VSCode的版本)。下面使用 GIF 来演示关闭代理支持之后的抓包情况。
注意:因为我的 VSCode 版本较新,如果是使用的老的版本,可能需要手动配置上面的 Http: proxy
,不过要小心,如果你之后关闭了代理软件,你的 VSCode 就无法联网了!!!
代理软件最常见的问题
下面举一个例子,这应该是代理软件最常出现的问题,大部分人应该都遇到过的 – 代理软件的非正常关闭。让我们先把 Fiddler 关闭,然后查看系统代理,正常情况下它是关闭的,现在让我们手动打开它,配置和之前一样。然后,接下来会发生什么呢?
服务中断,你的浏览器就无法访问任何网页了,就像下面这样。 不过某些软件,例如 QQ 之类的会继续正常工作,因为它不走代理(它用的不是 HTTP 协议,不过这种软件都是很复杂的了,只是说通讯的部分不使用)。这个很好解释,就像上面那那个图一样,软件把请求发给系统代理,就是 Fiddler 启动的代理服务器,然后这个服务器早就关闭了,所以所有的请求都根本没有人接收,自然就会报错了。解决办法那自然就有两个了,关闭系统代理或者重新开启 Fiddler (或者任何你使用的代理软件)。只要是用过代理软件的人,应该都会踩过这个坑,哈哈。
TIM(QQ) 设置代理:
小小的扩展
你有没有想过到底代理是怎么工作的呢?带着这个疑问,让我们进行一点微不足道的探索吧!这里我来提供一个小小的示例程序,跟着我一起去看看吧,不要弄那么复杂了,这个代码就是随便写的,展示一下简单的原理。
package mainimport ("log""net"
)const RSP = "HTTP/1.1 200 OK\r\n" +"content-type: application/json; charset=utf-8\r\n" +"content-length: 39\r\n" +"server: CrazyDragon\r\n" +"\r\n" +"{\"rsp\": \"Hello, I am CrazyDragonProxy\"}\r\n"func main() {// 监听本地的 9999 端口server, err := net.Listen("tcp", "localhost:9999")if err != nil {log.Fatal(err)}// 读取数据的切片data := make([]byte, 1024)for {if conn, err := server.Accept(); err == nil {if n, err := conn.Read(data); err == nil {log.Printf("%s", string(data[:n])) // 打印接受到的数据conn.Write([]byte(RSP)) // fake response! 随便弄一个假的响应糊弄了事conn.Close()} else {log.Fatal(err)}} else {log.Fatal(err)}}
}
先开启代理设置,配置如下:
然后就按照这个 GIF 中做的即可,注意我虽然开了代理,但是代理后面并没有软件,所以此时 VSCode 的插件是无法正常联网的,因为代理软件没开!!!然后我启动了代理软件(我自己写的垃圾,不过它已经可以符合一个正常的代理了),然后这个插件就可以正常工作了。
注意: 有时候开启了代理,但是 VSCode 还是不走代理,并且配置也是正常的。可以考虑重启或者 Reload Window
刷新一下,因为配置可能没更新,VSCode 没有更新系统代理的变更。
在 VSCode 中演示:
在浏览器中演示:
注:这里有一个小问题,似乎第一次请求会卡住,不知道为什么?所以我强制刷新一下。
下面这个是打印输出的部分信息,中间的方框内是接收到的访问 QQ 头像的请求,这里出现了很多 CONNECT 请求,它也是 HTTP 方法的一种,不过它不会用在 WEB 请求中。而是专门用来给 HTTPS 进行代理的,HTTPS 代理曾经也是一个难题(TLS),这就是解决方案,不过我也就了解这么多。我这里只是一个简单的 HTTP 代理,它尝试来建立连接,当然是不会成功了,哈哈。
所以如果访问 https 网址,效果就是这样的,这里肯定是 CONNECT 建立失败了,就是有关于 TLS 这方面的东西。所以我测试使用的是 http 的网址。
什么决定了使用代理
为什么有的可以选择走代理,有的可以选择不走代理呢?这是由什么决定的呢?如果你有过网络爬虫的经验,应该就能明白了。编程语言的 HTTP 客户端都是可以配置使用代理的,就以为 Go 为例:
因为代理是很重要的功能,所以它是一个 HTTP 客户端必不可少的功能。不过,上面也说了可以选择 no_proxy
(禁用代理),所以有些软件即使使用 HTTP 协议,你也是抓不到的,因为它根本就不使用代理。风过留声,雁过留痕。既然不从代理走,代理也就根本无法感知到它们的存在了。
总结
有趣的探索结束了,我确实感觉自己收获了不少,也把以前的一些知识串联起来了。希望各位读者也能从中有所收获。
参考链接
If I have been able to see further, it was only because I stood on the shoulders of giants. 如果说我看得比别人更远些,那是因为我站在巨人的肩膀上。
HTTP 代理原理及实现
技术分享| HTTP 代理
部分APP无法代理抓包的原因及解决方法
大厂app抓不到包怎么办?这篇文章告诉你答案!
相关文章:

Fiddler抓包VSCode和探索
前言: 最近在使用 VSCode 调试 web 程序时,遇到一些问题,当时不知道如何是好。所以决定抓看来看一看,然后一顿操作猛如虎,成功安装了抓包软件 – Fiddler Classic。我并没有使用 Postman 这种重量级的 HTTP 测试软件&a…...

Pytorch指定数据加载器使用子进程
torch.utils.data.DataLoader(train_dataset, batch_sizebatch_size, shuffleTrue,num_workers4, pin_memoryTrue) num_workers 参数是 DataLoader 类的一个参数,它指定了数据加载器使用的子进程数量。通过增加 num_workers 的数量,可以并行地读取和预处…...

【科普】干货!带你从0了解移动机器人(六) (底盘结构类型)
牵引式移动机器人(AGV/AMR),通常由一个牵引车和一个或多个被牵引的车辆组成。牵引车是机器人的核心部分,它具有自主导航和定位功能,可以根据预先设定的路径或地标进行导航,并通过传感器和视觉系统感知周围环…...

爆肝整理,Pytest+Allure+Jenkins自动化测试集成实战(图文详细步骤)
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、简介 pytesta…...

微信批量添加好友,让你的人脉迅速增长
在这个数字化时代,微信作为中国最流行的社交平台之一,已经成为了人们生活中不可或缺的一部分。它的广泛使用为我们提供了无限的社交可能性。你是否曾为了扩大人脉圈子而犯愁?今天,我将向你揭示一个高效添加微信好友的秘密武器&…...

3D模型怎么贴法线贴图?
1、法线贴图的原理? 法线贴图(normal mapping)是一种计算机图形技术,用于在低多边形模型上模拟高多边形模型的细节效果。它通过在纹理坐标上存储和应用法线向量的信息来实现。 法线贴图的原理基于光照模型。在渲染过程中&#x…...

QT中文乱码解决方案与乱码的原因
相信大家应该都遇到过中文乱码的问题,有时候改一改中文就不乱码了,但是有时候用同样的方式还是乱码,那么这个乱码到底是什么原因,又该如何彻底解决呢? 总结 先总结一下: Qt5中,将QString()的构…...

sam9x60 boot
...

3D模型格式转换工具HOOPS Exchange:支持国际标准STEP格式!
HOOPS Exchange SDK是一组C软件库,使开发团队能够快速将可靠的2D和3D CAD导入和导出添加到其应用程序中,访问广泛的数据,包括边界表示 (B-REP)、产品制造信息 (PMI)、模型树、视图、持久 ID、样式、构造几何、可视化等,无需依赖任…...

java--死循环与循环嵌套
1.死循环 可以一直执行下去的一种循环,如果没有干预不会停下来的 2.死循环的写法 3.循环嵌套 循环中又包含循环 4.循环嵌套的特点 外部循环每循环一次,内部循环会全部执行完一轮...

基于机器视觉的图像拼接算法 计算机竞赛
前言 图像拼接在实际的应用场景很广,比如无人机航拍,遥感图像等等,图像拼接是进一步做图像理解基础步骤,拼接效果的好坏直接影响接下来的工作,所以一个好的图像拼接算法非常重要。 再举一个身边的例子吧,…...

基于arduino uno + L298 的直流电机驱动proteus仿真设计
一、L298简介: L298是一个集成的单片电路,采用15个导线多瓦和PowerSO20封装。它是一个高电压、高电流双全桥驱动器,旨在接受标准TTL逻辑电平和驱动感应负载,如继电器、螺线管、直流和加速电机。提供两个使输入来使独立于输入信号的…...

cola架构:有限状态机(FSM)源码分析
目录 0. cola状态机简述 1.cola状态机使用实例 2.cola状态机源码解析 2.1 语义模型源码 2.1.1 Condition和Action接口 2.1.2 State 2.1.3 Transition接口 2.1.4 StateMachine接口 2.2 Builder模式 2.2.1 StateMachine Builder模式 2.2.2 ExternalTransitionBuilder-…...

通信仿真软件SystemView安装教程(超详细)
介绍 system view是一种电子仿真工具。它是一个信号级的系统仿真软件,主要用于电路与通信系统的设计和仿真,是一个强有力的动态系统分析工具,能满足从数字信号处理,滤波器设计,直到复杂的通信系统等不同层次的设计&am…...

Go学习第八章——面向“对象”编程(入门——结构体与方法)
Go面向“对象”编程(入门——结构体与方法) 1 结构体1.1 快速入门1.2 内存解析1.3 创建结构体四种方法1.4 注意事项和使用细节 2 方法2.1 方法的声明和调用2.2 快速入门案例2.3 调用机制和传参原理2.4 注意事项和细节2.5 方法和函数区别 3 工厂模式 Gola…...

「滚雪球学Java」:方法函数(章节汇总)
🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!…...

数据分析必备原理思路(二)
文章目录 三、主流的数据分析方法与框架使用1. 五个数据分析领域关键的理论基础(1)大数定律(2)罗卡定律(3)幸存者偏差(4)辛普森悖论(5)帕累托最优(…...

分布式ID系统设计(1)
分布式ID系统设计(1) 在分布式服务中,需要对data和message进行唯一标识。 比如订单、支付等。然后在数据库分库分表之后也需要一个唯一id来表示。 基于DB的自增就肯定不能满足了。这个时候能够生成一个Global的唯一ID的服务就很有必要我们姑且把它叫做id-server 。…...

机器学习(python)笔记整理
目录 一、数据预处理: 1. 缺失值处理: 2. 重复值处理: 3. 数据类型: 二、特征工程: 1. 规范化: 2. 归一化: 3. 标准化(方差): 三、训练模型: 如何计算精确度,召…...

微客云霸王餐系统 1.0 : 全面孵化+高额返佣
1、业务简介。业务模式是消费者以5-10元吃到原价15-25元的外卖,底层逻辑是帮外卖商家做推广,解决新店基础销量、老店增加单量、品牌打万单店的需求。 因为外卖店的平均生命周期只有6个月,不断有新店愿意送霸王餐。部分老店也愿意做活动&…...

极智开发 | Hello world for Manim
欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文分享一下 Hello world for Manim。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码和资源下载,链接:https://t.zsxq.com/0aiNxERDq Manim 是什么呢?Manim 是一个用于创…...

【云上探索实验室-码上学堂】免费学习领好礼!
走过路过,不要错过!上云AI三步走,学着课程奖品有! 亚马逊云科技又放福利了,为了让同学们更快入手Amazon CodeWhisperer,官方推出《云上探索实验室-码上学堂》活动,作为一名Amazon CodeWhisperer…...

Flutter最全面试题大全
在理解这些问题之前,建议看一下Flutter架构原理,如下链接: https://blog.csdn.net/wang_yong_hui_1234/article/details/130427887?spm1001.2014.3001.5501 目录 一. 有个Text节点,由于文字内容过多,发生了溢出错误&…...

Linux---(四)权限
文章目录 一、shell命令及运行原理1.什么是操作系统?2.外壳程序3.用户为什么不直接访问操作系统内核?4.操作系统内核为什么不直接把结果显示出来?非要加外壳程序?5.shell理解重点总结(1)shell是什么?&…...

财务RPA机器人真的能提高效率吗?
财务部门作为一个公司的管理职能部门承担着一个公司在商业活动中各个方面的重要职责。理论上来说,一个公司的财务部门的实际工作包含但不限于对企业的盈亏情况进行评估、对风险进行预测、通过数据分析把握好公司的财务状况、税务管理等。 然而,实际上在…...

国产信号发生器 1442/1442A射频信号发生器
信号发生器 1442/A射频信号发生器 1442系列射频信号发生器是一款针对通信、电子等射频应用而设计开发的产品。覆盖了所有的常用射频频段。它采用模块化结构设计,全中文界面、大屏幕菜单控制,其输出信号相位噪声极低,频率分辨率和准确度高&am…...

Kafka与Spark案例实践
1.概述 Kafka系统的灵活多变,让它拥有丰富的拓展性,可以与第三方套件很方便的对接。例如,实时计算引擎Spark。接下来通过一个完整案例,运用Kafka和Spark来合理完成。 2.内容 2.1 初始Spark 在大数据应用场景中,面对…...

山西电力市场日前价格预测【2023-10-27】
日前价格预测 预测说明: 如上图所示,预测明日(2023-10-27)山西电力市场全天平均日前电价为347.06元/MWh。其中,最高日前电价为618.09元/MWh,预计出现在18: 15。最低日前电价为163.49元/MWh,预计…...

centos7安装redis(包含各种报错)
本文主要介绍如果在Centos7下安装Redis。 1.安装依赖 redis是由C语言开发,因此安装之前必须要确保服务器已经安装了gcc,可以通过如下命令查看机器是否安装: gcc -v如果没有安装则通过以下命令安装: yum install -y gcc2.下载r…...

使用GoQuery实现头条新闻采集
概述 在本文中,我们将介绍如何使用Go语言和GoQuery库实现一个简单的爬虫程序,用于抓取头条新闻的网页内容。我们还将使用爬虫代理服务,提高爬虫程序的性能和安全性。我们将使用多线程技术,提高采集效率。最后,我们将展…...