HTTP3原理解析和实战应用

http协议原理解析

HTTP1.1改动

keeplive

在http1.0版本中http连接会在每次请求都会发起连接, 并且每次连接在保证安全性都需要建立三次握手, 每次请求后就立即断开连接, 下次请求就还需要重新建立连接.这样就提升了请求的复杂度.

keeplive就使得每次建立连接后可以多次请求.

pipelining

改动点就是串行请求改为支持并发请求, 具体可以并发多少个连接是由浏览器决定, 一般情况下最多并发6个连接, 可以一定程度节省时间, 但是会占用一定的资源.

HTTP2.0改动

二进制帧

1.1每一行有对应的明确信息, 表示分别是什么数据. 到2.0时对应的请求是发送的二进制帧数据(二进制帧还可以进行压缩).

一个连接可以理解为一个通道, 流就是在这个这个通道上划分的车道, 数据包就是通行的车辆, 在不同的车道上可以并行的通过一个通道传输.通过streamid进行区分.

流可以粗略的理解成一个请求, 多个请求可以同时在一个连接上进行发送.

流优先级、流依赖问题

有些业务为什么从HTTP1.1更新到HTTP2.0之后反而变慢了?

流优先级: 比如请求一个网站需要发同时100个请求, 服务端会有一个优先级的过程, 流的优先级是业务层定义的. 如果业务层定义的不是很合理, 那么就会导致有些资源会一直在blocking的状态. 只有在处理好优先级更高的资源之后才会处理优先级低的. 优先级低的一直那不到回应就会等的时间很长.

流依赖: 一条流会依赖另外一条流, 比如请求1拿到资源, 但是必须依赖请求0拿到资源之后才能进行处理, 如果依赖的资源很慢那么当前流的处理就也会很慢.

队头阻塞问题

TCP有一个特点, 必须保证有序性.

如果Request1的数据先发送Request2后发送, 但是Request1中的包有丢失的, Request2包已经达到了客户端, 这时也不能交付给上层业务, 只有等丢失的包重传之后才会交付给上层业务.

所以HTTP2中一个流的包丢了会影响一个连接中所有流的数据包.

适合哪些场景

  • 使用服务器推送数据
  • 网路质量好, 丢包率低的场景
  • 并发量比较大, 小资源比较多
  • 有明显的优先级或互相依赖的请求(如果优先级不明确不好界定, 那么可能效果达不到很好的效果)

HTTP3.0

HTTP/2和HTTP/3对比

从HTTP2.0中的请求流程可以看出, 为了一个1RTT的请求数据前面需要建立1个DNS+4RTT的流程才能拿到相应.

HTTP2.0 和 HTTP3.0 协议对比

实际上就是在UDP的基础上将TCP的可靠性和TLS1.3融合进来实现QUIC协议, QUIC协议是在用户态. QUIC虽然实现是在用户态, 但是还是认为QUIC协议是一个传输层协议, 因为它的功能主要还是在传输数据.

HTTP3.0才是应用层的协议.

HTTP/3的核心在于QUIC协议

事实上, 我们并不是真的需要新的HTTP版本, 而是需要对底层的传输协议(TCP)进行升级.

quic协议原理

此处为语雀内容卡片,点击链接查看:https://www.yuque.com/yyqcy/rmskr5/mlfnzath422xlkmo

0RTT握手

连接迁移

更优秀的拥塞控制算法

quic中丢包重传包的序号是单调递增的, 而TCP中的丢包重传包序号是不变的.

TCP中因为包序号是不变的, 那么重传的包和延时的包都收到后, 就不知道哪一个是开始的包, 不知道哪一个是后来的, 这样就会出现重传包的二义性. 重传包的二义性直接导致RTT计算不准确.从而影响拥塞控制算法.

两级流量控制

QUIC的滑动窗口的大小仅仅由可用窗口来决定, 不会受到丢包的影响. 只要可用窗口还有就能够发数据和接收数据.

协议竞速

