你知道HTTP2吗?

302 阅读4分钟

面试时会问你:你知道http2 吗? 这时候你就头大了, 啥是http2,http1 ,http1.1,http3 这都是啥?

首先来介绍下几个协议定义

  1. HTTP协议:在应用层,一种超文本网络协议
  2. TCP协议:在传输层, 是HTTP协议的基础
  3. SPDY协议:谷歌开发的是基于TCP会话层的协议【HTTP2】
  4. QUIC协议:谷歌开发的基于UDP的低延时的互联网的传输层协议【HTTP3】
  5. SSL,TSL协议:在传输层和应用层之间对网络连接进行加密
  6. 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

主要有以下几点新特性:

  • 多路复用:
    1. 可设定优先级:每个请求可以带31字节的优先值 0 最高级
    2. 一个tcp连接:只用一个tcp连接就可以传输所有的数据请求
  • 头压缩:减少网络带宽
    1. 通过首部表的更新,以确认相同的数据不用发请求:
      image.png
  • 二进制帧:
    1. 同域名下所有的通信都是在【单连接】上完成的
    2. 单个连接可以承载【任意数量的】双向数据流
    3. 数据流以【消息的】形式发送,消息又由【帧】组成,多个帧之间可以【乱序发送】,因为根据帧首部的【流标识】可以重新组装
  • 服务端预先推送: 服务端将客户端需要的内容预先推送过去, 如js和css
  • SSL协议提供数据安全

三、HTTP3

起因:

http2如果丢包的话, 会导致情况不如http1.因为整个tcp都要开始等待重传,也就导致了后面的数据都被阻塞了。但是对于http1来说, 可以开启多个tcp连接,出现丢包情况时,只会影响一个连接,剩下的可以正常传输

定义:基于UDP协议的QUIC协议

特点:

  • 0RTT: 缓存当前会话的上下文
  • 多路复用:
    1. QUIC协议原生就有,并且传输的单个数据流可以【有序】交付,不会影响其他的数据流,
    2. 丢包, 不需要等待, 其他流可以正常传输
    3. 在移动端表现要好过TCP,因为通过id方式识别,而tcp是通过ip和端口去识别,只要ID不变, 就能寻思重复连接上
  • 加密认证的报文: 报文头有认证, body有加密
  • 向前纠错机制:

    QUIC协议有一个非常独特的特性,称为向前纠错 (Forward Error Correction,FEC),每个数据包除了它本身的内容之外,还包括了部分其他数据包的数据,因此少量的丢包可以通过其他包的冗余数据直接组装而无需重传。向前纠错牺牲了每个数据包可以发送数据的上限,但是减少了因为丢包导致的数据重传,因为数据重传将会消耗更多的时间(包括确认数据包丢失、请求重传、等待新数据包等步骤的时间消耗)。

局限:只能使用丢一个包, 多个不行, 要重传

主要应用:游戏


总结:

  • http1:明文,文本传输,多进程并发请求,无复用,队头阻塞,协议开销大
  • htt2:多路复用,二进制流,头压缩
  • http3:基于udp协议,QUIC协议,又取了tcp的精华, 加密,多路复用,0rrt,向前纠错

参考文章