HTTP 协议学习笔记:从报文结构到抓包实践

发布时间:2026/11/3 2:49:53

HTTP 协议学习笔记:从报文结构到抓包实践 一、HTTP 概述本节先厘清 HTTP 的定位它传输什么、处在网络模型的哪一层、用在哪些场景以及它的通信模型。这些是后面理解报文、方法和缓存的基础。1. 超文本传输协议HTTPHyperText Transfer Protocol超文本传输协议能传输的不仅仅是字符串还有多媒体数据二进制。这也是它被称为“超文本”而不是“纯文本”的原因。2. HTTP 是应用层协议HTTP 在传输层主要依赖 TCP 协议从 HTTP/3 开始切换到了 UDP。之所以切换核心原因在于HTTP/3 底层使用 QUIC 实现可靠传输不再完全依赖 TCP 的重传机制而 TCP 的拥塞控制在内核中实现迭代慢对性能影响明显。3. HTTP 的应用场景Web 开发中网页前端和服务器后端之间的通信。移动端 App和服务器后端之间的通信。分布式系统服务器之间的调用。4. 一问一答模型HTTP 是典型的“一问一答”模型客户端发送一个请求服务器返回一个响应。要点回顾HTTP 是应用层协议采用一问一答模型HTTP/3 基于 QUIC 走 UDP可靠传输由 QUIC 承担。二、HTTP 请求和响应本节看 HTTP 报文长什么样。HTTP 是纯文本协议报文结构可以直接读懂掌握请求报文和响应报文的四段式结构是后续抓包分析的前提。1. Request 请求报文GET https://www.bilibili.com/ HTTP/1.1 Host: www.bilibili.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Accept: text/html,application/xhtmlxml Cookie: buvid3xxxx 空行说明 header 部分结束 请求正文GET 通常省略请求行方法 URL 协议版本。请求报头若干行键值对每行一个键和值之间用“冒号 空格”分隔含义由 HTTP 协议规定。空行说明 header 部分结束。请求正文可能省略。2. Response 响应报文HTTP/1.1 302 Found Location: https://www.bilibili.com/index.html Content-Type: text/html; charsetutf-8 Content-Length: 0 空行说明 header 部分结束 响应正文可能省略状态行协议版本 状态码 状态描述。响应报头同样是若干行键值对含义由 HTTP 协议规定。空行说明 header 部分结束。响应正文可能省略。要点回顾请求报文是“请求行 报头 空行 正文”响应报文是“状态行 报头 空行 正文”空行是 header 与 body 的分界。三、URL 网址本节拆解 URL 的各个组成部分并说明 query string 为什么需要编码。理解 URL 结构才能明白后面 Host 头、路径和查询参数各自的作用。URLUniform Resource Locator统一资源定位符的作用是表示一个网络上的位置。以https://mdec.nelreports.net/api/report?catmdocs为例逐段拆解协议https。URL 里还可以带登录信息user:password但为了方便使用和防止写错现在基本都是走登录页面认证这种写法基本不用了。端口号没写端口号时浏览器会根据协议类型给一个“知名端口号”作为默认值HTTP 不写就是 80HTTPS 不写就是 443。服务器地址mdec.nelreports.net。这里写的是域名直接写 IP 地址也是可以的。带层次的文件路径/api/report。通过 IP 确定机器通过端口确定程序一个服务器程序可能会有很多资源为了方便管理就按照一定目录结构来组织可能是真实的目录也可能是通过代码逻辑构造的“虚拟目录结构”。查询字符串?catmdocs。query string 也是键值对结构的数据HTTP 的键值对是协议定义好的这里的键值对是程序员自己定义的。片段标识符#fragment一般用来区分一个页面中的不同部分。注意fragment 不会发送给服务器它只在浏览器本地生效。URL encodequery string 是程序员自定义的如果包含了特殊符号呢这时候就需要 encode 进行转码URL 中很多特殊符号都是有特定含义的。特殊符号需要转义中文和空格等也通常会被浏览器编码把要转义的内容每个字节拿出来用十六进制表示每个字节前面加上%。https://example.com/search?qC%2B%20%26%20%E4%B8%AD%E6%96%87%20100%25 解码后https://example.com/search?qC%26中文100%要点回顾URL 由协议、端口、主机、路径、查询字符串和片段标识符组成fragment 不发给服务器特殊字符需要 URL 编码。四、认识方法本节介绍 HTTP 方法及其语义差异重点澄清 GET 与 POST 的几个常见误区。方法选择直接影响接口语义、幂等性和缓存行为。几种常见方法的对比如下方法语义是否有 body幂等GET获取资源通常没有是POST提交数据通常有否官方建议PUT更新资源和 POST 类似通常有是DELETE删除资源通常没有是body 里面放的是程序员自定义的数据。1. GET 请求对于 GET 请求来说通常情况下是没有 body 的。GET 是从服务器拿一个数据到底是哪一个数据靠两部分信息定位URL 中的路径URL 中的 query string。2. POST 请求对于 POST 请求来说通常情况下都是有正文的。常见情况登录和上传文件。3. GET 和 POST 的区别两者没有本质区别能用 GET也能换成 POST能用 POST也能用 GET但使用习惯上有一定区别语义不同GET 的语义是获取数据POST 的语义是提交数据。幂等性不同GET 一般实现成“幂等”POST 没有“幂等”官方建议。但实际中 POST 常被人为设置为幂等防止重复点击导致操作被执行多次。幂等的含义是多次请求结果保持一致、不会产生额外副作用。传输数据量常说“GET 单次传输的数据量比较小POST 比较大”这个说法不准确。真实原因是历史上浏览器和服务器对 URL 长度有上限而现在 URL 也可以很长了限制主要来自实现而非协议。能否传二进制常说“GET 只能传文本POST 能传文本和二进制”这个说法也不准确。二进制数据可以通过 urlencode / Base64 转换为文本再通过 GET 传输只是 URL 中不能直接放二进制数据而且 Base64 会让体积膨胀约 33%。注意GET 与 POST 的差异主要来自语义约定和实现限制而不是协议层面的硬性规定。把“GET 不能传大数据/二进制”当成协议规则是常见的误区。4. PUT 和 DELETEPOST 和 PUT 类似只是 PUT 具有幂等性一般用于更新通常把数据也放到 body 里面。DELETE 和 GET 类似通常没有 body。要点回顾方法的核心差异在语义和幂等性GET/POST 在数据量和二进制上的常见说法并不准确限制主要来自实现。五、Host本节围绕 Host 头展开并延伸到 Content-Length、Content-Type 和浏览器缓存。这些头部决定了请求被路由到哪个站点、body 如何解析以及资源是否走缓存。1. Host 表示服务器主机的地址和端口Host 会把请求目标的主机和端口单独列出URL 中的域名还需要经过一系列解析才能得到 IP 和端口。Host 头独立于 URL 存在意义在于虚拟主机一台服务器、一个 IP 上可以部署多个网站靠 Host 区分访问的是哪个站点。CDN / 缓存分流代理和 CDN 节点根据 Host 决定回源到哪个源站、命中哪份缓存。2. Content-Length 和 Content-TypeContent-Length表示 body 中的数据长度单位是字节。Content-Type表示 body 的数据格式。这两个字段和 body 一起出现有 body 通常就需要这两个字段请求报头和响应报头中都可能出现。3. Content-Type 常见取值下表列出常见 Content-Type 及其在浏览器中的处理方式Content-Type含义浏览器处理方式text/htmlHTML 文档按 HTML 规则解析渲染成网页骨架text/cssCSS 样式按 CSS 规则解析渲染成网页样式application/javascriptJavaScript 脚本执行 JS 中的逻辑application/jsonJSON 数据浏览器一般不自主处理由页面中的 JS 代码负责解析image/jpegJPEG 图片直接渲染显示image/pngPNG 图片直接渲染显示text/plain纯文本按纯文本展示application/x-www-form-urlencoded表单编码类似 query string 的格式由后端框架解析成参数multipart/form-data多部分表单常用于文件上传由后端框架按分段解析二进制原样传输CSS/JS 开发阶段的换行空格是正常的线上版本是被专门的工具进行了压缩可以节省体积和网络传输带宽。4. 强制刷新与浏览器缓存强制刷新可以从网络上重新获取不读缓存。HTML网页结构、CSS网页样式、JavaScript网页行为、图片等都是变动频率比较低的数据浏览器通常会把上述数据保存到本机硬盘上作为“缓存”下次直接从硬盘读取。协商缓存里最常见的是304 Not Modified浏览器带着If-Modified-Since或If-None-Match去问服务器“资源变了没”没变就返回 304浏览器继续用本地缓存省掉正文传输。要点回顾Host 决定请求落到哪个站点Content-Length 和 Content-Type 描述 body304 是协商缓存命中的典型状态码。六、User-Agent简称 UA本节说明 UA 的组成和用途。UA 是服务端识别客户端环境、做兼容和分流的重要依据。User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36Mozilla/5.0历史遗留的兼容标识几乎所有浏览器都这么写。Windows NT 10.0操作系统的版本。Win6464 位操作系统。后面是浏览器内核和版本信息。UA 主要描述浏览器和操作系统的版本信息常用来区分手机和 PC。要点回顾UA 描述客户端环境常用于兼容判断和端类型分流。七、Referer 和 Location本节介绍两个与跳转相关的头部Referer 记录来源页面Location 指示重定向目标。理解它们有助于排查来源统计和重定向问题。1. Referer表示这个页面是从哪个页面跳转过来的。不是所有请求都有 Referer以下情况通常没有直接在地址栏输入 URL直接访问收藏夹从 HTTPS 页面跳到 HTTP 页面浏览器默认不发送页面设置了Referrer-Policy: no-referrer请求本身不是由页面跳转触发的如部分直接发起的请求。2. Location表示服务器告诉浏览器要去哪个网页常用于重定向一般和 3xx 状态码一起出现。要点回顾Referer 不一定存在不能假设它总是可用Location 与 3xx 状态码配合完成重定向。八、Cookie本节讲 Cookie 的作用、下发与回传方向、存储方式和典型用途并厘清 Cookie 与 Session 的关系。这是理解登录态的基础。1. 作用Cookie 是浏览器侧的本地存储机制。安装的应用程序一般能访问硬盘浏览器一般不能访问这时候 Cookie 允许网页按照“键值对”的格式组织一个字符串浏览器会把这个字符串保存到本地硬盘中。2. 从哪里来、到哪里去下发方向服务器通过响应头Set-Cookie把要存在浏览器本地的 cookie 值传递过去。回传方向本地存储以后后续访问同一个域名的网站浏览器会把 cookie 的内容通过请求头Cookie传输给服务器。3. 怎么存按照字符串键值对方式来存储根据域名维度划分每个域名下有自己的 cookie不同域名之间互相隔离。4. 用途用途有很多但最常见、最核心的就是保存用户的登录状态。5. Cookie 与 Session服务端维护了一个 HashMapkey sessionIdvalue session 对象。Cookie 和 Session 不是强相关登录也可以使用其他技术搭配 Session其他场景下 Cookie 也可以完成其他功能。要点回顾Set-Cookie 下发、Cookie 回传Cookie 按域名隔离Cookie 与 Session 并非强绑定。九、常见的状态码本节汇总常见状态码并重点区分容易混淆的 301/302 缓存差异和 502/504 的故障含义。状态码是排查线上问题最直接的线索。常见状态码及其说明如下状态码含义说明200OK成功301Moved Permanently永久重定向可被缓存302Found临时重定向默认不缓存304Not Modified协商缓存命中继续用本地缓存403Forbidden拒绝访问404Not Found访问的资源在服务器上不存在405Method Not Allowed服务器不支持这个方法500Internal Server Error服务器内部错误502Bad Gateway网关/代理从上游收到无效响应504Gateway Timeout网关/代理等待上游响应超时4xx 都属于客户端错误5xx 都表示服务器错误。502 和 504 的区别502 是上游返回了坏响应504 是上游没有在超时时间内响应。301 和 302 的缓存差异301 会被浏览器长期缓存下次直接跳新地址302 默认不缓存每次仍会请求原地址。注意502 与 504 都常出现在网关/代理层但含义不同——前者是上游响应无效后者是上游超时未响应排查方向也不同。要点回顾4xx 是客户端问题5xx 是服务端问题301 可缓存、302 默认不缓存502 看上游响应504 看上游超时。十、构造 HTTP 请求本节介绍构造 HTTP 请求的几种方式并给出 Java 11 HttpClient 的示例。理解如何手工构造请求有助于验证协议细节和排查问题。通过 form 表单构造 HTTP 请求纯 HTML 的方案。通过 AJAX 构造 HTTP 请求通过 JavaScript 构造的 HTTP 请求。通过 Java Socket 构造 HTTP 请求。下面是 Java 11 的 HttpClient 示例import java.io.IOException; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.nio.file.Path; public class MyHttpClient { public static void main(String[] args) throws IOException, InterruptedException { // 创建一个 http 实例用工厂方法 HttpClient httpClient HttpClient.newHttpClient(); // 创建一个 HttpRequest表示一个 http 请求链式结构 HttpRequest request HttpRequest.newBuilder() // 目标地址 .uri(URI.create(https://www.bilibili.com)) .GET() // 可以放 Cookie、Content-Length 之类的 .header(User-Agent, xxxxxx) .build(); // 发送给服务器 接收响应 // BodyHandlers 负责把 body 里面的内容转换为字符串 // send 会产生阻塞直到服务器响应 HttpResponseString response httpClient.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.statusCode()); System.out.println(response.uri()); System.out.println(response.body()); // 大文件不要用 ofString直接落盘避免整个文件读进内存 HttpResponsePath fileResponse httpClient.send(request, HttpResponse.BodyHandlers.ofFile(Path.of(download.html))); System.out.println(fileResponse.body()); } }也有不写代码的方案使用专门的构造 HTTP 请求的工具PostmanApifox要点回顾构造请求可以用表单、AJAX、Socket 或 HttpClient大文件响应应使用ofFile落盘避免整体读入内存。十一、Fiddler 的用法本节介绍抓包工具的本质和使用方法。抓包是验证协议细节、定位前后端问题最直接的手段。学习协议报文时少不了抓包工具这里使用的是 Fiddler。1. 抓包工具的本质通过软件读取网卡的内容从而看到请求和响应的数据明细本质上是一种“代理”。代理也分为“正向代理”代替客户端干活和“反向代理”代替服务器干活。2. 用抓包定位 bug如果要找一个功能的 bug先抓包通过网络传输的数据初步判定是前端出 bug 还是后端请求本身就不对前端 bug请求正确响应错误后端 bug请求正确响应正确前端 bug。例如网页中不能显示预期数据就看请求与响应的详细情况。3. 第一次使用需要设置把相关选项全勾选上弹出“是否要信任根证书”也要选 YES根证书是 HTTPS 抓包的前提。4. 配置完成以后要重启才会生效Raw 会展示出 HTTP 原始的数据格式如果想自己构造一个 HTTP 请求就照着上述格式拼装一个字符串写到 TCP socket 里面看到乱码说明响应内容被压缩了。要点回顾抓包工具本质是代理通过请求与响应是否正确可以快速划分前后端问题HTTPS 抓包依赖信任根证书。
延伸阅读

