计算机网络原理之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系列的文档,所以不管是蓝牙初学者还是蓝牙从业人员…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...
STM32标准库-ADC数模转换器
文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)1.4.2 信号 “调度站”:多路开关1.4.3 信号 “加工厂”:ADC 转换器(规则组 注入…...
高分辨率图像合成归一化流扩展
大家读完觉得有帮助记得关注和点赞!!! 1 摘要 我们提出了STARFlow,一种基于归一化流的可扩展生成模型,它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流(TARFlow&am…...
ubuntu清理垃圾
windows和ubuntu 双系统,ubuntu 150GB,开发用,基本不装太多软件。但是磁盘基本用完。 1、查看home目录 sudo du -h -d 1 $HOME | grep -v K 上面的命令查看$HOME一级目录大小,发现 .cache 有26GB,.local 有几个GB&am…...
GitHub 常见高频问题与解决方案(实用手册)
1.Push 提示权限错误(Permission denied) 问题: Bash Permission denied (publickey) fatal: Could not read from remote repository. 原因: 没有配置 SSH key 或使用了 HTTPS 而没有权限…...
