《网络协议》06. HTTP 补充 · HTTPS · SSL/TLS
title: 《网络协议》06. HTTP 补充 · HTTPS · SSL/TLS
 date: 2022-10-06 18:09:55
 updated: 2023-11-15 07:53:52
 categories: 学习记录:网络协议
 excerpt: HTTP/1.1 协议的不足、HTTP/2、HTTP/3、HTTP 协议的安全问题、SPDY、HTTPS、SSL/TLS、OpenSSL。
 comments: false
 tags:
 top_image: /images/backimg/SunsetClimbing.png
网络协议
- 1:HTTP/1.1 协议的不足
 - 2:HTTP/2
 - 2.1:HTTP/2 特性
 - 2.1.1:二进制格式
 - 2.1.2:多路复用
 - 2.1.3:优先级
 - 2.1.4:头部压缩
 - 2.1.5:服务器推送
 
- 2.2:HTTP/2 的问题
 - 2.2.1:队头阻塞
 - 2.2.2:握手延迟
 
- 3:HTTP/3
 - 3.1:HTTP/3 特性
 - 3.1.1:连接迁移
 - 3.1.2:向前纠错
 
- 3.2:HTTP/3 的问题
 
- 4:HTTP 协议的安全问题
 - 4.1:SPDY
 
- 5:HTTPS
 - 5.1:HTTPS 的成本
 - 5.2:HTTPS 通信过程
 
- 6:SSL/TLS
 - 6.1:SSL/TLS 工作在哪一层
 - 6.2:TLS 1.2 的连接
 - 6.2.1:Client Hello
 - 6.2.2:Server Hello
 - 6.2.3:Certificate
 - 6.2.4:Server Key Exchange
 - 6.2.5:Server Hello Done
 - 6.2.6:Client Key Exchange
 - 6.2.7:Change Cipher Spec
 - 6.2.8:Finished(Client)
 - 6.2.9:Change Cipher Spec
 - 6.2.10:Finished(Server)
 
- 6.3:OpenSSL
 
网络协议从入门到底层原理。
1:HTTP/1.1 协议的不足
-  
同一时间,一个连接只能对应一个请求
针对同一个域名,大多数浏览器允许同时最多 6 个并发连接 -  
只允许客户端主动发起请求
一个请求只能对应一个响应 -  
同一个会话的多次请求中,头信息会被重复传输
通常会给每个传输增加 500~800 字节的开销
如果使用 Cookie,增加的开销有时会达到上千字节 
2:HTTP/2
HTTP/2,于 2015 年 5 月以 RFC 7540 正式发表
- 根据 W3Techs 的数据,截至 2019 年 6 月,全球有 36.5% 的网站支持了 HTTP/2
 
下列两个网站可以进行 HTTP/1.1 和 HTTP/2 速度对比
- http://www.http2demo.io/
 - https://http2.akamai.com/demo
 
HTTP/2 在底层传输做了很多的改进和优化,但在语意上完全与 HTTP/1.1 兼容
- 比如请求方法(如 GET、POST)、Status Code、各种 Headers 等都没有改变
 - 因此,要想升级到 HTTP/2,开发者不需要修改任何代码,只需要升级服务器配置、升级浏览器
 
2.1:HTTP/2 特性
2.1.1:二进制格式
HTTP/2 采用二进制格式传输数据,而非 HTTP/1.1 的文本格式。
二进制格式在协议的解析和优化扩展上带来更多的优势和可能。

一些基本概念:
-  
数据流:已建立的连接内的双向字节流,可以承载一条或多条消息。
所有通信都在一个 TCP 连接上完成,此连接可以承载任意数量的双向数据流。 -  
消息:与逻辑 HTTP 请求或响应消息对应,由一系列帧组成。
 -  
帧:HTTP/2 通信的最小单位,每个帧都包含帧头(会标识出当前帧所属的数据流)
来自不同数据流的帧可以交错发送,然后再根据每个帧头的数据流标识符重新组装 


2.1.2:多路复用
多路复用(Multiplexing),客户端和服务器可以将 HTTP 消息分解为互不依赖的帧,然后交错发送,最后再在另一端把它们重新组装起来

- 并行交错地发送多个请求,请求之间互不影响
 - 并行交错地发送多个响应,响应之间互不干扰
 - 使用一个连接并行发送多个请求和响应
 

