面试时会问你:你知道http2 吗? 这时候你就头大了, 啥是http2,http1 ,http1.1,http3 这都是啥?
首先来介绍下几个协议定义
- HTTP协议:在应用层,一种超文本网络协议
- TCP协议:在传输层, 是HTTP协议的基础
- SPDY协议:谷歌开发的是基于TCP会话层的协议【HTTP2】
- QUIC协议:谷歌开发的基于UDP的低延时的互联网的传输层协议【HTTP3】
- SSL,TSL协议:在传输层和应用层之间对网络连接进行加密
- RTT:代表往返时间的性能指标,QUIC协议第二次连接可以做到0RTT
一、HTTP1.X
定义: 超文本传输协议,是互联网上应用最广泛的一种网络协议
位置: 应用层
协议: 建立在【TCP】协议上
特点: 文本格式传输, 文本换行符分隔
缺点:
- 连接无法复用 : 每次请求都会三次握手, 四次挥手 1. http1.0 :每次都要重新建立连接 2. http1.1:虽然加入了keep-alive 但是域名分片情况下仍然需要建立多个连接,耗费资源, 给服务器带来压力
- HOLB队头阻塞: 1.http1 : 上个请求发完后, 才能发下一个 2.http1.1 : 加了pipeling ,可同时发多个请求,但是返回是按顺序的
- 协议开销大: header里携带的内容过大, 在一定程度上增加了传输的成本
- 安全因素: 明文,客户端和服务端无法检验对方的身份
二、HTTP2
定义: 基于spdy协议, 专注性能,二进制编码,最大的目标是在用户和网站之间只有一个连接
SPDY协议:基于TCP的HTTP的会话层协议,主要目的是减少50%以上的页面加载时间,但是不增加部署的复杂性,实际上SPDY就是不想影响HTTP语义的情况下, 替换HTTP底层传输的协议来加快页面加载时间,解决方案就是设计了一个会话层协议--帧协议。 不影响客户端和服务端的web应用,只需要客户端和服务端都支持SPDY
主要有以下几点新特性:
- 多路复用:
- 可设定优先级:每个请求可以带31字节的优先值 0 最高级
- 一个tcp连接:只用一个tcp连接就可以传输所有的数据请求
- 头压缩:减少网络带宽
- 通过首部表的更新,以确认相同的数据不用发请求:
- 通过首部表的更新,以确认相同的数据不用发请求:
- 二进制帧:
- 同域名下所有的通信都是在【单连接】上完成的
- 单个连接可以承载【任意数量的】双向数据流
- 数据流以【消息的】形式发送,消息又由【帧】组成,多个帧之间可以【乱序发送】,因为根据帧首部的【流标识】可以重新组装
- 服务端预先推送: 服务端将客户端需要的内容预先推送过去, 如js和css
- SSL协议提供数据安全
三、HTTP3
起因:
http2如果丢包的话, 会导致情况不如http1.因为整个tcp都要开始等待重传,也就导致了后面的数据都被阻塞了。但是对于http1来说, 可以开启多个tcp连接,出现丢包情况时,只会影响一个连接,剩下的可以正常传输
定义:基于UDP协议的QUIC协议
特点:
- 0RTT: 缓存当前会话的上下文
- 多路复用:
- QUIC协议原生就有,并且传输的单个数据流可以【有序】交付,不会影响其他的数据流,
- 丢包, 不需要等待, 其他流可以正常传输
- 在移动端表现要好过TCP,因为通过id方式识别,而tcp是通过ip和端口去识别,只要ID不变, 就能寻思重复连接上
- 加密认证的报文: 报文头有认证, body有加密
- 向前纠错机制:
QUIC协议有一个非常独特的特性,称为向前纠错 (Forward Error Correction,FEC),每个数据包除了它本身的内容之外,还包括了部分其他数据包的数据,因此少量的丢包可以通过其他包的冗余数据直接组装而无需重传。向前纠错牺牲了每个数据包可以发送数据的上限,但是减少了因为丢包导致的数据重传,因为数据重传将会消耗更多的时间(包括确认数据包丢失、请求重传、等待新数据包等步骤的时间消耗)。
局限:只能使用丢一个包, 多个不行, 要重传
主要应用:游戏
总结:
- http1:明文,文本传输,多进程并发请求,无复用,队头阻塞,协议开销大
- htt2:多路复用,二进制流,头压缩
- http3:基于udp协议,QUIC协议,又取了tcp的精华, 加密,多路复用,0rrt,向前纠错