初识——HTTP3

想了解HTTP3??那我们就得先知道为啥会出现HTTP3,因此我们需要知道HTTP1.0,HTTP1.1,HTTP2及HTTP3的演变过程。

HTTP

HTTP 是超⽂本传输协议,也就是HyperText Transfer Protocol。

HTTP 端⼝号:80

HTTP 由于是明⽂传输,所以安全上存在以下三个⻛险: 窃听⻛险, 篡改⻛险,冒充⻛险。

HTTP1.0和HTTP1.1的主要区别

长连接

HTTP 1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而HTTP1.1默认支持长连接。

节约带宽

HTTP 1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,否则返回401。客户端如果接受到100,才开始把请求body发送到服务器。

这样当服务器返回401的时候,客户端就可以不用发送请求body了,节约了带宽。

另外HTTP还支持传送内容的一部分。这样当客户端已经有一部分的资源后,只需要跟服务器请求另外的部分资源即可。这是支持文件断点续传的基础。

HOST域

现在可以web server例如tomat,设置虚拟站点是非常常见的,也即是说,web server上的多个虚拟站点可以共享同一个ip和端口。

HTTP1.0是没有host域的,HTTP1.1才支持这个参数

HTTP1.1 相比 HTTP1.0 性能上的改进:

使⽤ TCP ⻓连接的⽅式改善了 HTTP1.0 短连接造成的性能开销。

⽀持管道(pipeline)⽹络传输,只要第⼀个请求发出去了,不必等其回来,就可以发第⼆个请求出去,可以 减少整体的响应时间。

但 HTTP1.1 还是有性能瓶颈:

  1. 请求响应头部(Header)未经压缩就发送,⾸部信息越多延迟越⼤。只能压缩 Body 的部分;

  2. 发送冗⻓的⾸部。每次互相发送相同的⾸部造成的浪费较多;

  3. 服务器是按请求的顺序响应的,如果服务器响应慢,会招致客户端⼀直请求不到数据,也就是队头阻塞

    管道( pipeline)传输中如果有⼀个请求阻塞了,那么队列后请求也统统被阻塞住了

  4. 没有请求优先级控制;

  5. 请求只能从客户端开始,服务器只能被动响应。

根据HTTP1.1 的性能瓶颈,HTTP2 做了什么优化?

HTTP2

HTTP2 协议是基于 HTTPS 的,所以 HTTP2 的安全性也是有保障的。

那 HTTP2 相⽐ HTTP1.1 性能上的改进:

  1. 头部压缩

HTTP2 会压缩头(Header)如果你同时发出多个请求,他们的头是⼀样的或是相似的,那么,协议会帮你消除重复的部分。

这就是所谓的 HPACK算法:在客户端和服务器同时维护⼀张头信息表,所有字段都会存⼊这个表,⽣成⼀个索 引号,以后就不发送同样字段了,只发送索引号,这样就提⾼速度了。

  1. ⼆进制格式

HTTP2 不再像 HTTP1.1⾥的纯⽂本形式的报⽂,⽽是全⾯采⽤了⼆进制格式,头信息和数据体都是⼆进制,并 且统称为帧(frame):头信息帧和数据帧。

这样虽然对⼈不友好,但是对计算机⾮常友好,因为计算机只懂⼆进制,那么收到报⽂后,⽆需再将明⽂的报⽂转 成⼆进制,⽽是直接解析⼆进制报⽂,这增加了数据传输的效率

  1. 数据流

HTTP2 的数据包不是按顺序发送的,同⼀个连接⾥⾯连续的数据包,可能属于不同的回应。因此,必须要对数据包做标记,指出它属于哪个回应。每个请求或回应的所有数据包,称为⼀个数据流( Stream )。

每个数据流都标记着⼀个独⼀⽆⼆的编号,其中规定客户端发出的数据流编号为奇数,服务器发出的数据流编号为偶数。

客户端还可以指定数据流的优先级。优先级⾼的请求,服务器就先响应该请求

  1. 多路复⽤

