HTTP/3 简介

前言

HTTP 2.0是由谷歌SPDY进化而来,现有的实现基本都是走SSL(说是可以不用SSL,但基本没这么干的),传输层使用TCP。
HTTP 3.0是由谷歌QUIC进化出来的,QUIC没有大动HTTP 2.0,在把传输层调整为UDP后,为适应UDP而做了一些微调。

HTTP 2问题

前篇已整体介绍HTTP 2,就此,此篇只说下HTTP/2的问题

在底层使用了TCP的情况下,TCP的慢启动;拥塞窗口尺寸设置不合理导致的性能急剧下降的问题没有得到解决。基因在此,无法改变
HTTP 2多路复用只是减少了连接数,队头阻塞的问题并没有得到完全解决。如果TCP丢包率超过2%,HTTP/2表现将不如HTTP1.1。因为HTTP1 是分开使用的TCP连接,具体对比如下示意图所示:

HTTP 3

HTTP 3是在QUIC基础上发展出来的。底层使用UDP进行数据传输,但上层仍然使用HTTP/2。HTTP2与UDP之前存在一个QUIC层,TLS加密过程在此层处理。QUICK存在两个版本,早期Google打头阵的QUIC称之为gQUIC,IETF标准化后称之为IQUIC。与HTTP对比,HTTP/3整体如下:

整个HTTP家族对比如下:

HTTP3特点:

使用UDP作为传输层进行通信
从协议本身保证了安全性,QUIC在建立连接的握手过程中就完成了TLS加密握手

建立连接快,正常只需要1RTT即可建立连接。如果有缓存之前的secret信息,则直接验证和建立连接,此过程0RTT。建立连接时,也可以带有少量业务数据。


不和具体底层连接绑定,QUIC为每个连接的两端分别分配了一个唯一ID,上层连接只认这对逻辑ID。网络切换或者断连时,只需要继续发送数据包即可完成连接的建立

使用QPACK进行头部压缩,因为HPACK要求传输过程有序,这会导致队头阻塞。而QPACK不存在这个问题
HTTP/3在header中定义了一个新header:Alt-Svc: h3=":20003":表示服务器在20003端口开了一个20003端口用于HTTP/3服务

补充

使用以下代码可以判断是否有使用HTTP/2

(function(){
  // 保证这个方法只在支持loadTimes的chrome浏览器下执行
  if(window.chrome && typeof chrome.loadTimes === 'function') {
      var loadTimes = window.chrome.loadTimes();
      var spdy = loadTimes.wasFetchedViaSpdy;
      var info = loadTimes.npnNegotiatedProtocol || loadTimes.connectionInfo;
      // 就以 「h2」作为判断标识
      if(spdy && /^h2/i.test(info)) {
          return console.info('本站点使用了HTTP/2');
      }
  }
  console.warn('本站点没有使用HTTP/2');
})();

QUIC详细介绍–>维基百科
QPACK详细介绍–>点击此处

参考资料

关于HTTP/3背后你所不知道的
HTTP/3 来啦,你还在等什么?赶紧了解一下
What is the QUIC Transport Protocol?
我的HTTP/3学习笔记
一文读懂 HTTP/2 及 HTTP/3 特性

欢迎大家关注我的公众号:

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注