第二十六期:HTTP 3的前世今生及尝鲜

HTTP/3又迎来一个里程碑:近日Cloudflare官方宣其边缘网络上已全面提供QUIC和HTTP/3支持。那么HTTP/3可以带来哪些变化和优势呢? 对Internet的用户,并且通过浏览器和其他客户端与站点进行高效交互。

 

HTTP/3又迎来一个里程碑:近日Cloudflare官方宣其边缘网络上已全面提供QUIC和HTTP/3支持。那么HTTP/3可以带来哪些变化和优势呢? 对Internet的用户,并且通过浏览器和其他客户端与站点进行高效交互。可通过使用最新Chrome Canary浏览器以HTTP/3 UDB协议和服务器交互,对于使用命令行客户端的人,最新版本的curl也提供了对HTTP/3的支持。本文虫虫将介绍HTTP/3的发展历程,以及用户如何启用HTTP 3,如何通过浏览器Chrome及命令行客户端curl使用HTTP 3。

HTTP发展历程

首先,我们先来介绍下HTTP多年来的发展,以便更好地理解HTTP/3。

HTTP/1.0

HTTP协议源于1996年,在这一年发布了HTTP/1.0规范(0.x版本忽略),该规范定义了我们今天常见的基本HTTP文本规格定义。在HTTP/1.0中定义了客户端和服务器之间的每个请求/响应交换都要创建一个新的TCP连接,所以在进行每个请求均需大家熟知的"三次握手,四次挥手"的历程,因此请求难免会产生延迟。比如一个典型的HTTP/TLS过程,图解如下:

HTTP 3的前世今生及尝鲜

而且,为了避免将无法处理的数据包泛洪到网络中,TCP协议对建立的连接使用使用了一种称为"慢启动"的预热暂缓期用来给TCP堵塞控制算法确定可以传输的数据量,而不是在建立连接后尽快发送所有未完成的数据。由于每一个新连接都必须经过这个缓慢的启动过程,这也成了网络性能的一个瓶颈。

HTTP/1.1 keep-alive

随之而来的的HTTP/1.1版本中引入"keep-alive(保活)"连接的方法来解决这些问题。通过保活技术,可以让客户端重用TCP连接,而不需要每次都重新建立TCP连接,从而解决初始连接建立和缓慢连接的问题。但这并不能从实质上解决问题,尽管多个请求可以共享同一个连接,但是仍然必须一个接一个地序列化它们,因此客户端和服务器只能在任何给定时间为每个连接执行一次请求/响应交换。

随着网络和Web技术的发展,每个网站所需的资源(CSS,JS脚本,图片,视频等)的增加,浏览器在获取和渲染呈现网页时对并发性的需要越来越迫切。但是,由于HTTP/1.1只允许客户端每次只能进行一个HTTP请求/响应交换,因此在网络层上获得并发性的唯一方法是并行使用多个TCP连接,这样一来就无法享受保活技术带来的好处。

HTTP/2 SPDY

又过了十多年后,出现了SPDY,然后是HTTP/2规范。它首先引入了HTTP流的概念。通抽象HTTP实现将不同的HTTP交换并发地复用到同一个TCP连接上,浏览器可以更有效地重用TCP连接。

HTTP 3的前世今生及尝鲜

HTTP/2解决了单个TCP连接的使用效率低的问题,可以通过同一连接同时传输多个请求/响应。但是如果传输中发生数据丢包,即使丢失的数据仅涉及单个请求,所有请求和响应也同样会受到数据包丢失的影响而需要重传。因为尽管HTTP/2可以在不同的流上隔离不同的HTTP交换,但是底层的TCP并无法对他们进行区别,TCP能看到的只是没有任何标志的字节流。

TCP的作用是以正确的顺序从一个端点到另一端点传递整个字节流。当承载某些字节的TCP数据包在网络路径上丢失时,它将在流中造成间隙,并且TCP需要在检测到丢失时通过重新发送受影响的数据包来填充它。这样即使丢失此后没有丢失并且属于完全独立的HTTP请求,也不能将数据包后的已成功传输的数据包传递给应用层。因此,最终会导致他们也会产生不必要的延迟。这个问题被称为TCP head-of-line blocking (TCP队头阻塞)。

