计算机网络原理之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系列的文档,所以不管是蓝牙初学者还是蓝牙从业人员…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...

JDK 17 序列化是怎么回事
如何序列化?其实很简单,就是根据每个类型,用工厂类调用。逐个完成。 没什么漂亮的代码,只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...

MySQL体系架构解析(三):MySQL目录与启动配置全解析
MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录,这个目录下存放着许多可执行文件。与其他系统的可执行文件类似,这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中,用…...