更多相关文章

2026/11/3 2:49:53

英伟达:双重采样修正强化学习奖励

📖标题:Double-Rollout Reinforcement Learning with Sampling-based Reward Estimation 🌐来源:arXiv, 2610.16593v1 🛎️文章简介 🔸研究问题:在训练大模型进行数学或代码推理时,如…

2026/11/3 2:49:53

卡不等于分支:我用 TRAE 宝配合 Hive 跑三张任务卡的一天

卡不等于分支:我用 TRAE 宝配合 Hive 跑三张任务卡的一天 一、场景:一张卡就是一个任务 项目组有一套自建的 Hive,用来做任务发放与流转,网页端就能看板。它的基本单位是"卡":一张卡就是一个任务&#xff0c…

2026/11/3 3:44:55

离线环境安装Percona XtraBackup实战指南

1. 离线环境下的Percona XtraBackup安装挑战在数据库运维领域,Percona XtraBackup堪称MySQL物理备份的黄金标准。但当我们面对生产环境中严格隔离的内网服务器时,常规的yum/apt安装方式往往行不通。上周我就遇到了这样一个典型场景:某金融机构…

2026/11/3 3:44:55

链表操作实战:LeetCode核心题目解析与技巧

1. 链表基础与LeetCode刷题指南链表作为数据结构中的经典类型,在算法面试和日常编程中占据重要地位。最近在准备LeetCode周赛430时,我重新梳理了链表相关的核心题目,发现203、707、206这三道题完美覆盖了链表操作的基础知识点。今天我就以这三…

