「网络通信」HTTP 协议
HTTP
- 🍉简介
- 🍉抓包工具
- 🍉报文结构
- 🍌请求
- 🍌响应
- 🍌URL
- 🥝URL encode
- 🍌方法
- 🍌报文字段
- 🥝Host
- 🥝Content-Length & Content-Type
- 🥝User-Agent(UA)
- 🥝Referer
- 🥝Cookie
- 🍉状态码
- 🍌类别
- 🍌常见状态码
🍉简介
HTTP 协议全称为超文本传输协议,超文本比文本更加强大,它不仅包含字符串,还可以携带一些图片、特殊格式等
HTTP 最主要的应用场景就是网站。浏览器和服务器、客户端和服务器之间传输数据的协议,很可能就是 HTTP

🍉抓包工具
抓包工具本质上是一个代理程序,能够获取到网络上传输的数据并显示出来,从而给程序员提供一些参考,在后面介绍 HTTP 报文格式的过程中,会频繁用到抓包工具,这里我们使用 fiddler,它专注于 HTTP 的抓包
打开一个网站,浏览器和服务器之间会进行多次 HTTP 交互,其中第一次交互拿到的是这个页面的 html

选中这个请求并双击,可以看到明细:

点击 RAW,可以查看 HTTP 请求的原始数据
下面是请求的原始数据

再来看下响应的原始数据

为了节省带宽,一般响应数据会被压缩,对上述响应解压缩得到:

🍉报文结构
🍌请求
HTTP 请求包含 4 个部分
- 首行

- 请求头:由若干个键值对组成,每个键值对占一行,键和值之间使用 : 分割
- 空行:请求头的结束标记
- 正文(body):http 的
载荷部分,有的 http 请求有 body,有的没有

🍌响应
HTTP 响应的基本格式也是分为四个部分
- 首行

2. 响应头:这里是按照键值对的形式来组织内容
3. 空行
4. 响应正文(body):响应的载荷是 html

🍌URL
URL 全称为唯一资源定位符,用来描述一个网络上资源的位置
一个 URL 的完整结构如下:

🥝URL encode
query string(查询字符串)里是自定义的键值对,而在 URL 中,有些特殊符号,比如 / : ? @ 等都是有特定的含义,如果 query string 中也包含同样的符号,可能会使服务器 / 浏览器解析失败,比较靠谱的方法就是对上述符号进行转义(就像 C语言中用 printf 打印一些特殊符号一样,需要转义)。
除了这些特殊符号,汉字也要进行转义,因为汉字的 utf8 / gbk 等编码值中可能某个字节恰好和某个符号的 ASCII 码值一致
下面举个例子,比如搜索 C++:

🍌方法

有两个典型的使用 POST 的场景:登录和上传
以登录为例,在一个网站输入账号密码登录后抓包得到的数据报的 body:

这里有一个比较经典的面试题:
GET 和 POST 有什么区别
GET 和 POST 本质上没有区别。使用 GET 的场景也可以替换为 POST;使用 POST 的场景也可以替换为 GET。这取决于代码是怎么写的,尤其是服务器和客户端都是自己实现的情况下
但是这两者在使用习惯上还是有区别的:
- GET 习惯于把数据放到 URL 的 query string 中;POST 习惯于把数据放到 body 中
- 语义上的区别。标准文档中,GET 的语义是用来获取数据;POST 的语义是给服务器传输数据。当然实际使用并不拘泥于上述要求
- 关于幂等性。标准文档中建议 GET 请求实现成幂等的;POST 则没有要求。当然 GET 在实际开发中也不一定得实现成幂等
这里的“幂等”源于数学术语,如果每次输入的内容一定,输出的结果也一定,那就是幂等;反之,若输入内容一定,但输出不一定,则不是幂等。在计算机中,如果某个操作是幂等的,那就可以进行缓存
🍌报文字段
🥝Host
表示服务器主机的地址和端口

🥝Content-Length & Content-Type
这两个字段分别表示 body 中数据的长度和请求的 body 中的数据格式
HTTP 底层也是基于 TCP。连续传输多个 HTTP 数据报的话,接收方这边的接收缓冲区里就会积累多个包的数据,应用程序在读取这些数据时需要明确包与包之间的边界。通过长度可以解决粘包问题
🥝User-Agent(UA)
UA 描述了操作系统和浏览器的信息,这两个其实就是在描述用户使用什么样的设备上网