HTTP 3的前世今生及尝鲜

为了解决队头阻塞问题,HTTP/2中也引入了多路复用(Multiplexing)技术,将TCP流可以传输的数据分为若干消息,每个消息再划分为最小的二进制帧组成,这样即使一个请求被阻塞了,也不会影响其他请求,如上图中第四种情况所示。

HTTP/3 QUIC

当然这些改良TCP的方案都只能部分解决问题,为了彻底从根解决问题。那就需要彻底更换底层的TCP协议,这就是谷歌多年探索的基于UDP的QUIC协议,这也是HTTP/3的基础。QUIC协议中在传输层将数据流作为基本,QUIC流共享相同的QUIC连接,需要额外的握手和慢启动来创建新的QUIC流,通过底层使用UDP协议以及将QUIC数据包封装在UDP数据报的顶部,实现QUIC流的独立交付。因此在大多数情况下,影响一个流的丢包不会影响其他流。

与TCP相比,使用UDP可以提供更大的灵活性,并且可以使QUIC实现完全存在于用户空间中。协议实现的更新不再依赖于操作系统更新。借助QUIC,可以将HTTP级别的流简单地映射为QUIC流的头,从而继承HTTP/2的所有好处,而不会产生队头阻塞问题。

HTTP 3的前世今生及尝鲜

QUIC还结合了典型的3次TCP握手和TLS 1.3的握手。这样默认情况就可以提供加密和身份验证,并且加速连接的建立。就算HTTP会话中的初始请求需要新的QUIC连接,在数据开始流动之前所引起的等待时间也较低。

HTTP 3的前世今生及尝鲜

HTTP/3的使用

HTTP/3和QUIC给我们带来开天辟地的变化,可以从根本上解决HTTP标准许久以来的许多问题和缺陷。那么我们如何立刻使用它带来的福利呢?

quiche框架

为了支持推广HTTP/3 Cloudflare使用Rust开发并开源一个HTTP/3和QUI的应用框架,而且还给该应用使用一个非常可餐的名字quiche(乳蛋饼)和logo,估计以借此吸引人们尽快品尝HTTP/3制成的美食。

HTTP 3的前世今生及尝鲜

quiche的源码托管在github上(github:/cloudflare/quiche),在clone源码后,可以通过cargo编译(注意需要rust 1.38及更新的版本,BoringSSL及其windows版本NASM):

  1. cargo build -examples 

quiche也提供了以docker为基础的实验环境包括http3-client, http3-server, 客户端和服务器端,使用方法如下:

docker编译:

  1. docker build -t cloudflare-quiche . 

进行HTTP/3请求

  1. docker run -it cloudflare-quiche http3-client Url 

网站启用

目前Cloudflare的选择性开部分放客户如已经可以通过简单手动设置启用HTTP/3功能,方法是在Cloudflare仪表板,手动在"网络"选项卡开启开关:

HTTP 3的前世今生及尝鲜

客户端使用

目前知名浏览器谷歌Chrome和Firefox都已经实验性提供对HTTP/3的支持。Chrome在Canary,Firefox将在Nightly正式正式提供支持。

HTTP 3的前世今生及尝鲜

Chrome浏览器:首先需要下载并安装最新的Canary版本。然后,通过设置以下命令行参数启动Chrome Canary:

  1. "--enable-quic"和" --quic-version = h3-23" 

然后就可以支持HTTP/3,可以通过Chrome开发人员工具中的"网络"标签页来检查使用的协议版本:

HTTP 3的前世今生及尝鲜

注意到协议类型为"http2+quic/99",这就是表示Http3。

使用curl

curl最新版7.66,也添加了对HTTP/3的实验性支持。我们可以下载编译试用,在此章中对此介绍过。

要使用HTTP/3需要使用新添加的 "--http3"标志来进行请求:

  1. curl -I URL --http3 

HTTP 3的前世今生及尝鲜