不必再为绕过 HTTP/1.1 限制而做很多工作。比如精灵图(image sprites)、合并 CSS/JS、内嵌 CSS/JS/Base64 图片、域名分片等。
精灵图(image sprites),也叫做 CSS Sprites,将多张小图合并成一张大图。最后通过 CSS 结合小图的位置、尺寸进行精准定位。

2.1.3:优先级
-  
HTTP/2 标准允许每个数据流都有一个关联的权重和依赖关系
可以向每个数据流分配一个介于 1 至 256 之间的整数
每个数据流与其他数据流之间可以存在显式依赖关系 -  
客户端可以构建和传递 “ 优先级树 ”,表明它倾向于如何接收响应
 -  
服务器可以使用此信息通过控制 CPU、内存和其他资源的分配设定数据流处理的优先级
在资源数据可用之后,确保将高优先级响应以最优方式传输至客户端 
示例:

2.1.4:头部压缩
HTTP/2 使用 HPACK 压缩请求头和响应头,可以极大减少头部开销,进而提高性能。
早期版本的 HTTP/2 和 SPDY 使用 zlib 压缩请求头和响应头,可以将所传输头数据的大小减小 85% ~ 88%。
但在 2012 年夏天被攻击,导致会话劫持。
后被更安全的 HPACK 取代。


2.1.5:服务器推送
服务器推送(Server Push):服务器可以对一个客户端请求发送多个响应。
除了对最初请求的响应外,服务器还可以向客户端推送额外资源,而无需客户端额外明确地请求。

2.2:HTTP/2 的问题
2.2.1:队头阻塞
队头阻塞(head of line blocking)。

2.2.2:握手延迟

RTT(Round Trip Time):往返时延,可以简单理解为通信一来一回的时间。

3:HTTP/3
Google 觉得 HTTP/2 仍然不够快,于是就有了 HTTP/3。
HTTP/3 由 Google 开发,弃用 TCP 协议,改为使用基于 UDP 协议的 QUIC 协议实现。
- QUIC(Quick UDP Internet Connections,快速 UDP 网络连接),由 Google 在 2013 年实现
 - 于 2018 年从 HTTP-over-QUIC 改为 HTTP/3
 

思考:
HTTP/3 基于 UDP,如何保证可靠传输?
- 由 QUIC 来保证
 
为何 Google 不开发一个新的不同于 TCP、UDP 的传输层协议?
- 目前世界上的网络设备基本只认TCP、UDP
 - 如果要修改传输层,意味着操作系统的内核也要修改
 - 另外,由 IETF 标准化的许多 TCP 新特性都因缺乏广泛支持而没有得到广泛的部署或使用,因此,要想开发并应用一个新的传输层协议,是极其困难的一件事情
 
3.1:HTTP/3 特性
3.1.1:连接迁移
TCP 基于 4 要素:源 IP、源端口、目标 IP、目标端口。
- 切换网络时至少会有一个要素发生变化,导致连接发生变化
 - 当连接发生变化时,如果还使用原来的 TCP 连接,则会导致连接失败,就得等原来的连接超时后重新建立连接
 - 所以有时发现切换到一个新网络时,即使新网络状况良好,但内容还是需要加载很久
 - 即使当检测到网络变化时立刻建立新的 TCP 连接,还是需要几百毫秒的时间
 
QUIC 的连接不受 4 要素的影响,当 4 要素发生变化时,原连接依然维持。
- QUIC 连接不以 4 要素作为标识,而是使用一组 Connection ID(连接ID)来标识一个连接
 - 即使 IP 或者端口发生变化,只要 Connection ID 没有变化,那么连接依然可以维持
 
例如:
当设备连接到 Wi-Fi 时,将进行中的下载从蜂窝网络连接转移到更快速的 Wi-Fi 连接。
当 Wi-Fi 连接不再可用时,将连接转移到蜂窝网络连接。
3.1.2:向前纠错
目前还没有成为标准,以后是否会成为标准也不确定。
HTTP/3 的向前纠错,丢包以后可以根据其他包推测出这个包的数据(只适合丢失少量数据)。
如果是之前的基于 TPC 协议,丢包以后会重传。
3.2:HTTP/3 的问题
操作系统内核、CPU 负载。
- Linux 内核的 UDP 部分没有像 TCP 那样的优化,因为传统上没有使用 UDP 进行如此高速的信息传输
 - TCP 和 TLS 有硬件加速,而这对于 UDP 很罕见,对于 QUIC 则基本不存在
 