它里面包含了系统信息,这就可以判定系统是 PC 的系统,还是移动端的系统,此时可以根据这个信息来返回不同的页面
比如在手机浏览器的设置中手动把 UA 修改为 PC 的 UA,那么就可以访问电脑版的网页了
🥝Referer
描述当前这个页面从哪儿来,类似上层目录,所以直接在浏览器输入 URL 的路径或从收藏夹中打开的网页都是没有 referer 的
🥝Cookie
Cookie 是报头中一个非常重要的属性,它本质上是浏览器本地持久化存储数据的机制
操作系统提供了 api 操作文件,浏览器作为电脑上的一个程序,可以调用这些 api 来读写本地磁盘文件。而浏览器上运行的网页,理论上也是可以通过浏览器提供的 api 来读写本地文件,但是为了保证安全性,浏览器禁止这种做法,也就是说它没有给网页提供这样的 api。不然有些不法分子搞一些恶意网站,你点进去之后它就会把你电脑上的文件删掉,这样势必会造成巨大损失!
不过有些网站需要把一些信息保存到浏览器这边,比如登录界面需要保存用户的身份信息。所以浏览器给网页提供了这样的 api:可以有限度地存储数据,但不能随意访问文件系统
Cookie 就是一种经典的存储数据的机制,它将存储的数据按照键值对的形式存储起来,其中键值对是由程序员自定义的,和 query string 差不多,因此不同网站的 Cookie 都是不一样的

HTTP 请求中的 Cookie 字段就是把本地存储的 Cookie 信息发送到服务器。相应地,HTTP 响应中会有一个 Set-Cookie 字段,这个是服务器告诉浏览器要在本地保存哪些信息
通常在首次访问 / 登录成功之后服务器会把数据返回给浏览器,然后 Cookie 会以域名为维度存储在浏览器本地主机的硬盘上,比如浏览器访问 Gitee,就有一组 Cookie,访问 B 站,又有一组 Cookie,这些 Cookie 之间互不冲突,后续每次访问服务器都会带上对应网站的 Cookie
不同的客户端保存的 Cookie 是不同的,即使是同一台主机,使用不同的浏览器,Cookie 大概率也是不同的


Cookie 用途就是在客户端保存数据,其中保存的数据最主要是用户的身份标识,这样服务器就可以通过标识来区分用户。它一般不会保存其他业务数据,这些数据存在服务器,通过 Cookie 中的身份标识可以找到这些数据
有个典型的场景:在某个页面登录之后,下次登录就不用再输入账号密码,因为首次输入账密后这些信息就会保存在磁盘,下次进入网页时就会先从本地读取磁盘拿到账密。发送 HTTP 请求后服务器收到 Cookie 中的用户信息后就通过身份验证了,所以不用再手动输入账密
补充:页游中的账号密码等信息一般不是放在 Cookie 中的,因为浏览器保存的密码都是明文密码,放到 Cookie 中不安全
🍉状态码
🍌类别

🍌常见状态码
- 200 OK
打开 Fiddler,放眼望去基本都是 200,它表示请求已经成功处理

- 404 Not Found
这个也很常见,Not found 表示访问的资源没找到,此处的资源指的是URL 中的路径
比如输入一个不存在的网址:

