计算机网络原理之HTTP与HTTPS
一、前言
为了理解HTTP,我们有必要事先了解一下TCP/IP协议簇。
通常我们使用的网络(包括互联网)是在TCP/IP协议簇的基础上运作的。而HTTP属于它内部的一个子集。
计算机与网络设备要相互通信,双方必须基于相同的方法。比如,如何探测到通信目标、由哪一边先发起通信、使用那种语言进行通信、怎样结束通信等规则都需要事先确定。不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则。而我们就把这种规则称为协议。TCP/IP是互联网相关的各类协议簇的总称。
TCP/IP协议簇最重要的一点就是分层:应用层、传输层、网络层、数据链路层。我们的HTTP就属于应用层。
HTTP协议的最新版本是3.0版本,但目前大规模使用的任然是1.1版本。
二、HTTP格式
HTTP的格式要分请求和响应两个部分来看待。
宏观上HTTP请求响应包括 报文首部、空行、报文主体(正文)
1、HTTP请求
(1)、报文首部:请求行、请求头(header)、其他
请求行: 包括方法、URL、HTTP版本
请求头:是一个个键值对的数据,键和值之间用:隔开
Host:表示服务器主机的地址和端口.
Content-Length:body数据长度(和粘包问题相关)
Content-Type:body数据格式,常见的有json,form,form-data,不同的Content-Type:服务器处理数据的逻辑不同
User-Agent:描述用啥设备上网
Referer:描述当前页面从哪一个页面跳转而来
Cookie:浏览器在本地存储数据的机制,是键值对。在一些程序过程中,会有一些数据,需要在浏览器存储,在后续请求的时候把这些数据一并发送给服务器,一般我们会想到直接把数据存到文件中,但是如果直接让网页来操纵我的电脑是非常不安全的,所有引入cookie来存储。
(2)空行:请求头结束的标记。
(3)报文主体(正文):有的http有,有的没有
HTTP的请求格式是文本格式:
2、HTTP响应
(1)、报文首部: 状态行、响应头、报文主体正文
状态行:HTTP版本、状态码、状态描述
响应头:是一个个键值对的数据,键和值之间用:隔开
Host:表示服务器主机的地址和端口.
Content-Length:body数据长度(和粘包问题相关)
Content-Type:body数据格式,例如HTML,CSS,JS,JSON,图片,字体,视频。
User-Agent:描述用啥设备上网
Referer: 描述当前页面从哪一个页面跳转而来
Cookie:浏览器在本地存储数据的机制,是键值对。在一些程序过程中,会有一些数据,需要在浏览器存储,在后续请求的时候把这些数据一并发送给服务器,一般我们会想到直接把数据存到文件中,但是如果直接让网页来操纵我的电脑是非常不安全的,所有引入cookie来存储。
(2)、空行:请求头结束的标记。
(3)、报文主体(正文):正文内容比较长,可能是多种格式,HTML,CSS,JS,JSON,图片,字体,视频等。
HTTP的响应格式是文本格式:

三、HTTPS
HTTPS是在HTTP的基础上,引入了一个加密层SSL协议。
HTTP+加密+认证+完整性保护 = HTTPS
加密可以分为 对称加密 (共享密钥加密)和 非对称加密(公开密钥加密)。
对称加密(共享密钥加密):加密和解密使用的是同一个密钥
非对称加密(公开密钥加密):加密和解密使用的是两个密钥,一把公开,一把私有。
1、加密
(1)对称加密(共享密钥加密)
对称加密客户端和服务器都是使用的相同的密钥,不同的客户端需要使用不同的密钥。那么每一个客户端连接到服务器的时候,都需要随机生成一个密钥,并把这个密钥告知给服务器(也可以是客户端生成),那么告知给对方就需要网络传输到对方,在这过程中,如果黑客拿到了密钥,后续的加密操作就毫无意义了。

出现个问题:
如果使用对称加密就始终要通过网络告诉对方密钥是什么,那么黑客始终就可以劫持。所以我们就可以使用非对称加密。
(2)非对称加密(公开密钥加密)
公开密钥加密方式很好地解决了共享密钥加密的困难。
公开密钥加密使用一对非对称的密钥。一把叫做私有密钥(private key),另一把叫做公开密钥(public key)。顾名思义,私有密钥不能让其他任何人知道,而公开密钥则可以随意发布,任何人都可以获得。
使用公开密钥加密方式,发送密文的一方使用对方的公开密钥进行加密处理,对方收到被加密的信息后,再使用自己的私有密钥进行解密。利用这种方式,不需要发送用来解密的私有密钥,也不必担心密钥被攻击者窃听而盗走。