HTTP2是可以在⼀个连接中并发多个请求或回应,⽽不⽤按照顺序⼀⼀对应

移除了 HTTP1.1中的串⾏请求,不需要排队等待,也就不会再出现「队头阻塞」问题,降低了延迟,⼤幅度提⾼了连接的利⽤率。

举例来说,在⼀个 TCP 连接⾥,服务器收到了客户端 A 和 B 的两个请求,如果发现 A 处理过程⾮常耗时,于是就 回应 A 请求已经处理好的部分,接着回应 B 请求,完成后,再回应 A 请求剩下的部分。

  1. 务器推送

HTTP2还在⼀定程度上改善了传统的「请求 - 应答」⼯作模式,服务不再是被动地响应,也可以主动向客户端发 送消息。

举例来说,在浏览器刚请求 HTML 的时候,就提前把可能会⽤到的 JS、CSS ⽂件等静态资源主动发给客户端,减 少延时的等待,也就是服务器推送Server Push,也叫 Cache Push)。

HTTP2 也存在缺陷

HTTP2多个请求复⽤⼀个TCP连接,⼀旦发⽣丢包, 就会触发 TCP 的重传机制 ,⼀个 TCP 连接中的所有的 HTTP 请求都必须等待这个丢了的包被重传回来。 ,就会阻塞住所有的 HTTP 请求。

因此HTTP2也是存在阻塞的问题,那么HTTP3是不是就来解决阻塞问题的呢??

HTTP3

HTTP3把 HTTP 下层的 TCP 协议改成了 UDP!

我们都知道 UDP 发⽣是不管顺序,也不管丢包的,所以不会出现 HTTP1.1 的队头阻塞 和 HTTP2 的⼀个丢包全部重传问题。

众所周知UDP是不可靠传输,那HTTP3怎么做到可靠的呢???

UDP是不可靠传输的,但基于UDP的 QUIC 协议( 基于UDP的低时延的互联网传输层协议 ) 可以实现类似 TCP 的可靠性传输。

QUIC (Quick UDP Internet Connection) 在应用程序层面(应用层) 实现了 TCP 的可靠性,TLS 的安全性和 HTTP2 的并发性,只需要用户端和服务端的应用程序支持 QUIC 协议,完全避开了操作系统和中间设备的限制。

用一个等式来描述就是 QUIC = UDP + TLS + HTTP2

什么是操作系统和中间设备的限制??????

TCP是在操作系统内核和中间设备固件中实现的。要对TCP进行大更改,就必须要通信双方升级操作系统,中间设备更新固件,部署成本非常高。

通过QUIC改进拥塞控制体现在哪几个方面??

  1. QUIC在应用层即可实现不同的拥塞控制算法,不需要改操作系统和内核。
  2. 单个程序的不同连接也能支持配置不同的拥塞控制。这样我们就可以给不同的用户提供更好的拥塞控制。
  3. 应用程序变更拥塞控制,甚至不需要停机和升级。
  4. QUIC还有带宽预测,RTT监控,发送速率调整等高级算法支持。

扩展几点:

  • QUIC 有⾃⼰的⼀套机制可以保证传输的可靠性的。当某个流发⽣丢包时,只会阻塞这个流,其他流不会受到影响。
  • TLS3 升级成了最新的 1.3 版本,头部压缩算法也升级成了 QPack 。
  • HTTPS 要建⽴⼀个连接,要花费 6 次交互,先是建⽴三次握⼿,然后是 TLS/1.3 的三次握⼿。QUIC 直接 把以往的 TCP 和 TLS/1.36 次交互合并成了 3 次,减少了交互次数。

相关链接

文章只是简单的就HTTP1.1和HTTP2共同的一个阻塞问题来讨论HTTP3是如何改进优化的。虽然觉得HTTP3很好,但是现在还未得到普遍使用。如果对HTTP3感兴趣可以看下面的相关链接,讲解更深入。

科普:QUIC协议原理分析

QUIC网络协议简介