业内统计数据全球有7%地区的运营商对UDP有限速或者禁闭,除了运营商还有很多企业、公共场合也会限制UDP流量甚至禁用UDP。这对使用UDP来承载QUIC协议的场景会带来致命的伤害。

对此,可以采用多路竞速的方式使用TCP和QUIC同时建连。除了在建连进行竞速以外,还可以对网络QUIC和TCP的传输延吋进行实时监控和对比,如果有链路对UDP进行了限速,可以动态从QUIC切换到TCP

性能效果

通过弱网实验测试,QUIC在开启O-RTT时,其延迟要比HTTP降低20%,比HTTPS要降低50%以上。

应用场景

  • 连接复用率低: 连接迁移的场景
  • 小文件下载场景
  • RTT比较长, 丢包率较高(弱网环境)
  • 必须要加密传输
  • 非特别敏感业务(UDP安全性可能存在问题)
  • 连接迁移强需求(语音业务: 语音助手)

代码实现

  • 基于netty实现的示例: https://github.com/kvenLin/my-http3

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

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

相关文章

【分布式理论9】分布式协同:分布式系统进程互斥与互斥算法

文章目录 一、互斥问题及分布式系统的特性二、分布式互斥算法1. 集中互斥算法调用流程优缺点 2. 基于许可的互斥算法(Lamport 算法)调用流程优缺点 3. 令牌环互斥算法调用流程优缺点 三、三种算法对比 在分布式系统中,多个应用服务可能会同时…

VMware Windows_10_x64 安装 VM Tools 后无法将本机文件复制到虚拟机

有一种情况,安装VM Tools死活安装不上去。这时不要急不要慌,重启本机就好了(本人情况就是如此)。 windows键 R 输入 service.msc 打开服务管理器 找到Virtual Disk服务,选择属性设置为自动,应用后启用服…

uniapp 编译生成鸿蒙正式app步骤

1,在最新版本DevEco-Studio工具新建一个空项目并生成p12和csr文件(构建-生成私钥和证书请求文件) 2,华为开发者平台 根据上面生成的csr文件新增cer和p7b文件,分发布和测试 3,在最新版本DevEco-Studio工具 文…

AI+智能中台企业架构设计_重新定义制造(46页PPT)

本文档主要探讨了“中台”的概念及其在制造领域的应用,通过百度中台技术案例,展示了如何利用ABCIOT(人工智能、大数据、云计算和物联网)重新定义制造业。中台被定义为企业内部核心管理平台,包括微服务业务平台、组织创…

基于Java的分布式系统架构设计与实现

Java在大数据处理中的应用:基于Java的分布式系统架构设计与实现 随着大数据时代的到来,数据处理的规模和复杂性不断增加。为了高效处理海量数据,分布式系统成为了必不可少的架构之一。而Java,凭借其平台独立性、丰富的生态系统以…

MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 基础篇 part 11

第11章_数据处理之增删改 首先得先有一个表: #0. 储备工作 USE atguigudb;CREATE TABLE IF NOT EXISTS emp1( id INT, name VARCHAR(15), hire_date DATE, salary DOUBLE(10,2) );DESC emp1;SELECT * FROM emp1; 1.增加数据 #方式1:一条一条的添加…

Java多线程——线程池的使用

线程饥饿死锁 在单线程的Executor中,如果任务A将任务B提交给同一个Executor,并且等待任务B的结果,就会引发死锁线程池中所有正在执行任务的线程由于等待其他仍处于工作队列中的任务而阻塞 执行时间较长的任务 执行时间较长的任务不仅会造成…

通过C模块中的Python API访问数组的数组