2026/11/3 3:44:55

单设备多会话与多账号互斥的分布式锁解决方案

1. 单设备多会话与多账号互斥的核心挑战在现代化应用架构中,单设备多会话与多账号互斥的需求越来越普遍。想象一下这样的场景:一台医院自助服务终端需要同时处理多个患者的挂号、缴费等操作,但又要防止同一个医保账号被重复登录使用。这种既要…

2026/11/3 3:44:55

AI中保持可编辑性的矢量描边文字实现方法

1. 这个“自带边框的文字”到底在解决什么真实痛点?很多人第一次在设计群看到别人发的“描边文字”效果时,下意识反应是:这不就是PS里加个描边图层样式吗?或者直接用AI的“对象→路径→轮廓化描边”?但很快就会发现——…

2026/11/3 3:44:55

480G内存+消费级显卡跑671B大模型:MoE架构与KTransformers部署实战

简介:这份PDF面向具备Python开发经验的研究员与工程师,聚焦DeepSeek-R1满血版模型在资源受限硬件上的低成本高性能部署问题。内容围绕KTransformers技术展开,讲解其将专家模型加载至CPU、把MLA/KVCache卸载到GPU以压缩显存的思路,…

2026/11/3 3:39:55

人形机器人技术突破与商业化应用全景分析

1. 人形机器人行业现状与市场格局人形机器人作为机器人技术皇冠上的明珠,近年来正迎来爆发式增长。根据国际机器人联合会(IFR)最新数据,2023年全球人形机器人市场规模已突破50亿美元,年复合增长率保持在35%以上。这个曾…

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

STM32实战:基于MAX14431数字隔离器的SPI隔离通信方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

工业SPI隔离通信设计:MAX14431BAEE+与STM32L4A6RG实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

STM32+NRF24L01无线抢答器:硬件设计、通信协议与低功耗实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