初识——HTTP3的更多相关文章

  1. Android动画效果之初识Property Animation(属性动画)

    前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...

  2. 初识Hadoop

    第一部分:              初识Hadoop 一.             谁说大象不能跳舞 业务数据越来越多,用关系型数据库来存储和处理数据越来越感觉吃力,一个查询或者一个导出,要执行很长 ...

  3. python学习笔记(基础四:模块初识、pyc和PyCodeObject是什么)

    一.模块初识(一) 模块,也叫库.库有标准库第三方库. 注意事项:文件名不能和导入的模块名相同 1. sys模块 import sys print(sys.path) #打印环境变量 print(sy ...

  4. 初识IOS,Label控件的应用。

    初识IOS,Label控件的应用. // // ViewController.m // Gua.test // // Created by 郭美男 on 16/5/31. // Copyright © ...

  5. UI篇(初识君面)

    我们的APP要想吸引用户,就要把UI(脸蛋)搞漂亮一点.毕竟好的外貌是增进人际关系的第一步,我们程序员看到一个APP时,第一眼就是看这个软件的功能,不去关心界面是否漂亮,看到好的程序会说"我 ...

  6. Python导出Excel为Lua/Json/Xml实例教程(一):初识Python

    Python导出Excel为Lua/Json/Xml实例教程(一):初识Python 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出 ...

  7. 初识SpringMvc

    初识SpringMvc springMvc简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 s ...

  8. 初识redis数据类型

    初识redis数据类型 1.String(字符串) string是redis最基本的类型,一个key对应一个value. string类型是二进制安全的.意思是redis的string可以包含任何数据 ...

  9. Redis初识、设计思想与一些学习资源推荐

    一.Redis简介 1.什么是Redis Redis 是一个开源的使用ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的API.从2010 年 ...

随机推荐

  1. 如何在 Qt Creator 中应用 one dark pro 主题

    前言 Qt Creator 自带了几款主题,但是并不好看.在博客 <Qt Creator打造VScode one dark pro主题配色> 中给出了 one dark pro 主题的配置 ...

  2. bom-client

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. synchronize类锁用父类作为锁能否锁住代码块

    如果有一个父类,Demo如下 public class Demo { public void demo1(){ synchronized (Demo.class){ while (true){ Sys ...

  4. kubernetes基础——1.基本概念

    一.kubernetes特性 自动装箱,自我修复,水平扩展,服务发现和负载均衡,自动发布和回滚,密钥和配置管理,存储编排,批量处理执行. 二.kubernetes cluster Masters * ...

  5. 微服务技术栈简单介绍,Eureka和Ribbon的引入和使用

    一.了解微服务架构 1.微服务技术栈 整体框架 整体学习规划路线2.微服务与单体架构的区别 单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署 优势 结构简单 部署成本低 缺点 耦合度高, ...

  6. 剑指Offer系列_30_包含min函数的栈

    以空间换时间: package leetcode.sword_to_offfer.day01; import java.util.Stack; /** * 定义栈的数据结构,请在该类型中实现一个能够得 ...

  7. vue从后台拿数据渲染页面图片

    <div class="list-content"> <div v-for="goods in goodsList" class=" ...

  8. [LeetCode]1464. 数组中两元素的最大乘积

    给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[i]-1)*(nums[j]-1) 取得最大值. 请你计算并返回该式的最大值. 示例 1: 输入:nums = [3 ...

  9. 浅谈C#字符串构建利器StringBuilder

    前言 在日常的开发中StringBuilder大家肯定都有用过,甚至用的很多.毕竟大家都知道一个不成文的规范,当需要高频的大量的构建字符串的时候StringBuilder的性能是要高于直接对字符串进行 ...

  10. 软件性能测试分析与调优实践之路-Java应用程序的性能分析与调优-手稿节选

    Java编程语言自从诞生起,就成为了一门非常流行的编程语言,覆盖了互联网.安卓应用.后端应用.大数据等很多技术领域,因此Java应用程序的性能分析和调优也是一门非常重要的课题.Java应用程序的性能直 ...