HTTP 协议基本格式与 Fiddler 抓包工具实战指南
HTTP 协议基本格式与 Fiddler 抓包工具实战指南
- 一、HTTP 基本介绍:什么是 HTTP?
- 什么是"应用层协议"
- 二、HTTP 工作过程
- 三、认识抓包工具Fiddler
- 下载地址:
- 抓包⼯具的原理:
- Fillder的使用过程演示:
- 四、 HTTP 协议基本格式
- HTTP请求和响应的格式(以CSDN首页为例)
- 认识URL
- 关于 URL encode
- 认识方法
- 1. GET⽅法
- 2. POST⽅法
- 3.其他方法
- 认识请求"报头"(header)
- Host
- Content-Length
- Content-Type
- User-Agent (简称UA)
- Referer
- Cookie
- 认识"状态码"(statuscode)
- HTTP 状态码分类
- 常用状态码
- 200 OK
- 404 Not Found
- 403 Forbidden
- 405 Method Not Allowedd
- 500 Internal Server Error
- 504 Gateway Timeoutw
- 302 Move Temporaily
- 认识响应"报头"(header)
- 认识响应"正⽂"(body)
- 五、总结
一、HTTP 基本介绍:什么是 HTTP?
你每天打开浏览器刷网页、用 APP 发消息、看视频时,背后都有一个 “隐形的规则” 在协调数据传输 —— 这就是 HTTP。
HTTP(HyperText Transfer Protocol,超文本传输协议) 是一种应用非常广泛的应用层协议,它规定了客户端(如浏览器、手机 APP)和服务器之间如何传递数据。简单说,它就像客户端和服务器之间的 “对话语言”:客户端按这个规则 “提问”,服务器按这个规则 “回答”,双方才能顺利交换信息(比如网页内容、图片、视频、接口数据等)。
所谓"超⽂本"的含义,就是传输的内容不仅仅是文本(比如html,css这个就是文本),还可以是⼀些其他的资源,比如图片,视频,音频等⼆进制的数据.

什么是"应用层协议"
我们已经学过TCP/IP,已经知道目前数据能从客户端进程经过路径选择跨网络传送到服务器端进程IP+Port。我们把数据从A端传送到B端,TCP/IP 解决的是顺丰的功能,⽽两端还要对数据进⾏加⼯处理或者使⽤,所以我们还需要⼀层协议,不关⼼通信细节,关⼼应⽤细节!
这层协议叫做应⽤层协议。⽽应⽤是有不同的场景的,所以应⽤层协议是有不同种类的,其中经典协议之⼀的HTTP就是其中的佼佼者.
二、HTTP 工作过程
当我们在浏览器中输⼊⼀个"⽹址",此时浏览器就会给对应的服务器发送⼀个HTTP请求 对⽅服务器收到这个请求之后,经过计算处理,就会返回⼀个HTTP响应 。
HTTP是一问一答模式的协议,客户端发一个请求,服务器就返回一个响应,请求和响应一一对应。

事实上,当我们访问⼀个⽹站的时候,可能涉及不⽌⼀次的HTTP请求/响应的交互过程.
可以通过开发者⼯具中network观察到这个详细的过程.

注意:当前百度主⻚是通过https来进⾏通信的.https是在http基础之上做了⼀个加密解密的⼯作,
三、认识抓包工具Fiddler
在正式学习HTTP协议格式前,我们需要个抓包工具Fiddler,Fiddler可以作为 “中间人”,拦截客户端和服务器之间的 HTTP 请求 / 响应,让我们能清晰地看到每一次 “对话” 的细节(比如请求的 URL、发送的数据、服务器返回的状态码等)。这对我们更好理解HTTP有很大的帮助。
抓包工具有很多比如说wireshark,可以抓很多协议的包,但是对于现在我们使用门槛较高,现阶段学习HTTP建议使用专门抓包HTTP的Fiddler功能简单也够用。
下载地址:
https://www.telerik.com/fiddler/(选择Fiddler Classic,即可免费下载使用)
抓包⼯具的原理:
简而言之就是个 “代理” ,你电脑上所有的网络通信,都会先发到这个抓包程序,抓包程序在把数据转发给服务器。
比如,你给朋友寄了一个快递:
你是 “客户端”,朋友是 “服务器”,快递小哥是 “网络”,包裹里的东西是 “数据”。
正常情况下,快递小哥直接把包裹送到朋友手里,你和朋友都不知道中间有没有人看过包裹里的东西。
但如果有个 “抓包工具”(Fiddler),就像一个 “快递中转站的扫描仪”:
快递先经过扫描仪,扫描仪会打开包裹(当然是虚拟的,不破坏包装),看看里面是衣服还是零食(查看数据内容),记录下 “寄件人、收件人、东西是什么”(类似记录请求的 URL、数据格式、内容);
看完后,扫描仪再把包裹封好,让快递小哥继续送(不影响正常传输)。
浏览器访问baidu.com时,就会把HTTP请求先发给Fiddler,Fiddler再把请求转发给baidu的服务器.当baidu服务器返回数据时,Fiddler拿到返回数据,再把数据交给浏览器.