阅读目录(置顶)(长期更新计算机领域知识)https://blog.csdn.net/weixin_43392489/article/details/102380691

阅读目录(置顶)(长期更新计算机领域知识)https://blog.csdn.net/weixin_43392489/article/details/102380882

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端中标签页的手写方法

虽然流行用框架写出来 这里也可以用手写方法写出来 也并不是这么复杂 首先为了实现如下效果的标签 我们可以在前端把两个表直接输出出来 <table class "tag char" id "tagf" ><tr><td>Found</td><td>Found time</td&…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第16篇]描述DSA、Schnorr和RSA-FDH的密钥生成、签名和验证算法。

这是一系列博客文章中最新的一篇&#xff0c;文章的主题是“做密码学每个博士生都应该知道的52件事”。这一系列问题是为了让博士生们在第一年结束时了解他们应该知道的事情。本周我们将介绍DSA、Schnorr和RSA-FDH的密钥生成、签名和验证算法。 1.DSA 2.Schnorr 3.RSA-FDH Refe…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第17篇]述和比较DES和AES的轮结构

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。这周&#xff0c;我们描述和比较DES和AES轮结构。 DES和AES都是迭代分组密码的例子.分组密码通过重复使用一个…

UML用例图

统一建模语言&#xff08;Unified Modeling Language&#xff0c;UML&#xff09;又称标准建模语言&#xff0c;是始于1997年的一个OMG标准&#xff0c;它是一个支持模型化和软件系统开发的图形化语言&#xff0c;为软件开发的所有阶段提供模型化和可视化支持&#xff0c;包括由…

[剑指offer]面试题第[44]题[JAVA][数字序列中某一位的数字][找规律]

【问题描述】[中等] 【解答思路】 找规律 时间复杂度&#xff1a;O(logN) 空间复杂度&#xff1a;O(logN) class Solution {public int findNthDigit(int n) {int digit 1;long start 1;long count 9;while (n > count) { // 1.n - count;digit 1;start * 10;count di…

[Letcode]第[34]题[JAVA][在排序数组中查找元素的第一个和最后一个位置][暴力][二分]

【问题描述】[中等] 【解答思路】 1. 线性扫描&#xff08;不符合题意&#xff09; 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(1) class Solution {public int[] searchRange(int[] nums, int target) {int[] targetRange {-1, -1};// find the index of the lef…

[剑指offer]面试题第[41]题[Leetcode][第235题][JAVA][数据流中的中位数][优先队列][堆]

【问题描述】[困难] 【解答思路】 1. 思路1 时间复杂度&#xff1a;O(logN) 空间复杂度&#xff1a;O(N) import java.util.PriorityQueue;public class MedianFinder {/*** 当前大顶堆和小顶堆的元素个数之和*/private int count;private PriorityQueue<Integer> maxh…

SpingBoot+Mybaits+Vue,更新学习

1.DTO 2.实体类 3.Controller层&#xff0c;UpdatePrize/{id}为接口 4.Service层 5.Impl实现层 之后就可以更新数据了。6.Vue链接接口 7.请求&#xff0c;解析&#xff0c;返回值 8.init方法&#xff0c;初始化使用 增删查与更相仿&#xff0c;只是实现层方法不同增加实现层中的…

[剑指offer]面试题第[35]题[Leetcode][第138题][JAVA][复杂链表的复制][暴力][HashMap][复制链表]

【问题描述】[中等] 【解答思路】 1. 暴力 直接复制 将链表从头节点一个一个复制下去&#xff0c; 在根据记录的总长度num&#xff0c;遍历原来的每个节点的random到尾节点个数count&#xff0c;然后顺序遍历找到新链表的该指针在num-count上 。 时间复杂度&#xff1a;O(N^2…

第二十七期:德国工业4.0眼里“工业互联网”与“智能制造”

工业4.0在德国被认为是第四次工业革命&#xff0c;主要是指&#xff0c;在“智能工厂”利用“智能备”将“智能物料”生产成为“智能产品”&#xff0c;整个过程贯穿以“网络协同”&#xff0c;从而提升生产效率&#xff0c;缩短生产周期&#xff0c;降低生产成本。 工业4.0在德…