据 Google 和 Facebook 称,与基于 TLS 的 HTTP/2 相比,它们大规模部署的 QUIC 需要近 2 倍的 CPU 使用量
随着时间的推移,相信这个问题会逐步得到改善
4:HTTP 协议的安全问题
HTTP 协议默认是采取明文传输的,因此会有很大的安全隐患。
常见的提高安全性的方法是:对通信内容进行加密后,再进行传输。
常见的加密方式:
- 不可逆
单向散列函数:MD5、SHA 等 - 可逆
对称加密:DES、3DES、AES 等
非对称加密:RSA 等 - 其它
混合密码系统
数字签名
证书 
encrypt:加密
decrypt:解密
plaintext:明文
ciphertext:密文
为了便于学习,设计 4 个虚拟人物:
- Alice、Bob:互相通信
 - Eve:窃听者
 - Mallory:主动攻击者
 

如何防止被窃听:

4.1:SPDY
SPDY(speedy 的缩写),是基于 TCP 的应用层协议,它强制要求使用 SSL/TLS。

2009 年 11 月,Google 宣布将 SPDY 作为提高网络速度的内部项目。
SPDY 与 HTTP 的关系:
- SPDY 并不用于取代 HTTP,它只是修改了 HTTP 请求与响应的传输方式
 - 只需增加一个 SPDY 层,现有的所有服务端应用均不用做任何修改
 - SPDY 可以看做是 HTTP/2 的前身
 
5:HTTPS
HTTPS(HyperText Transfer Protocol Secure,超文本传输安全协议)
- 也称为 HTTP over TLS、HTTP over SSL、HTTP Secure
 - 由网景公司于 1994 年首次提出
 - HTTPS 的默认端口号是 443(HTTP 是 80)
 
现在在浏览器上输入 http://www.baidu.com
会自动重定向到 https://www.baidu.com
5.1:HTTPS 的成本
- 证书的费用
 - 加解密计算
 - 降低了访问速度
 
有些企业的做法是:包含敏感数据的请求才使用 HTTPS,其他保持使用 HTTP。
5.2:HTTPS 通信过程
总的可以分为 3 大阶段:

6:SSL/TLS
SSL(Secure Sockets Layer,安全套接层),是 TLS 的前身。
TLS(Transport Layer Security,传输层安全性协议)。
HTTPS 是在 HTTP 的基础上使用 SSL/TLS 来加密报文,对窃听和中间人攻击提供合理的防护。

SSL/TLS 也可以用在其他协议上,比如:
FTP -> FTPSSMTP -> SMTPS
SSL/TLS 历史版本信息
- SSL 1.0:因存在严重的安全漏洞,从未公开过
 - SSL 2.0:1995 年,已于 2011 年弃用(RFC 6176)
 - SSL 3.0:1996 年,已于 2015 年弃用(RFC 7568)
 - TLS 1.0:1999 年(RFC 2246)
 - TLS 1.1:2006 年(RFC 4346)
 - TLS 1.2:2008 年(RFC 5246)
 - TLS 1.3:2018 年(RFC 8446)
 
6.1:SSL/TLS 工作在哪一层

6.2:TLS 1.2 的连接
TLS 1.2 的连接(ECDHE 密钥交换算法)大概有 10 大步骤。
下图中省略了中间产生的一些 ACK 确认。

6.2.1:Client Hello
- TLS 的版本号
 - 支持的加密组件(Cipher Suite)列表
加密组件是指所使用的加密算法及密钥长度等 - 一个随机数(Client Random)
 

6.2.2:Server Hello
- TLS 的版本号
 - 选择的加密组件
是从接收到的客户端加密组件列表中挑选出来的 - 一个随机数(Server Random)
 

6.2.3:Certificate
- 服务器的公钥证书(被 CA 签名过的)
 

6.2.4:Server Key Exchange
- 用以实现 ECDHE 算法的其中一个参数(Server Params)
ECDHE 是一种密钥交换算法
为了防止伪造,Server Params 经过了服务器私钥签名 

6.2.5:Server Hello Done
- 告知客户端:协商部分结束
 

到目前为止,客户端和服务器之间通过明文共享了:
- Client Random
 - Server Random
 - Server Params
 