在 C 模块中通过 Python API 访问数组的数组(即多维数组)涉及到使用 Python C API 来处理 Python 对象和数据结构。在 C 代码中访问这种数据结构时,我们可以使用 Python 的对象访问方式,例如 PyList 或 PyArray(如果你…

【IDEA】2017版本的使用

目录 一、常识 二、安装 1. 下载IDEA2017.exe 2. 安装教程 三、基本配置 1. 自动更新关掉 2. 整合JDK环境 3. 隐藏.idea文件夹和.iml等文件 四、创建Java工程 1. 新建项目 2. 创建包结构,创建类,编写main主函数,在控制台输出内容。…

物联网智能语音控制灯光系统设计与实现

背景 随着物联网技术的蓬勃发展,智能家居逐渐成为现代生活的一部分。在众多智能家居应用中,智能灯光控制系统尤为重要。通过语音控制和自动调节灯光,用户可以更便捷地操作家中的照明设备,提高生活的舒适度与便利性。本文将介绍一…

利用HTML和css技术编写学校官网页面

目录 一,图例展示 二,代码说明 1,html部分: 【第一张图片】 【第二张图片】 【第三张图片】 2,css部分: 【第一张图片】 【第二张图片】 【第三张图片】 三,程序代码 一,…

学习笔记十九:K8S生成pod过程

K8S生成pod过程 流程图具体生成过程用户提交 Pod 定义API Server 处理请求调度器分配节点(Scheduling)目标节点上的 Pod 创建网络配置状态上报与监控控制器管理(Controller Manager)就绪与服务发现 关键错误场景高级特性 流程图 具…

(一)Axure制作移动端登录页面

你知道如何利用Axure制作移动端登录页面吗?Axure除了可以制作Web端页面,移动端也是可以的哦,下面我们就一起来看一下Axure制作移动端登录页面的过程吧。 第一步:从元件中拖入一个矩形框,并设置其尺寸为:37…

【C++】——精细化哈希表架构:理论与实践的综合分析

先找出你的能力在哪里,然后再决定你是谁。 —— 塔拉韦斯特弗 《你当像鸟飞往你的山》 目录 1. C 与哈希表:核心概念与引入 2. 哈希表的底层机制:原理与挑战 2.1 核心功能解析:效率与灵活性的平衡 2.2 哈希冲突的本质&#x…

第5章 数据库系统(选择|案例|论文)(重点★★★★★)

5.1 数据库管理系统1 数据库是长期存储在计算机内的、有组织的、可共享的数据集合,数据库系统是指在计算机信息系统中引入数据库后的系统,一般由数据库、数据库管理系统 (DataBaseManagement System,DBMS)、应用系统、数据库管理员(DataBase…

jenkins备份还原配置文件

下载ThinBackup插件 方式1 从插件市场直接下载 Manage Jenkins->Manage Plugins->可选插件搜索 注意:有时可能因为网络或者版本问题下载不了,好像是默认下载最新版本,可选择手动安装! 方式二 手动安装插件 点击查看手…

Vue笔记(八)

一、Pinia (一)手动添加Piaia到Vue项目 1.安装Pinia:使用包管理器进行安装,在项目目录下运行 npm install pinia 或 yarn add pinia ,为项目引入Pinia状态管理库。 2.创建Pinia实例:在项目的JavaScript代…

vue纯静态实现 视频转GIF 功能(附源码)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、实现后的效果二、使用步骤1.引入库2.下载or复制出来js3. 前端实现 总结 前言 一天一个小demo 今天来一个vue纯静态实现 视频转GIF 功能 上一篇我们讲到了…

嵌入式八股文面试题(二)C语言算法

相关概念请查看文章&#xff1a;C语言概念。 1. 如何实现一个简单的内存池&#xff1f; 简单实现&#xff1a; #include <stdio.h> #include <stdlib.h>//内存块 typedef struct MemoryBlock {void *data; // 内存块起始地址struct MemoryBlock *next; // 下一个内…

【Python】集合

个人主页&#xff1a;GUIQU. 归属专栏&#xff1a;Python 文章目录 1. 集合的创建2. 集合的基本操作2.1 访问集合元素2.2 添加元素2.3 删除元素 3. 集合的数学运算3.1 交集&#xff08;& 或 intersection() 方法&#xff09;3.2 并集&#xff08;| 或 union() 方法&#xf…