-
403 Forbidden
表示请求的资源没有权限访问 -
405 Method Not Allowed
如果你的服务器只支持 GET 请求,但是你发了一个 POST 请求,那就会出现这个状态码 -
500 Internal Server Error
表示服务器内部错误,遇到这种情况可能是服务器挂了 -
504 Gateway Timeout
访问服务器超时了,这可能是服务器挂了,也可能是网断了 -
302 Move temporarily
临时重定向,表示资源临时移动到新的位置。除了 302,301 也表示重定向,不过它是永久性的。重定向的时间会影响浏览器的缓存,如果是永久性的,那么浏览器会把重定向的结果记录下来,后续再次访问就会直接访问重定向的目标地址,不用多一次跳转了;而如果是临时性的,那就不太方便缓存了
重定向报文的响应中会有一个特殊的 header:Location,它描述了重定向的目标地址在哪儿
相关文章:
「网络通信」HTTP 协议
HTTP 🍉简介🍉抓包工具🍉报文结构🍌请求🍌响应🍌URL🥝URL encode 🍌方法🍌报文字段🥝Host🥝Content-Length & Content-Type🥝User…...
科普文:后端性能优化的实战小结
一、背景与效果 ICBU的核心沟通场景有了10年的“积累”,核心场景的界面响应耗时被拉的越来越长,也让性能优化工作提上了日程,先说结论,经过这一波前后端齐心协力的优化努力,两个核心界面90分位的数据,FCP平…...
LeetCode-day23-3098. 求出所有子序列的能量和
LeetCode-day23-3098. 求出所有子序列的能量和 题目描述示例示例1:示例2:示例3: 思路代码 题目描述 给你一个长度为 n 的整数数组 nums 和一个 正 整数 k 。 一个 子序列的 能量 定义为子序列中 任意 两个元素的差值绝对值的 最小值 。 请…...
CSS3雷达扫描效果
CSS3雷达扫描效果https://www.bootstrapmb.com/item/14840 要创建一个CSS3的雷达扫描效果,我们可以使用CSS的动画(keyframes)和transform属性。以下是一个简单的示例,展示了如何创建一个类似雷达扫描的动画效果: HTM…...
单例模式懒汉模式和饿汉模式
线程安全 单例模式在单线程中,当然是安全的。但是如果在多线程中,由于并行判断,可能会导致创建多个实例。那么如何保证在多线程中单例还是只有一个实例呢? 常见的三种方式: 局部静态变量 原理和饿汉模式相似,利用static只会初始…...
python __repr__和__str__区别
1. __repr__ __repr__ 方法由 repr() 内置函数调用,用于计算对象的“正式”字符串表示形式。理想情况下,这个字符串应该看起来像一个有效的 Python 表达式,可以在适当的环境下用来重新创建具有相同值的对象。如果这不可能实现,那…...
huawei USG6001v1学习----NAT和智能选路
目录 1.NAT的分类 2.智能选路 1.就近选路 2.策略路由 3.智能选路 NAT:(Network Address Translation,网络地址转换) 指网络地址转换,1994年提出的。NAT是用于在本地网络中使用私有地址,在连接互联网时转而使用全局…...
FPGA JTAG最小系统 EP2C5T144C8N
FPGA的文档没有相应的基础还真不容易看懂,下面是B站上对FPGA文档的解读(本文非对文档解读,只是为个人记录第三期:CycloneIV E最小系统板设计(一)从Datasheet上获取FPGA的基本参数_哔哩哔哩_bilibili 电源部份 核心电…...
Android 15 之如何快速适配 16K Page Size
在此之前,我们通过 《Android 15 上 16K Page Size 为什么是最坑》 介绍了: 什么是16K Page Size为什么它对于 Android 很坑如何测试 如果你还没了解,建议先去了解下前文,然后本篇主要是提供适配的思路,因为这类适配…...
学习unity官方的网络插件Netcode【一】
对bool值的个人理解: using Unity.Netcode; using UnityEngine; //个人理解:通过Rpc完成了一次客户端给服务端发消息,服务端再向所有客户端广播消息 public class RpcTest : NetworkBehaviour {public override void OnNetworkSpawn(){if (!…...
QT写一个mainWindow
切换风格的写法: 先看看样式效果: mian_window.h文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>class MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~MainWindow();void Ini…...
Java查找算法练习(2024.7.23)
顺序查找 package SearchExercise20240723; import java.util.Scanner; public class SearchExercise {public static void main(String[] args) {Scanner sc new Scanner(System.in);System.out.println("需要多大的数组?");int size sc.nextInt();int[] array …...
洗地机哪个牌子好?四款口碑最好的洗地机排名推荐
随着“懒人经济”的出现,越来越多的人开始使用洗地机。洗地机哪个牌子好?为了帮助大家在这个琳琅满目的市场中做出明智决策,本文特别整理了四款口碑最好的洗地机排名推荐,它们凭借出色的清洁效果、智能化的操作体验以及用户的高度…...
如何提升短视频的曝光量和获客效能?云微客来解决
在流量至上的当下,短视频凭借其优势,迅速成为了众多企业获客引流的核心营销手段。进入短视频赛道后,如何提升短视频的曝光量和获客效能,就成为了众多企业亟待解决的焦点。 如果你不想投入大量的广告预算,还想在短视频平…...
SpringBoot开发中如何缓存数据, 减少数据库的访问频率?
一:自定义是否开启缓存 方法一: 在不同环境的配置文件中如application-dev.yml、application-test.yml、application-prod.yml,修改 spring.cache.type none; spring:cache:type: none 方法二: 自定义配置 application.yml&…...
PostgreSQL如何在windows/linux开启归档
linux开启归档: archive_mode onarchive_command test ! -f /mnt/pg12/archivedir/%f && cp %p /mnt/pg12/archivedir/%fwindows开启归档: archive_mode onarchive_command copy "%p" "C:\\server\\pg12\\archivedir\\%f&q…...
【启明智显分享】基于国产Model3芯片的7寸触摸屏助力智慧医疗,电子床头屏提升护理交互
未来医院必然是以信息化为基础,以物联网为特征,以医疗为核心的服务型医院。病房作为医院的重要服务场所,成为智慧医院建设的重要一环。 为提高医护人员与患者的互动交流,给医疗注入智慧元素,让患者享受智能服务&#…...
从理论到实践:如何用 TDengine 打造完美数据模型
在用 TDengine 进行数据建模之前,我们需要回答两个关键问题:建模的目标用户是谁?他们的具体需求是什么?在一个典型的时序数据管理方案中,数据采集和数据应用是两个主要环节。如下图所示: 对于数据采集工程师…...
可以免费合并pdf的软件 合并pdf文件的软件免费 合并pdf的软件免费
在数字化办公的今天,pdf格式因其稳定性和跨平台兼容性被广泛使用。然而,当我们需要将多个 pdf 文件合并为一个时,却往往感到力不从心。本文将为你介绍几款强大的pdf文件合并软件,让你轻松管理文档。 方法一、使用pdf转换器 步骤1…...
【排序 滑动窗口 】1498. 满足条件的子序列数目
本文涉及至知识点 排序 C算法:滑动窗口总结 LeetCode1498. 满足条件的子序列数目 给你一个整数数组 nums 和一个整数 target 。 请你统计并返回 nums 中能满足其最小元素与最大元素的 和 小于或等于 target 的 非空 子序列的数目。 由于答案可能很大,…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
多元隐函数 偏导公式
我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式,给定一个隐函数关系: F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 🧠 目标: 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z、 …...
pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...
