当前位置: 首页 > news >正文

「网络通信」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 个部分

  1. 首行

在这里插入图片描述

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

在这里插入图片描述

🍌响应

HTTP 响应的基本格式也是分为四个部分

  1. 首行

在这里插入图片描述
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。这取决于代码是怎么写的,尤其是服务器和客户端都是自己实现的情况下
但是这两者在使用习惯上还是有区别的:

  1. GET 习惯于把数据放到 URL 的 query string 中;POST 习惯于把数据放到 body 中
  2. 语义上的区别。标准文档中,GET 的语义是用来获取数据;POST 的语义是给服务器传输数据。当然实际使用并不拘泥于上述要求
  3. 关于幂等性。标准文档中建议 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 中不安全


🍉状态码

🍌类别

在这里插入图片描述

🍌常见状态码

  1. 200 OK
    打开 Fiddler,放眼望去基本都是 200,它表示请求已经成功处理
    在这里插入图片描述
  2. 404 Not Found
    这个也很常见,Not found 表示访问的资源没找到,此处的资源指的是 URL 中的路径
    比如输入一个不存在的网址:

在这里插入图片描述

  1. 403 Forbidden
    表示请求的资源没有权限访问

  2. 405 Method Not Allowed
    如果你的服务器只支持 GET 请求,但是你发了一个 POST 请求,那就会出现这个状态码

  3. 500 Internal Server Error
    表示服务器内部错误,遇到这种情况可能是服务器挂了

  4. 504 Gateway Timeout
    访问服务器超时了,这可能是服务器挂了,也可能是网断了

  5. 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

切换风格的写法&#xff1a; 先看看样式效果&#xff1a; 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 …...

洗地机哪个牌子好?四款口碑最好的洗地机排名推荐

随着“懒人经济”的出现&#xff0c;越来越多的人开始使用洗地机。洗地机哪个牌子好&#xff1f;为了帮助大家在这个琳琅满目的市场中做出明智决策&#xff0c;本文特别整理了四款口碑最好的洗地机排名推荐&#xff0c;它们凭借出色的清洁效果、智能化的操作体验以及用户的高度…...

如何提升短视频的曝光量和获客效能?云微客来解决

在流量至上的当下&#xff0c;短视频凭借其优势&#xff0c;迅速成为了众多企业获客引流的核心营销手段。进入短视频赛道后&#xff0c;如何提升短视频的曝光量和获客效能&#xff0c;就成为了众多企业亟待解决的焦点。 如果你不想投入大量的广告预算&#xff0c;还想在短视频平…...

SpringBoot开发中如何缓存数据, 减少数据库的访问频率?

一&#xff1a;自定义是否开启缓存 方法一&#xff1a; 在不同环境的配置文件中如application-dev.yml、application-test.yml、application-prod.yml&#xff0c;修改 spring.cache.type none; spring:cache:type: none 方法二&#xff1a; 自定义配置 application.yml&…...

PostgreSQL如何在windows/linux开启归档

linux开启归档&#xff1a; archive_mode onarchive_command test ! -f /mnt/pg12/archivedir/%f && cp %p /mnt/pg12/archivedir/%fwindows开启归档&#xff1a; archive_mode onarchive_command copy "%p" "C:\\server\\pg12\\archivedir\\%f&q…...

【启明智显分享】基于国产Model3芯片的7寸触摸屏助力智慧医疗,电子床头屏提升护理交互

未来医院必然是以信息化为基础&#xff0c;以物联网为特征&#xff0c;以医疗为核心的服务型医院。病房作为医院的重要服务场所&#xff0c;成为智慧医院建设的重要一环。 为提高医护人员与患者的互动交流&#xff0c;给医疗注入智慧元素&#xff0c;让患者享受智能服务&#…...

从理论到实践:如何用 TDengine 打造完美数据模型​

在用 TDengine 进行数据建模之前&#xff0c;我们需要回答两个关键问题&#xff1a;建模的目标用户是谁&#xff1f;他们的具体需求是什么&#xff1f;在一个典型的时序数据管理方案中&#xff0c;数据采集和数据应用是两个主要环节。如下图所示&#xff1a; 对于数据采集工程师…...

可以免费合并pdf的软件 合并pdf文件的软件免费 合并pdf的软件免费

在数字化办公的今天&#xff0c;pdf格式因其稳定性和跨平台兼容性被广泛使用。然而&#xff0c;当我们需要将多个 pdf 文件合并为一个时&#xff0c;却往往感到力不从心。本文将为你介绍几款强大的pdf文件合并软件&#xff0c;让你轻松管理文档。 方法一、使用pdf转换器 步骤1…...

【排序 滑动窗口 】1498. 满足条件的子序列数目

