前言
HTTP的协议的发展经过了一个比较漫长的阶段,从最初的HTTP/0.9发展到如今的HTTP/3.0,HTTP协议毫无疑问已经成为了一项很强大的协议,今天我们就来聊一聊HTTP/2.0及HTTP/3.0。
一、HTTP/2.0做了哪些改进?
二进制分帧
二进制分帧就是将一条连接上所有传输的信息,分割为更小的消息和帧,并对他们采用二进制格式编码,首部信息放在Headers帧中,主体信息被封装在Data帧中。
问题解答:
- 为什么HTTP/2.0可以对所有的内容进行二进制转换?
因为二进制分帧层在应用层和传输层之间的中间层,所有信息都会经过,进而可以转换。
- 为什么要用二进制?
效率更高,计算机更青睐二进制数
多路复用
多路复用技术就是可以并行发送请求,而且无需等待响应返回的一种技术,消除了不必要的延迟,减少了页面加载时间。
问题解答:
- HTTP/2.0多路复用与HTTP/1.1中管道的区别在哪?
管道也可以并行发送请求,但是返回响应结果则必须是发送时的顺序,而多路复用技术不需要等待,不容易造成堵塞。多路复用的基础就是二进制分帧,因为可以乱序发送和接收。
首部压缩
在第一次请求之后,大部分的字段可以复用的。而且随着页面越来越复杂,同一个页面发出的请求会越来越多。如果头部不压缩的话,会造成很大的流量开销
问题解答:
- 首部压缩的原理?
支持http2.0的浏览器和服务器会维护一个相同的静态表和一个动态表,以及内置一个霍夫曼编码表。静态表存储的是常见的一些头部,和一些很常见的头部键值对,例如method:get以及cookie。动态表开始是空的,如果头部命中静态表中的名称,那么就回将这份键值对加入动态表中,例如cookie:xxxx。这样做的原因在于,请求或则响应头命中了静态或者动态表的时候,只需要一个字节就能表示,可想而知,这个字节就是一个地址,指向表中的数据。
服务器推送
服务器可以对一个客户端请求发送多个响应,例如,浏览器向服务端请求index.html,里面包含一张样式表和一张图片。传统的方法就是会向浏览器发送三次请求。而服务端推送,则可以在一次请求内将这三个文件全部发送给浏览器,减少了请求次数,提升了网页性能。
问题解答:
- 服务器推送有什么弊端?
如果服务端推送的内容,浏览器有缓存的话,就会浪费带宽。避免的方法就是在服务端配置,只对第一次请求实现服务器的推送。
二、HTTP/3.0诞生的意义
首先我们要清楚HTTP/1.0,HTTP/2.0都是基于TCP的,而HTTP/3.0是通过UDP建立的,基于QUIC(quick UDP Internet Connection)协议!
连接迁移
先阐述一下tcp里面的四元组,一条tcp的唯一性标识,是由源IP,源端口,目的IP,目的端口,四元组标识。源IP,源端口一般比较稳定,但是目的IP,目的端口会由于网络元素等原因发生改变,一旦改变,那么此条tcp连接就会断开。由于QUIC基于UDP协议,所以一条UDP协议不再由四元组标识,而是以客户端随机产生的一个64位数字作为ID标识。只要ID不变,那么这条UDP就会存在,维持连接,上层业务逻辑就感受不到变化。
无对头阻塞
首先来看看队头阻塞的两层原因:
HTTP/2.0的多路复用解决了HTTP层的队头阻塞问题,但是TCP的队头阻塞依然存在,当数据包超时确认或者丢失,会等待重传,因此会阻塞当前窗口向右滑动,造成阻塞。而QUIC是基于udp的,创新点在于QUIC依靠一个严格的单调递增的packet序列,一个数据包里面还会有streamID和streamoffset偏移量,即使中途发生丢包或者超时确认,后面的数据包不会等待,等到接收完之后根据ID和offset即可完成重新拼装,从而避免了这种问题。
自定义的拥塞控制
tcp协议是在传输层,默认存在于系统中,而QUIC在应用层,当想要依据实际情况来重定义拥塞算法的时候,QUIC显然更加灵活。
前向安全和前向纠错
都说udp不太靠谱,但是Google给QUIC加上了这个机制:每发送一组数据之后,就对这组数据进行异或运算(效率高),并将结果也发送出去,那么接收方就有两份数据版本,可以对初始数据进行纠错和校验。以此保证了可靠性。
最后
⚽这篇文章主要介绍了HTTP/2.0和HTTP/3.0出现的意义~
⚾如果你对这篇文章感兴趣欢迎点赞关注+收藏,更多精彩知识正在等你!😘