[剑指offer]面试题第[36]题[JAVA][二叉搜索树与双向链表][递归]

【问题描述】[中等] 【解答思路】 中序遍历 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(N) class Solution {Node pre, head;public Node treeToDoublyList(Node root) {if(root null) return null;dfs(root);head.left pre;pre.right head;return head;}void …

深度学习第一次课-数学

说明&#xff1a;本文是七月算法5月深度学习班第一次课听课笔记。只记录关键知识点&#xff0c;有些没具体展开。帮助复习用。文中使用了老师课件中的公式。 微积分 导数 定义常用函数导数导数法则加法 乘法 除法 链式法则一元函数与多元函数一阶导 一元函数 f(x) 多元函…

深度学习第三次课-梯度下降与反向传播

梯度下降 损失函数可视化 得分函数 fW*X损失函数 cW*X-y 目标 损失函数最小 最优化过程可视化 一维二维 热力图如果损失函数是一个凸函数&#xff0c;例如SVM。凸函数 正系数加和凸函数神经网络 costfunction 非凸 因为系数有正有负。凸优化与最优化…

[Leetcode][第1025题][JAVA][除数博弈][数学][递推]

【问题描述】[中等] 【解答思路】 1. 数学证明 找规律 时间复杂度&#xff1a;O(1) 空间复杂度&#xff1a;O(1) 2. 递推 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(1) class Solution {public boolean divisorGame(int N) {boolean[] f new boolean[N 5];f[1]…

[Leetcode][第410题][JAVA][分割数组的最大值][动态规划][二分]

【问题描述】[中等] 【解答思路】 1. 动态规划 第 1 步&#xff1a;设计状态 令 f[i][j] 表示将数组的前 i 个数分割为 j 段所能得到的最大连续子数组和的最小值。 &#xff08; i ≥ j &#xff09; 第 2 步&#xff1a;状态转移方程 第 3 步&#xff1a;考虑初始化 f[i][…

数据结构与算法分析

本系列的笔记基于七月算法的《求职面试》课程以及《数据结构域算法分析-java语言描述》第2版&#xff0c;做学习笔记。 以下是这系列的目录。每个专题只做笔记&#xff0c;不求每个专题都要深入到很深很深。算法分析 表 栈 队列 并查集 哈希表 树 堆 图论 递归 深度优…

[算法][算法复杂度]常用算法复杂度速查表

复杂度通常会使用大 -O记号来表示&#xff0c;比如快速排序的平均时间复杂度是 O(nlog(n))。虽然我们应该做「理解派」&#xff0c;但是即使每个算法/数据结构都理解了&#xff0c;不时仍有可能忘记具体某个算法/数据结构的复杂度&#xff08;特别是在最好、最坏和平均情形下的…

十张伟大的科学瞬间

题图&#xff1a; 搭载 ORBCOMM OG2-M1 卫星的猎鹰 9 号运载火箭发射&#xff0c;人类一直很渺小。 ▎2019 更新 北京时间 2019 年 4 月 10 日 21 点&#xff0c;人类首张黑洞照片正式发布&#xff01; 这次的直接成像除了帮助我们直接确认了黑洞的存在&#xff0c;同时也通过模…

[Leetcode][第329题][JAVA][矩阵中的最长递增路径][DFS][拓扑排序]

【问题描述】[中等] 【解答思路】 1. 记忆化深度优先搜索 复杂度 class Solution {public int[][] dirs {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};public int rows, columns;public int longestIncreasingPath(int[][] matrix) {if (matrix null || matrix.length 0 || matri…

第二十八期:阿里云VS腾讯云 谁才是中国未来的云计算之王?

阿里云早在 2009 年就已经开始布局云计算领域&#xff0c;具有先发优势。据统计&#xff0c;40% 的中国 500 强企业、近一半中国上市公司、80% 中国科技类公司是阿里云的客户。而腾讯云基于腾讯自身在游戏、视频、社交、出行等业务的强势地位&#xff0c;一路奋起直追&#xff…