本文涉及至知识点 排序 C算法&#xff1a;滑动窗口总结 LeetCode1498. 满足条件的子序列数目 给你一个整数数组 nums 和一个整数 target 。 请你统计并返回 nums 中能满足其最小元素与最大元素的 和 小于或等于 target 的 非空 子序列的数目。 由于答案可能很大&#xff0c;…...

洛谷P7071 ‘优秀的拆分’背后:如何用对拍程序验证你的C++代码正确性(附Win10批处理脚本)

洛谷P7071 优秀的拆分背后&#xff1a;如何用对拍程序验证你的C代码正确性&#xff08;附Win10批处理脚本&#xff09; 在编程竞赛中&#xff0c;写出能通过样例的代码只是第一步。真正考验选手的是代码在各种边界条件下的稳定性。很多选手都有这样的经历&#xff1a;提交代码后…...

嵌入式C函数指针覆盖变量问题分析与解决方案

1. 函数指针覆盖变量问题解析在嵌入式C语言开发中&#xff0c;函数指针是一种强大的工具&#xff0c;但也可能带来一些难以察觉的问题。特别是在Keil MDK等嵌入式开发环境中&#xff0c;函数指针的错误使用可能导致变量被意外覆盖&#xff0c;这类问题往往难以调试。1.1 问题现…...

粉笔事业单位适合备考资格复审后面试吗?从材料确认、题型训练到岗位表达的评测

更新日期&#xff1a;2026年5月 很多事业单位考生在进入资格复审后&#xff0c;会搜索“粉笔事业单位怎么样”“粉笔事业单位面试适合资格复审后准备吗”“事业单位资格复审后怎么准备面试”。这些问题背后&#xff0c;真正关心的是&#xff1a;资格复审通过后距离面试通常不远…...

5G网优路测数据分析方法:从数据采集到问题定位

路测&#xff08;Drive Test&#xff09;是5G网络优化最基础也是最关键的数据采集手段。本文从数据采集、分析方法、问题定位三个层面&#xff0c;系统讲解5G路测数据分析方法论。一、5G路测概述1.1 路测目的目的说明适用场景覆盖验证验证5G网络覆盖是否达标新站开通、优化后验…...

7步掌握listmonk API认证:从令牌生成到权限验证实战指南

7步掌握listmonk API认证&#xff1a;从令牌生成到权限验证实战指南 listmonk是一款高性能、自托管的新闻通讯和邮件列表管理器&#xff0c;具有现代化的仪表板&#xff0c;采用单一二进制应用形式。本文将详细介绍如何通过7个简单步骤掌握listmonk的API认证&#xff0c;包括令…...

从零构建知识图谱:基于NLP的实体关系抽取与Neo4j存储实践

1. 项目概述&#xff1a;从文本到知识的桥梁最近几年&#xff0c;知识图谱这个概念在自然语言处理&#xff08;NLP&#xff09;和人工智能领域火得不行。简单来说&#xff0c;它就是把散落在海量文本里的“知识点”——比如实体&#xff08;人物、地点、概念&#xff09;和它们…...

本地部署Qwen大模型:从量化加载到性能优化的完整实践指南

1. 项目概述&#xff1a;从开源大模型到个人AI助手的跃迁最近在折腾本地部署大语言模型&#xff0c;发现了一个宝藏项目——QwenLM/Qwen。这可不是一个简单的模型仓库&#xff0c;而是一个由通义千问团队打造的开源大语言模型家族。简单来说&#xff0c;它让你能在自己的电脑或…...

终极指南:3分钟掌握Switch游戏安装的完整解决方案

终极指南&#xff1a;3分钟掌握Switch游戏安装的完整解决方案 【免费下载链接】Awoo-Installer A No-Bullshit NSP, NSZ, XCI, and XCZ Installer for Nintendo Switch 项目地址: https://gitcode.com/gh_mirrors/aw/Awoo-Installer Awoo Installer是一款专为Nintendo S…...

TrollInstallerX终极指南:3分钟完成iOS安装工具的零基础教程

TrollInstallerX终极指南&#xff1a;3分钟完成iOS安装工具的零基础教程 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX TrollInstallerX是一款专为iOS设备设计的智能越…...

BGP EVPN Type2/3/5路由:VXLAN控制平面的三大支柱

1. 揭开BGP EVPN Type2/3/5路由的神秘面纱 第一次接触VXLAN控制平面时&#xff0c;我被各种路由类型搞得晕头转向。直到在数据中心网络改造项目中踩了几个坑&#xff0c;才真正理解BGP EVPN这三种核心路由就像乐高积木&#xff0c;各自独立却又完美拼合。想象一下&#xff0c;T…...