而且,客户端也已经拿到了服务器的公钥证书,接下来,客户端会验证证书的真实有效性。
6.2.6:Client Key Exchange
- 用以实现 ECDHE 算法的另一个参数(Client Params)
 

目前为止,客户端和服务器都拥有了 ECDHE 算法需要的 2 个参数:
- Server Params
 - Client Params
 
客户端、服务器都可以使用 ECDHE 算法根据 Server Params、Client Params 计算出一个新的随机密钥串:Pre-master secret。
然后结合 Client Random、Server Random、Pre-master secret 生成一个主密钥。
最后利用主密钥衍生出其他密钥:客户端发送用的会话密钥、服务器发送用的会话密钥等。
6.2.7:Change Cipher Spec
- 告知服务器:之后的通信会采用计算出来的会话密钥进行加密
 

6.2.8:Finished(Client)
- 包含连接至今全部报文的整体校验值(摘要),加密之后发送给服务器
 - 这次握手协商是否成功,要以服务器是否能够正确解密该报文作为判定标准
 

6.2.9:Change Cipher Spec

6.2.10:Finished(Server)
- 到此为止,客户端服务器都验证加密解密没问题,握手正式结束
 - 后面开始传输加密的 HTTP 请求和响应
 

6.3:OpenSSL
OpenSSL 是 SSL/TLS 协议的开源实现,始于 1998 年,支持 Windows、Mac、Linux 等平台。
官网:https://www.openssl.org/
Linux、Mac 一般自带 OpenSSL。
Windows 下载安装 OpenSSL:https://www.openssl.org/source/
常用命令:
生成私钥:
 openssl genrsa -out my.key
生成公钥:
 openssl rsa -in my.key -pubout -out my.pem
