陽楷锴的小港
1113 字
6 分钟
我们为什么需要HTTP/3
2020-10-17
无标签

什么是HTTP/3#

HTTP/1.1HTTP/2之后的全新版本HTTP协议。

HTTP/3协议废除了TCP协议,改用QUIC。全名叫Quick UDP Internet Connection,读作“quick”,~~一听就知道很快嘛。~~从名字我们不难看出,这是个基于UDP的协议。大佬们就是用这个80年代协议加上个传输安全,成了QUIC。

再说说QUIC的前身gQUIC。其实早在Chrome 55的时候Google就已经实现了gQUIC协议,然后添加了一个Chrome flag,而且现在还存在,使用Chrome的读者可以到chrome://flags/#enable-quic进行考古。但是gQUIC也不同于QUIC,它只能用于发送HTTP流量,而QUIC除了应用在了HTTP/3,还可以用于发送DNS、SSH、Telnet之类的流量。完全取代UDP应该问题不大。

在2015年,Google把QUIC提交到了IETF,然后整出来一个叫HTTP-over-QUIC的东西,又后来改了个名字,称为HTTP/3。

HTTP/2是怎么运作的?#

要说新技术,肯定要把老技术拿出来说一说。

HTTP/2以及之前所有版本的HTTP协议,都是基于TCP协议构建的。在你的设备与服务器开始安全的(经过TLS加密的)交换你想要的数据之前,他们首先需要建立连接,然后进行三次握手,你的设备就能确定服务器的身份,然后开始传输加密的数据。(这里假设你不想要握手时候证书之类的数据,当然除了应用程序也没什么人会想要这个)

那它有什么不同?好在哪里?#

唯一的不同,是处处都不同。(老苹果了)

从一开始你可能就要想了,UDP不是上世纪80年代的比站长还老的东西了吗?怎么还翻出来炒冷饭呢?我们知道,DNS协议就是基于UDP实现的,一大原因就是因为它的速度。就算服务器远在灯塔国,一个基于UDP的DNS请求去回一趟(注意是去了又回来)都只用100+ms。

于是从上文不难得出答案,那就是快,因为不需要建立连接,原先的TLS三次握手被简化为一次。同时还具有很好的兼容性,HTTP/3在QUIC的基础上仍然支持了传统的TLS三次握手。

同时,不需要建立连接还带来了新的好处,就是免中断。在TCP连接建立好之后,如果你的网络环境在传输过程中发生了改变,如你突然连接上了虚拟专用网络,又或者是你从无线局域网跑到了蜂窝移动数据,通常你就需要重新建立连接来传输完整的数据。在Chromium浏览器中,这体现为“ERR_NETWORK_CHANGED”的报错。于是你就需要刷新页面重新加载了。

但QUIC不需要,他只管发数据包,反正没有连接。但是这里又有一个转折了:如果你的网络环境发生了改变,你的公网IP势必会发生变化,这样如果服务器还往原来的地方发数据包,你岂不是收不到了?这个时候,你的设备往往只需要朝服务器再发一个数据包,包含了刚开始握手时给的唯一ID,并且要求服务器更改传输地址就可以了。

并且不同于TCP完全由操作系统实现,QUIC通过应用程序层面实现的方式不需要理会系统的优化程度,只管自己实现就好。

综上,我能看到的最舒服和最迫切的应用前景就是DNS了。传统的UDP DNS太不安全,轻松劫持,DoT、DoH三次握手太慢,DNSSec又不是大多域名都启用,所以DNS这块应用HTTP/3可以说是完美解决大部分问题。

那它难道没有缺点?#

Every coin has 2 sides.

它肯定是有缺点的。但其实都不是它本身的缺点:

  • 浏览器目前对HTTP/3的支持尚不完善,Chrome、Edge、Firefox都是只有每夜构建版才支持。(前两者的叫Canary,最后者的叫Nightly)甚至还需要加flag或者config。Curl甚至还得自己编译。
  • 由于NAT设备优化的问题,可能会使丢包率高于原先的TCP连接。
  • 有些NAT设备会重写UDP报文的header,然后当场爆炸。

完。