Fillder的使用过程演示:
这边以抓包CSDN为例:

然后将CSDN网站重新刷新:

抓包结果部分展示
请求的原始数据:
GET https://www.csdn.net/ HTTP/1.1
Host: www.csdn.net
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: "Microsoft Edge";v="141", "Not?A_Brand";v="8", "Chromium";v="141"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://cn.bing.com/
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: uuid_tt_dd=10_30764759130-1761130294381-774242; fid=20_95053222550-1761130363473-996100; c_dl_prid=1761133708551_418859; c_dl_rid=1761133900953_481445; c_dl_fref=https://blog.csdn.net/2503_91826368/article/details/147528584; c_dl_fpage=/download/weixin_38640985/14878759; c_dl_um=distribute.pc_relevant.none-task-blog-2%7Edefault%7Ebaidujs_baidulandingword%7Edefault-0-146801176-blog-147528584.235%5Ev43%5Epc_blog_bottom_relevance_base8; c_ab_test=1; p_uid=U010000; tfstk=ghCsfODzicm1dr6JCIzEFltfJ-AflyPP6qTArZhZkCdOkI_Aon-w3nWBcZIJ3KQ4SEICkGsw3lTwDj_fYPvaSs6nGabc_PA4SCbMiIEz47RfSNA0WciKD1idJEQK6cKTLBUc2MIQ47PPWRLMgwEPg4RrEEYvMFpvWwUBlFOxBIIvvpLJzcdvMiUBvELSXmdvMBHplHKvMIIAJyTDvFdvMiQLREcf9DT3CH7_rmVARliNQNKIMjC_iBxSVHYH76t6C3KXAjL1OF962NCW8D0MJ65BUpu4VBQlLGLBNSGp1L6OfeQ3cbtOUavcMpNI_eXOf6pfTr2GRst6e1pIlfQB1EIvh9qSaFONdL11IrmdWg-1eCbqPl7BF99kJp3jBCWPzsvR65ikYLYfVUssfgPra3TGixgBEjTB4yaInxmcGgzPYw_q1dLH8QzQRYkDBeYB4yaInxv9-eDzRyMrn; csdn_newcert_2501_93982162=1; historyList-new=%5B%5D; __gads=ID=c24082c4974fffc8:T=1761130315:RT=1761734941:S=ALNI_Ma-k8t0NGr-VCVtejZz2I8p-Hd7CA; __gpi=UID=000011a6dc54dc44:T=1761130315:RT=1761734941:S=ALNI_MYs5yedEUINCwT9werz9Ke4ywVbbw; __eoi=ID=1ffd72b5daf004ef:T=1761130315:RT=1761734941:S=AA-AfjZiV8BsLon8V5iW8WU5jlpQ; c_adb=1; creative_btn_mp=3; loginbox_strategy=%7B%22blog-threeH-dialog-exp11tipShowTimes%22%3A1%2C%22blog-threeH-dialog-exp11%22%3A%22%22%2C%22taskId%22%3A317%2C%22abCheckTime%22%3A1761918424127%2C%22version%22%3A%22ExpA%22%2C%22nickName%22%3A%222501_93982162%22%7D; hide_login=1; UserName=2201_75758787; UserInfo=72469151886f46028087304afe2a0bc2; UserToken=72469151886f46028087304afe2a0bc2; UserNick=%E5%9C%A8%E5%9D%9A%E6%8C%81%E4%B8%80%E4%B8%8B%E6%88%91%E5%8F%AF%E6%B2%A1%E6%84%8F%E8%A7%81; AU=6FD; UN=2201_75758787; BT=1761918476648; csdn_newcert_2201_75758787=1; dc_session_id=10_1761957265614.304279; csrfToken=iKGF3Uqm2Udq3KHuruU-xrcc; c_first_ref=cn.bing.com; c_first_page=https%3A//www.csdn.net/; c_segment=2; Hm_lvt_6bcd52f51e9b3dce32bec4a3997715ac=1761833355,1761878037,1761918395,1761957267; HMACCOUNT=0AE633C9024A08FC; dc_sid=5adf287616978098c8c7d070f338fc72; _clck=1sp2g64%5E2%5Eg0n%5E0%5E2130; c_page_id=default; log_Id_click=22; c_pref=https%3A//blog.csdn.net/Z2076465172%3Ftype%3Dblog; c_ref=https%3A//cn.bing.com/; c-sidebar-collapse=0; c_dsid=11_1761960593894.654538; log_Id_pv=22; Hm_lpvt_6bcd52f51e9b3dce32bec4a3997715ac=1761960594; log_Id_view=619; dc_tos=t50xtn
响应的部分原始数据(body内容过多这里就展示一部分):
HTTP/1.1 200 OK
Date: Sat, 01 Nov 2025 01:37:03 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Server: WAF
Vary: Accept-Encoding
Vary: Origin
X-Response-Time: 322
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-download-options: noopen
x-readtime: 322
Strict-Transport-Security: max-age=0; preload
X-Request-Id: 7bf999e1cc109bb03c3b279791ae6382
X-Cache: BYPASS
Content-Length: 687479<!doctype html><html lang="zh" data-server-rendered="true"><head><title>CSDN_专业开发者社区_已接入DeepSeek R1-0528版本</title> <meta name="keywords" content="CSDN博客,CSDN学院,CSDN论坛,CSDN直播"> <meta name="description" content="CSDN是全球知名中文IT技术交流平台,创建于1999年,包含原创博客、精品问答、职业培训、技术论坛、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区."> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui"> <meta name="referrer" content="always"> <!----> <!----> <!---->
四、 HTTP 协议基本格式
HTTP请求和响应的格式(以CSDN首页为例)
HTML协议是一个文本格式的协议
HTTP请求格式:
1. 首行
2. 请求头(heder)
3. 空行
4. 正文(body)