黑客虽然知道公钥是啥,但是不知道私钥,就算拿到了加密的公钥也没办法解密。
还出现个问题:
这样对密钥和数据传输仍然还有一个巨大的问题黑客自己也可以生成公钥和私钥传给客户端,那么就会对客户端误导。

那么针对这个问题怎么解决呢?最关键的一点就是客户端拿到公钥的时候,能有办法严重是否是黑客伪造的。那么久要求服务器这边提供一个证书,证明自己是真的,没有被篡改过。
2、证书
证书中会包含一系列信息,例如服务器的域名,公钥,证书有效日期,证书是大家服务器的人要向第三方公正机构(如:威瑞信公司)申请的。
①服务器把公开密钥给认证机构
②认证机构用自己的私钥向服务器的公开密钥进行数字签名
③客户端拿到带有签名的公开密钥,使用认证机构的公开密钥进行解密(认证机构的公开密钥已事先植入到浏览器里了),以确认服务器公开密钥的真实性。
④使用服务器的公开密钥对报文加密后发送。
⑤服务器用私有密钥对报文解密

ps:证书数字签名:……(相当于校验和,把前面所有的数据通过一定的算法生成一个校验和,公证机关利用自己的私钥对校验和加密就得到签名)
当客户端收到证书以后:
1.按照同样的算法计算一个校验和1
2. 使用系统内置的公证机构公钥对证书签名解密得到校验和2
如果校验和1与校验和2相等就证明是原版的,没有被修改
如果校验和2与校验和1不相等就证明被篡改过
这样,黑客就算能修改为自己的公钥,但黑客不知道公证机关的私钥就不能对签名进行修改,那么黑客就无机可乘了。如果黑客向公证机关申请了证书,直接替换证书可以吗?那更是不可以的,证书中的服务器域名是唯一的,客户端一看就知道是假冒的。
图中图片出自《图解HTTP》,一本非常牛的书。
相关文章:
计算机网络原理之HTTP与HTTPS
一、前言 为了理解HTTP,我们有必要事先了解一下TCP/IP协议簇。 通常我们使用的网络(包括互联网)是在TCP/IP协议簇的基础上运作的。而HTTP属于它内部的一个子集。 计算机与网络设备要相互通信,双方必须基于相同的方法。比如&#…...
完全按照手册win10里装Ubuntu 虚拟机然后编译ESP32(主要是想针对ESP32C3和S3)开发板的鸿蒙系统(失败)
基本上完全按照手册来的,除了Ubuntu虚拟机使用了22.04 Jammy版本,鸿蒙手册里是20.04 版本,主要是鸿蒙里3年前的手册了,所以就擅自用了高版本。 据此还想到一点,鸿蒙LiteOS,还挺稳定的,3年也没有…...
vsphere vcenter web 界面的介绍
这是主页的页面...
【pyspark学习从入门到精通23】机器学习库_6
目录 分割连续变量 标准化连续变量 分类 分割连续变量 我们经常处理高度非线性的连续特征,而且只用一个系数很难拟合到我们的模型中。 在这种情况下,可能很难只通过一个系数来解释这样一个特征与目标之间的关系。有时,将值划分到离散的桶中…...
FPGA实战篇(呼吸灯实验)
1.呼吸灯简介 呼吸灯采用 PWM 的方式,在固定的频率下,通过调整占空比的方式来控制 LED 灯亮度的变化。 PWM(Pulse Width Modulation ),即脉冲宽度调制,它利用微处理器输出的 PWM 信号,实现对…...
面经自测——自我介绍
前言 这是作者新开的坑,一切题目都是从网上找的原题,为了总结网上有关的面经,以便在真实面试中较为流利的回答面试官的问题 面试之——自我介绍 自我介绍是面试中最常见的问题之一,主要目的是让面试官了解你的背景、技能和职业…...
在 LS-DYNA 中将应力转换为用户定义的坐标系
介绍 通常,使用 LS-DYNA 或 Ansys Mechanical 等仿真工具解决工程问题需要将张量结果与解析解进行比较。一个这样的例子是加压圆柱体,其中圆周应力或环状应力是感兴趣的主要应力度量。例如,如果对具有复杂端部处理的几何结构进行此类仿真&am…...
【Spark】 groupByKey与reduceByKey的区别
groupByKey 操作:将相同键的所有值收集到一个集合中。实现:不会在map端进行局部聚合,而是直接将所有相同键的数据传输到reduce端进行聚合。缺点:由于没有本地聚合,groupByKey会导致大量的数据传输和shuffle,…...
数据库与数据库管理系统概述
title: 数据库与数据库管理系统概述 date: 2024/12/7 updated: 2024/12/7 author: cmdragon excerpt: 在信息化迅速发展的时代,数据已成为企业和组织的重要资产。数据库与数据库管理系统(DBMS)是高效存储、管理和利用数据的核心工具。本文首先定义了数据库的基本概念和特…...
(简单5步实现,免费且比GPT4.0更好用)部署本地AI大语言模型聊天系统:Chatbox AI + 马斯克grok2.0大模型
摘要: 本文将指导您如何部署一个本地AI大语言模型聊天系统,使用Chatbox AI客户端应用和grok-beta大模型,以实现高效、智能的聊天体验。 引言: 由马斯克X-AI发布的Grok 2大模型以其卓越的性能超越了GPT4.0。Grok模型支持超长文本…...
滚珠螺杆导程的定义与重要性
滚珠螺杆导程是指螺杆每旋转一圈时,螺母(或与之配合的移动部件)沿螺杆轴线方向移动的距离。这个参数在机械设计和制造中非常重要,因为它直接影响到传动系统的速度、精度和效率。 导程是滚珠螺杆的重要参数之一,它与切削…...
【特殊子序列 DP】力扣509. 斐波那契数
斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n) F(n - 1) F(n - 2),其中 n > 1 给定 n &…...
linux 架构详解
Linux 是一种开源的操作系统内核,最初由 Linus Torvalds 于 1991 年创建。它是一个基于 Unix 的操作系统内核,用于构建完整的操作系统。Linux 架构是指 Linux 操作系统的内部结构和组成组件的工作方式。 整体架构 Linux系统通常被看作是一个层次化的结…...
Spring Data Elasticsearch
简介说明 spring-data-elasticsearch是比较好用的一个elasticsearch客户端,本文介绍如何使用它来操作ES。本文使用spring-boot-starter-data-elasticsearch,它内部会引入spring-data-elasticsearch。 Spring Data ElasticSearch有下边这几种方法操作El…...
OpenGL编译用户着色器shader
shader相信很多朋友们都听说过,shader就是运行再GPU上的程序。虽然是这么说,但是我们发现,很多IDE开发工具比如说visual studio 没有办法直接去运行shader代码。这是因为,许多编译器不会自动将shader文件编译成可执行的代码然后发…...
过期策略、内存淘汰机制
1.过期策略:请求时删除 定期删除 请求时删除:使用key之前,检查是否过期,属于一种被动的处理方式。 因此,过期时间到了不表示这个key真的被删除了 定期删除:Redis默认每隔100ms检查,有过期ke…...
Scala的正则表达式
package hfdobject Test35_3 {def main(args: Array[String]): Unit {println("a\tb")//定义一个规则 正则表达式//1. .表示除了换行之外的其他的任意单个字符//2. \d等于[0-9] 匹配一个数字//3. \D除了\d之外的其他的任意字符,表示非数字//4. \w等价于[…...
关于睡懒觉
我们经常听到一个词:睡懒觉。 我认为,睡懒觉这个词,是错误的。 人,是需要睡眠的,睡不够,就不会醒。睡够了,自然会醒,也不想继续睡。不信你试试,睡够了,你…...
【算法day10】栈与队列:拓展与应用
题目引用 逆波兰表达式求值滑动窗口最大值前k个高频元素 1.逆波兰表达式求值 给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意: 有效的算符为 ‘’、‘-’、‘*’ 和…...
爆肝Android JNI - 延展Android蓝牙JNI学习
零. 前言 由于Bluedroid的介绍文档有限,以及对Android的一些基本的知识需要了(Android 四大组件/AIDL/Framework/Binder机制/JNI/HIDL等),加上需要掌握的语言包括Java/C/C++等,加上网络上其实没有一个完整的介绍Bluedroid系列的文档,所以不管是蓝牙初学者还是蓝牙从业人员…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...