可以使用 OpenSSL 构建一套属于自己的 CA,自己给自己颁发证书,称为 “ 自签名证书 ”。
除此以外,一个生成免费证书的网站:https://freessl.org
人生如逆旅,我亦是行人。
——《临江仙 · 送钱穆父》(宋)苏轼
相关文章:
《网络协议》06. HTTP 补充 · HTTPS · SSL/TLS
title: 《网络协议》06. HTTP 补充 HTTPS SSL/TLS date: 2022-10-06 18:09:55 updated: 2023-11-15 07:53:52 categories: 学习记录:网络协议 excerpt: HTTP/1.1 协议的不足、HTTP/2、HTTP/3、HTTP 协议的安全问题、SPDY、HTTPS、SSL/TLS、OpenSSL。 comments: fa…...
Python winreg将cmd/PowerShell(管理员)添加到右键菜单
效果 1. 脚本 用管理员权限运行,重复执行会起到覆盖效果(根据sub_key)。 icon自己设置。text可以自定义。sub_key可以改但不推荐(避免改成和系统已有项冲突的)。command不要改。 from winreg import *registry r&q…...
redis运维(九)字符串(二)字符串过期时间
一 字符串过期时间 细节点: 注意命令的入参和返回值 ① 再谈过期时间 说明: 设置key的同时并且设置过期时间,是一个原子操作 ② ttl 检查过期时间 ③ persist 删除过期时间 ④ redis 删除过期key的机制 ⑤ 惰性删除 惰性理解:让过期…...
【C++】多线程的学习笔记(3)——白话文版(bushi
前言 好久没有继续写博客了,原因就是去沉淀了一下偷懒了一下 现在在学网络编程,c的多线程也还在学 这一变博客就讲讲c中的Condition Variable库吧 Condition Variable的简介 官方原文解释 翻译就是 条件变量是一个对象,它能够阻止调用…...
kotlin--3.集合操作
目录 一.list集合 二.Set集合 三.Map集合 迭代遍历Map集合: 8.hashMap 四.Stream流 1.map 2.filter 3.reduce 4.forEach 5.sorted 6.distinct 7.综合案例 一.list集合 在Kotlin中,常见的List集合类型有以下几种: listOf&…...
自动驾驶-BEV感知综述
BEV感知综述 随着自动驾驶传感器配置多模态化、多源化,将多源信息在unified View下表达变得更加关键。BEV视角下构建的local map对于多源信息融合及理解更加直观简洁,同时对于后续规划控制模块任务的开展也更为方便。BEV感知的核心问题是: …...
面试题-3
1.说一下原型链 原型就是一个普通对象,它是为构造函数实例共享属性和方法,所有实例中引用原型都是同一个对象 使用prototype可以把方法挂载在原型上,内存值保存一致 _proto_可以理解为指针,实例对象中的属性,指向了构造函数的原型(prototype) 2.new操…...
C++ Core Guidelines 中文版 GSL
C GSL(Guideline Support Library)是由 Microsoft 开发的一个开源库,旨在提供一组通用的 C 标准库扩展,以支持 C 标准委员会提出的指导原则。GSL 为 C 开发人员提供了许多有用的工具和类型,以帮助他们编写更安全、更高…...
同时显示上下两层凸包特征的可视化程序
数据类型 std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> hulls_k_upper std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> hulls_k_lower std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> hulls_underk_upper std::vector<…...
Django框架之模型层(二)
【十二】Django中如何开启事务 事务是MySQL数据库中得一个重要概念 事务的目的:为了保证多个SQL语句执行成功,执行失败,前后保持一致,保证数据安全 【1】ACID是数据库事务的四个关键特性 它代表了原子性(Atomicity)、…...
C++之list
C之list list的构造 #include <iostream> #include<list> using namespace std;//打印函数 void printfList(const list<int>&L) {for(list<int>::const_iterator it L.begin();it ! L.end();it){cout<<*it<<" ";}cout<…...
C语言日记——调试篇
一、调试调试的基本步骤 发现程序错误的存在 以隔离、消除等方式对错误进行定位 确定错误产生的原因 提出纠正错误的解决办法 对程序错误予以改正,重新测试 二、Debug和Release Debug通常称为调试版本,它包含调试信息,并且不作任何优化…...
【python】Django——templates模板、静态文件、django模板语法、请求和响应
笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ 【Django专栏】 Django——django简介、django安装、创建项目、快速上手 Django——templates模板、静态文件、django模板语法、请求和响应 Django——连接mysql数据库 Django——templates模板、静态文件、djang…...
Android设计模式--观察者模式
时间是一只藏在黑暗中温柔的手,在你一出神一恍惚之间,物走星移 一,定义 观察者模式是定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新 字面意思很好理解&am…...
【Linux】Ubuntu16.04下安装python高版本--源码安装
Ubuntu16.04下完美安装python高版本及对应版本的pip 方法一:直接用命令安装python3.6(但我没安装成功) 好像是因为Ubuntu16.04的软件仓库(源)中python的最高版本就是python3.5,所以无法直接用apt来安装 #方法一 sudo…...
变长子网划分问题的二叉树解法
计网的变长子网划分、计组的变长操作码划分、数据结构的哈夫曼编码,都是前缀编码的本质(变长操作码的二叉树解法我还在琢磨中) 【二叉树解法】每条从叶结点到根节点的路径上有且只有一个被分配的结点: 【例】现将一个IP网络划分成…...
编译安装redis及配置多实例
yum安装是这种十分简单的方法我们就不在提及了,今天我们来做一下redis的编译安装 Redis源码包官方下载链接:http://download.redis.io/releases/ 一、编译安装: 安装依赖包 dnf -y install make gcc jemalloc-devel systemd-devel如果是…...
网络(一)总纲
一 总纲 ① 背景 1、该资料不管是在华为内部还是外部都是很出名的2、该教程仅仅作为个人笔记,形成自己的网络知识体系,自己会按照教程手把手做实验,copy图谱备注: 自己没有处理过物理网和虚拟网,所以会以一个小白的角度去理解,可能存在偏差3、立足点:…...
WPF中的App类介绍
在WPF (Windows Presentation Foundation) 应用程序中,App 类扮演着很重要的角色。这个类通常在每个WPF应用程序中都会有,并且生成在App.xaml文件和其代码后台App.xaml.cs中。App类通常继承自System.Windows.Application类,并且有以下的主要职…...
.nc格式文件的显示及特殊裁剪方式
最近我们遇到一个nc格式的文件,需要将它做成报告插图,bing搜索一番以后,了解到nc的全名为NetCDF(network Common Data Form),是一种网络通用数据格式,广泛用于大气科学、水文、海洋学、环境模拟、地球物理等诸多领域。…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...
在Spring Boot中集成RabbitMQ的完整指南
前言 在现代微服务架构中,消息队列(Message Queue)是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个流行的消息中间件,支持多种消息协议,具有高可靠性和可扩展性。 本博客将详细介绍如何在 Spring Boot 项目…...