HTTP响应格式:
1. 首行
2. 响应头(heder)
3. 空行
4. 正文(body)

认识URL
URL(统一资源定位符)其实就是我们常说的 “网址”,它的作用特别简单:告诉浏览器 / APP“网络上的某个资源在哪,怎么获取”。互联⽹上的每个⽂件都有⼀个唯一的URL(统一资源定位符),它包含的信息指出⽂件的位置以及浏览器应该怎么处理它.
拆解url
拿一篇CSDN文章URL来说:
https://blog.csdn.net/2201_75758787/article/details/154138586?spm=1001.2014.3001.5501
- 协议名称(https://)
- http://:普通传输(明文,不安全);
- https://:加密传输(更安全,现在主流);
URL不只是HTTP专属的概念,可以给各种协议提供支持
- 域名(blog.csdn.net)
这里就是blog.csdn.netCSDN某个博主的文章的 “名字”,告诉浏览器 “要找CSDN的服务器”。
要访问的服务器的ip地址或域名(域名更好记),ip和域名可以相互转换,这个过程通过DNS域名解析系统来完成的.(DNS即是一套服务器系统,也是一个应用层)
-
端口号(此处的端口号省略了)
没写的时候,浏览器会自动添加默认的端口号.http默认端口号为80,https默认端口号为443
-
路径(/2201_75758787/article/details/154138586)
带有层次结构的路径,想要访问的是某个程序管理的某个资源。
某个资源可以是硬盘上的文件,也可以是虚拟的资源(通过一段代码逻辑来生成的数据)
- 查询字符串 Query String(?spm=1001.2014.3001.5501)
对要访问的资源补充说明。
为键值对结构,键值对之间使用&分割,键和值之间使用 = 分割
此处的键值对都是由程序员来自定义的
关于 URL encode
像/?:等这样的字符,已经被url当做特殊意义理解了.因此这些字符不能随意出现.
⽐如,某个参数中需要带有这些特殊字符,就必须先对特殊字符进⾏转义.
当你在百度搜索 “C++”:
查询字符串中并不是显示C++,而是C%2B%2B,这就是把 URL 中 “不合法” 或 “有特殊含义” 的字符,转换成一种 “通用格式”,让 URL 能被正确识别和传输。

认识方法
在 HTTP 协议里,“方法”(Method)是客户端发给服务器的 “动作指令”—— 简单说,就是告诉服务器 “我要对你的资源做什么操作”。

1. GET⽅法
GET是最常⽤的HTTP⽅法.常⽤于获取服务器上的某个资源.
在浏览器中直接输⼊URL,此时浏览器就会发送出⼀个GET请求.
获取html,获取css,获取js等操作,也是GET请求。
GET请求一般没有body,所以GET 方法传递数据的方式很直接:把 “要什么” 通过 URL 后面的参数告诉服务器,格式是?参数名=参数值&另一个参数名=另一个值(?是参数的开始,&用来分隔多个参数)。
使⽤Fiddler观察GET请求(以CSDN为例)
打开Fiddler,访问CSDN主⻚,观察抓包结果

GET请求的特点
- 首行的第⼀部分为GET
- URL的querystring可以为空,也可以不为空.
- header部分有若⼲个键值对结构.
- body部分为空
2. POST⽅法
POST 是 HTTP 协议中定义的请求方法之一,核心功能是向服务器提交数据,通常用于创建资源或触发服务器状态变化,属于 HTTP 规范中 “非安全” 且 “非幂等” 的方法,是 Web 应用中处理数据提交的主要方式。
使⽤Fiddler观察POST⽅法
POST方法通常在登录和上传的场景,这里以gitee上传头像为例

POST请求的特点
- ⾸⾏的第⼀部分为POST
- URL的querystring⼀般为空(也可以不为空)
- header部分有若⼲个键值对结构.
- body部分⼀般不为空.body内的数据格式通过header中的
Content-Type指定.body的⻓度由header中的Content-Length指定
GET和POST的区别
GET和POST从技术实现上,可以语义 “混用”,但是一般都按照HTTP 协议规范来使用
- 语义不同:GET⼀般⽤于获取数据,POST⼀般⽤于提交数据.Content-Type 指定.body的⻓度
- GET的body⼀般为空,需要传递的数据通过querystring传递,POST的querystring⼀般为空,需要传递的数据通过body传递
- GET请求⼀般是幂等的,POST请求⼀般是不幂等的.
- GET可以被缓存,POST不能被缓存.(这⼀点也是承接幂等性).
请求一定,得到的响应也是一定的,也就是说多次执行相同的操作,最终产生的结果与执行一次该操作的结果完全一致,这就是幂等。
3.其他方法
这部分方法用的比较少
- PUT与POST相似,只是具有幂等特性,⼀般⽤于更新
- DELETE删除服务器指定资源
- OPTIONS返回服务器所⽀持的请求⽅法
- HEAD类似于GET,只不过响应体不返回,只返回响应头
- TRACE回显服务器端收到的请求,测试的时候会⽤到这个
- CONNECT预留,暂⽆使⽤
认识请求"报头"(header)
header 的整体的格式也是"键值对"结构.
每个键值对占⼀⾏.键和值之间使⽤ : 分割
键值对都是RFC标准文档规定的
Host
表示服务器主机的地址和端口

绝大部情况下这俩属性是一样的,一下两种情况会不一样
1.使用代理,但是即使使用了代理,也可以通过Host来获取到最原始的目标是啥
2.在加密传输协议"https"中,header中的Host被加密
Content-Length
表⽰body中的数据⻓度,单位是字节,其核心作用是帮助接收方(服务器或客户端)准确判断 “数据是否传输完整”,避免因数据截断或冗余导致解析错误。
HTTP协议,传输层基于TCP实现,多个请求需要服务器区分:
Content-Type
表示请求的body中的数据格式.
提示了接收方如何解析 body中的数据比如说 html,css,js,json,图片等等
User-Agent (简称UA)
表⽰浏览器/操作系统的属性.
在以下User-Agent中:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0

里面表示了用户使用的设备和操作系统的情况
UA还有另一种用法:
用来区分用户的设备是pc还是手机,然后返回不同的版本的页面
Referer
表⽰这个⻚⾯是从哪个⻚⾯跳转过来的
直接输入URL或收藏栏打开的页面是没有Referer

Cookie
Cookie基本概念:
在 HTTP 协议中,Cookie 是服务器存储在客户端(浏览器 / APP)的小型数据片段,主要用于解决 HTTP “无状态” 特性带来的问题(HTTP 本身不记录客户端历史请求,Cookie 相当于给客户端 “贴标签”,让服务器能识别用户)。
Cookie的由来:
源于,页面中的js虽然可以实现一些逻辑,但是为了安全,js代码是无法访问你的文件系统的,但是在实际开发中,有的时候还是需要希望把某些数据能够保存在本地磁盘的,因此引入的Cookie机制,所以cookie 就是浏览器允许网页在本地硬盘存储数据的一种机制不是让网页代码直接访问文件系统,而是做了一层抽象.而是 浏览器的 cookie 提供了键值对存储机制
Cookies是如何储存的:
用Fiddler抓包Cokkie:

浏览器中可以直接看到当前页面保存的Cokkie:
按下F12,点击APPlication,左下角Cookies

通过抓包来观察Cookie的储存方式

理解Cookie 存储过程
业务相关的Cookie 里的数据都是程序员自定义内容.但是有一个典型的场景,属于"通用业务,“登录和用户认证”

浏览器保存了这些 cookie 之后,就会在后续给服务器发送请求的时候,把这些 cookie 键值对放到 请求 cookie header 中传输给服务器,当然Cookie也可能是会过期的,服务器返回Cookie的时候,可以设置有效时间,如果 Cookie 中的 sessionld 过期了,此时就需要用户重新登陆了。
网站对安全要求高的,过期时间就短,对安全要求低反之
认识"状态码"(statuscode)
HTTP 状态码是服务器对客户端请求的响应状态标识,用 3 位数字组成,共分为 5 大类,分别对应不同的请求处理结果。(表示访问一个页面的结果,是访问成功,还是失败,还是其他的⼀些情况…).

HTTP 状态码分类
状态码的数量比较多,可按首位数字分为 5 类:
| 1xx(信息性状态码) | 表示接收的请求正在处理 |
|---|---|
| 2xx(成功状态码) | 表示请求正常处理完毕 |
| 3xx(重定向状态码) | 表示重定向 |
| 4xx(客户端错误状态码) | 表示客户端出现错误 |
| 5xx(服务器错误状态码) | 服务器在处理请求的过程中发生了错误 |
常用状态码
200 OK
最常见的状态码,表示成功处理完毕
示例:

404 Not Found
访问的资源没找到
我们知道URL,通过IP定位主机,通过port得到程序,path定位到程序管理资源,而404错误就出现在path访问的资源服务器上没有
示例:

403 Forbidden
拒绝被访问。(没有权限)
例如在gitee中访问没有公开的内容就会出现:

405 Method Not Allowedd
服务器理解了客户端的请求,但拒绝使用请求中指定的 HTTP 方法
某个 API 接口明确只允许 POST 方法提交数据,若客户端用 PUT 方法调用就会触发 405。
500 Internal Server Error
服务器出现错误(服务器处理逻辑的代码中抛出异常,但是你没有 catch 到)
504 Gateway Timeoutw
服务器作为网关或代理时,未能在规定时间内从上游服务器(如后端服务、源服务器等)收到请求的响应,从而导致请求失败
服务器的入口就认为是网关,当入口服务器资源紧张时,处理单条请求时间过长就会出现超时现象。
一般在大学教务系统抢课期间可能出现
302 Move Temporaily
请求的资源临时迁移到了新地址,客户端需重新向新地址发起请求才能获取资源
访问服务器A,服务器A告诉你去找服务器B
认识响应"报头"(header)
响应报头的基本格式和请求报头的格式基本⼀致
类似于Content-Type ,Content-Length 等属性的含义也和请求中的含义⼀致
Content-Type
响应中的Content-Type常⻅取值有以下⼏种:
text/html:body数据格式是HTMLtext/css:body数据格式是CSSapplication/javascript:body数据格式是JavaScriptapplication/json:body数据格式是JSON
认识响应"正⽂"(body)
正⽂的具体格式取决于Content-Type
五、总结
希望大家看完后,能试着用 Fiddler 抓抓日常访问的网站包巩固一下,也盼着这些内容能帮你打好 HTTP 和网络通信的基础~



