网络夺命连环问8--说一下HTTP3牛币在哪里?
目录
- 说一下HTTP3牛币在哪里?
- 美中不⾜的 HTTP/2
- QUIC 协议的特点
- 在HTTP层改动
说一下HTTP3牛币在哪里?
美中不⾜的 HTTP/2
HTTP/2 通过头部压缩、⼆进制编码、多路复⽤、服务器推送等新特性⼤幅度提升了 HTTP/1.1 的性能,⽽美中不⾜的是 HTTP/2 协议是基于 TCP 实现的,于是存在的缺陷有三个。
- 队头阻塞;
( TCP 是字节流协议,TCP 层必须保证收到的字节数据是完整且有序的,如果序列号较低的 TCP 段在⽹络传输中丢失了,即使序列号较⾼的 TCP 段已经被接收了,应⽤层也⽆法从内核中读取到这部分数据)
- TCP 与 TLS 的握⼿时延迟和慢启动减速;
- ⽹络迁移需要重新连接;
(⼀个 TCP 连接是由四元组(源 IP 地址,源端⼝,⽬标 IP 地址,⽬标端⼝)确定的,这意味着如果 IP 地址或者端⼝变动了,就会导致需要 TCP 与 TLS 重新握⼿,这不利于移动设备切换⽹络的场景,⽐如 4G ⽹络环境切换成WIFI。)
这些问题都是 TCP 协议固有的问题,⽆论应⽤层的 HTTP/2 在怎么设计都⽆法逃脱。要解决这个问题,就必须把传输层协议替换成 UDP,这个⼤胆的决定,HTTP/3 做了!
QUIC 协议的特点
QUIC 协议的优点有很多,这⾥举例⼏个,⽐如:
- ⽆队头阻塞;
(一个连接上的多个 stream 之间没有依赖。由于 QUIC 使⽤的传输协议是 UDP,UDP 不关⼼数据包的顺序,如果数据包丢失,UDP 也不关⼼。不过 QUIC 协议会保证数据包的可靠性,每个数据包都有⼀个序号唯⼀标识。当某个流中的⼀个数据包丢失了,即使该流的其他数据包到达了,数据也⽆法被 HTTP/3 读取,直到 QUIC 重传丢失的报⽂,数据才会交给 HTTP/3。⽽其他流的数据报⽂只要被完整接收,HTTP/3 就可以读取到数据。这与 HTTP/2 不同,HTTP/2 只要某个流中的数据包丢失了,其他流也会因此受影响。)
- 自定义连接机制;
(QUIC 内部包含了 TLS,它在⾃⼰的帧会携带 TLS ⾥的“记录”,再加上 QUIC 使⽤的是 TLS1.3,因此仅需 1 个 RTT 就可以「同时」完成建⽴连接与密钥协商,甚⾄在第⼆次连接的时候,应⽤数据包可以和 QUIC 握⼿信息(连接信息 + TLS 信息)⼀起发送,达到 0-RTT 的效果。) - 连接迁移;
( QUIC 协议没有⽤四元组的⽅式来“绑定”连接,⽽是通过连接 ID来标记通信的两个端点,客户端和服务器可以各⾃选择⼀组 ID 来标记⾃⼰,因此即使移动设备的⽹络变化后,导致 IP 地址变化了,只要仍保有上下⽂信息(⽐如连接 ID、TLS 密钥等),就可以“⽆缝”地复⽤原连接,消除重连的成本)
在HTTP层改动
HTTP/3 同 HTTP/2 ⼀样采⽤⼆进制帧的结构,不同的地⽅在于 HTTP/2 的⼆进制帧⾥需要定义 Stream,⽽ HTTP/3 ⾃身不需要再定义 Stream,直接使⽤ QUIC ⾥的 Stream,于是 HTTP/3 的帧的结构也变简单了。
QPACK和HPACK差不多,只不过静态表扩⼤了。
HTTP2动态表是具有时序性的,如果⾸次出现的请求发⽣了丢包,后续的收到请求,对⽅就⽆法解码出HPACK 头部,因为对⽅还没建⽴好动态表,因此后续的请求解码会阻塞到⾸次请求中丢失的数据包重传过来。
HTTP/3 的 QPACK 解决了这⼀问题,那它是如何解决的呢?
QUIC 会有两个特殊的单向流,所谓的单项流只有⼀端可以发送消息,双向则指两端都可以发送消息,传输 HTTP消息时⽤的是双向流,这两个单向流的⽤法:
- ⼀个叫 QPACK Encoder Stream, ⽤于将⼀个字典(key-value)传递给对⽅,⽐如⾯对不属于静态表的HTTP 请求头部,客户端可以通过这个 Stream 发送字典;
- ⼀个叫 QPACK Decoder Stream,⽤于响应对⽅,告诉它刚发的字典已经更新到⾃⼰的本地动态表了,后续就可以使⽤这个字典来编码了。
这两个特殊的单向流是⽤来同步双⽅的动态表,编码⽅收到解码⽅更新确认的通知后,才使⽤动态表编码 HTTP 头部。
网络夺命连环问8--说一下HTTP3牛币在哪里?相关推荐
- 网络夺命连环问1--说一下HTTPS咋保证通信安全的
目录 说一下HTTPS咋保证通信安全的? 谈谈对称加密与非对称加密的区别 谈谈机密性怎么实现的? 谈谈完整性怎么实现的? 怎么实现身份认证和不可否认呢? 公钥的信任问题怎么解决?怎么判断公钥真假? 总 ...
- redis夺命连环问10--说说Redis是怎么做旁路缓存的?
目录 相关前置知识文章 说说Redis是怎么做旁路缓存的? 先谈缓存大概怎么做 再谈旁路缓存两种模式 redis和mysql如何保证数据一致性? 那怎么解决缓存和数据库的数据不一致问题? 如何保证缓存 ...
- 夺命连环问-集合篇1
夺命连环问-集合篇1 1.简单谈谈数组和集合,并说说他们有什么区别? 答:数组和集合都是用来存储一组数据的容器. 区别有以下几点: 1.在存储方式上,数组是一个固定长度的容器,它的长度一旦被初始化之后 ...
- 夺命连环问:一个 TCP 连接可以发多少个 HTTP 请求?|文末送书
时间有限,快来薅,当当的羊毛!!! 时间有限,快来薅,当当的羊毛!!! 时间有限,快来薅,当当的羊毛!!! 作者:松若章 来源:http://c7.gg/f8txF 曾经有这么一道面试题:从 URL ...
- HashMap夺命连环问,你扛得住吗
HashMap是面试中最常被问到的问题,被问到的概率基本是99%,关于HashMap的知识点很多,这里做个总结,如果没有提及版本,默认为jdk1.8. 1.HashMap的数据结构? 底层是数组+单链 ...
- HashMap夺命连环问
1:HashMap 的数据结构? A:哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点.当链表长度超过 8 时,链表转换为红黑树. transient Node<K,V>\[\ ...
- 每日一面系列之HashMap夺命连环问
1.HashMap的底层数据结构是什么? 底层数据结构是哈希表结构(链表散列:数组+单向链表),结合了数组和链表的优点,当链表长度超过8时,链表会转为红黑树.数组中的每一个元素都是链表.总结来说就是H ...
- 每日一面系列之ArrayList夺命连环问
1.ArrayList用过吗?知道是干什么的吗?有什么特点? ArrayList是用来存储数据的一个集合,当我们存储的数据类型是基本数据类型的时候,需要存储他们的包装类.ArrayList底层是Obj ...
- 荐书丨脑电实验的夺命连环问,你敢来么
Hello, 这里是心研书籍,我是明明~ 疫情阴影还未逐渐过去,不知你还好吗,科研生活还顺利吗?明明最近就遇到了一些小问题,是怎么回事呢?请大家一起快来看看吧- 01 脑电,我该拿你怎么办 最近,我和 ...
最新文章
- python过滤器 lambada表达式 可变元组字典参数**kwargs
- HTML 5 视频,音频
- 【数据库】MySQL创建视图(CREATE VIEW)
- 论文浅尝 - IJCAI2020 | Mucko:基于事实的多层跨模态知识推理视觉问答
- LMSn没有运行在RT (real time) 模式Oracle 19c RAC?
- html5与python哪个好_3个原因告诉你,为什么选择HTML5大前端?
- 关于程序员前途的看法和我系列文章的想法
- 脾气好的领导不是好领导
- python cryptography key加密_python3利用cryptography 进行加密和解密
- android nfc贴卡多次读写,Android Studio NFC 读写卡程序 (二)(示例代码)
- 零基础java学习---温故而知新
- python混合线性模型_如何在Python statsmodels中有多组线性混合效应模型?
- 求高手请进,帮我分析这种情况是什么原因
- python中shape是什么意思_对numpy中shape的深入理解
- SQL语句的五大类:DQL、DML、DDL、DTL、DCL
- IceSword冰刃使用方法
- html5怎么将字体变成斜体,;html5斜体字
- N1・N2听力单词 —— 交通、出行 / 家庭生活、人际关系
- Eclipse插件安装(在线和离线方式)
- 计算机安装重装出现错误,电脑重装系统老是失败要怎么办?我教你几个方法,一定能装上去!...