HTTP/3快来了,挖一挖 HTTP 的历史
9 分钟读完

HTTP/3快来了,挖一挖 HTTP 的历史

HTTP/3快来了,挖一挖 HTTP 的历史

偶尔发现某大型网站的服务还在使用HTTP/1.1,没有使用HTTP/2 ,然后突然就好奇HTTP/3怎么样了。。。挖一下 HTTP 的事情

然后就很感慨:

我们做的很多努力就是为了提升效率和安全

HTTP标准和HTML标准一样古老,都是由互联网之父 Tim Berners-Lee 在1989年发起,然后经由IEFT发展起来。不过HTTP第一个被广泛应用的版本是 0.9 版本,对我们影响比较多的是 1.0 版本和后来的 1.1 版本,我记得国内有些门户网站在2010年之后还在用 HTTP/1.0。

HTTP 时间轴

  • 1991, HTTP/0.9
  • 1996, HTTP/1.0
  • 1997, HTTP/1.1
  • 2009, SPDY
  • 2012, HTTP/2
  • 2018, HTTP/3

我们从 HTTP/1.1 开始来说

HTTP/1.1

HTTP/0.9只支持get方法,然后HTTP/1.0定义了其它方法比如postput等等,并且在通讯中指定版本以及请求头和响应头。当然这些还不够,所以在第二年,就又推出了 HTTP/1.1 版本,增加了很多特性:

  • 缓存机制
  • 增加长链接: keep-alive,并默认开启,这样就解决了每次请求完成之后就关闭造成的效率低下问题。
  • 分块传输:Transfer-Encoding:chunked
  • pipelining:流水线或者称为通信管道复用。值得注意的是,HTTP/1.1在1997年就制定了,还是在 2009 年开始大规模使用然后被广为人知,从而被大规模使用。

HTTP/1.1 的问题

其实当时HTTP的效率已经「够用」了对吧?不是的,HTTP/1.1当然不是完美的,有很多明显的问题:

  • 高延迟,队头阻塞带来的高延迟问题导致页面加载速度降低
  • 无状态特性,带来了巨大的HTTP Header。比如,UACookieAcceptServer等头部信息,可能会浪费几千字节的开销。而Body却可能只有几个字节。
  • 明文传输,不安全,一个是内容容易被监控,比如密码,被监控之后,就可能会被劫持(篡改)。
  • 不支持服务器推送。

所以,HTTP/1.1的负面特征很明显:不安全

HTTPS?

安全问题当然是可以解决的,那就是使用HTTPS。

HTTPS不是新的协议,它其实是在HTTP层和TCP层之间加入了安全层,使用SSL/TLS协议来进行数据传输的加解密操作。

简单复习一下SSL/TLS:

  • 1994年,NetScape公司设计了SSL协议(Secure Sockets Layer)的1.0版,但是未发布。
  • 1995年,NetScape公司发布SSL 2.0版,很快发现有严重漏洞。
  • 1996年,SSL 3.0版问世,得到大规模应用。
  • 1999年,互联网标准化组织IETF接替NetScape公司,发布了SSL的升级版 TLS  1.0版。
  • 2006年,TLS 1.1版。
  • 2008年,TLS 1.2。
  • 2011年,TLS 1.2  修订版 。
  • 2015年,SSL 3.0 被中止支持。
  • 2018年,TLS 1.3 发布,移除了 MD5、SHA1和RC4的支持。
  • 2020年,微软、Google、苹果、Mozilla四家浏览器业者在2020年终止支持TLS 1.0及1.1版,新版的浏览器会警告页面不安全。

再来复习一下HTTPS的传输流程:

所以,使用了HTTPS的网站,访问起来更慢了

那能不能不用HTTPS?

当然不能啦。

其实大家在2014年之前对网络传输的安全问题并不太重视,因为没有出过什么问题,最多就是遇到运营商缓存问题。

嗯,没有遇到安全问题之前当然不会重视安全问题啦。

然而在2014年之后,开始遇到各种令人发指的中国网络运营商劫持,当时各大互联网服务都被劫持过,刚开始劫持整个页面,后来劫持js文件,甚至某省的运营商将公共cdn的jquery文件给劫持了!

所以说,运营商其实是推动了HTTPS的普及了。

HTTP/2

那 Google 在发现了 HTTP 1.1 的弊端后,开始尝试解决。

然后Google 搞了 SPDY,然后 SPDY 被 IETF 在2015年标准化为 HTTP/2。

这就是Google牛逼的地方:解决问题就是改变世界,某度也就搞个度娘娱乐一下。。。

HTTP/2的特性:

  • 请求头压缩
  • 多路复用
  • 二进制传输

HTTP/2 VS HTTP/1.1:

所以,HTTP/2最直接的效果就是:快!

有一个非常著名的demo展示HTTP/2 有多快:HTTP/2: the Future of the Internet | Akamai

到目前为止,全球有 49.7% 的网站使用了HTTP/2。 via Usage Statistics of HTTP/2 for Websites, December 2020

HTTP/2一定要加密么?

是的

IETF工作组在是否强制加密上有很大的争议,并且最后并没有达成一致,也就是说标准并没有说必须要加密。。。

不过大部分客户端实现的时候,让加密(HTTPS)成为事实上的标准了。

HTTP/2的不足

嗯。。。上面提到的HTTP 1.1的两个关键问题在HTTP/2中并没有得到解决:

  • TLS 握手延时
  • 队头阻塞

嗯,HTTP/2主要解决了通道的效率问题,但还是不够快。

TLS 1.3

上面 HTTP/2 的不足中,TLS的握手延迟,是没办法避免的,不过 TLS 1.3 带来了很大的变化(虽然目前使用的还不多):

  • 快——TLS 1.2及以下版本需要2次往返才能完成握手,也就是2-RTT,而TLS 1.3 可以做到1-RTT甚至 0-RTT
  • 更安全——废弃了 3DES、RC4、AES-CBC 等加密组件,废弃了 SHA1、MD5 等哈希算法。

HTTP/3

然后牛逼的 Google 又折腾出了 QUIC协议(Quick UDP Internet Connections,快速UDP网络连接),算是抛弃了 TCP 协议了。

然后 IETF 接受了 HTTP Over QUIC 作为下一个 HTTP 版本的提议,将其命名为 HTTP/3。

先看下 HTTP/3 有多快:

有没有震惊到?

QUIC

大家都知道,UDP 比 TCP 快很多,但也有会丢包的问题,所以UDP的使用场景并没有那么流行,比如我们熟知的也就QQ在用UDP,还有一些DNS服务使用UDP。

那其实让UDP更稳定不就行了?QQ其实是在UDP的基础上自己实现了一层协议来保证稳定性(重试)。

只是各自实现 UDP 扩展协议的做法不太「互联网」。

Google 的思路也是很简单:先搞定,再标准化

事实上,QUIC 的拥塞算法是直接实现一遍TCP的算法。

那 QUIC 都做了些什么呢:

  1. 减少了 TCP 三次握手及 TLS 握手时间,甚至可以做到 0RTT。
  2. 改进的拥塞控制。
  3. 避免队头阻塞的多路复用。
  4. 连接迁移。
  5. 前向冗余纠错。

再来看一下架构图:

那么可以大规模使用了么?

还不行:

  • HTTP/3 还是草案状态,没有完全标准化
  • 浏览器还不支持——除了 MacOS Big Sur 以上版本的 Safari 浏览器以外,包括 Chrome 在内都需要手动开启支持。

如何启用?

  1. 改造自己的服务,比如,golang 有个 quic-go 的项目可以原生支持到 QUIC;
  2. 使用web服务比如 NGINX, NGINX 已经开发了 QUIC 分支,可以下载源代码自行编译。

向下兼容

你可能会说,HTTP/3现在没法投入生成啊。。。

不急,其实可以先简单的升级一下TLS来提升HTTP/2的效率了,HTTP/3正式发布了再支持也不迟。

升级到 TLS 1.3

要求:

  • Apache 版本 2.4.37 +
  • Nginx 版本 1.13.0+
  • OpenSSL 版本 1.1.1 +
  • 证书支持,也就是不能使用SHA1/RC4等加密的证书了
PS: IIS的任何版本都不支持TLS 1.3

升级也很简单,比如 Nginx 简单配置一下就行了:

ssl_protocols TLSv1.2 TLSv1.3;

效果:

毕竟TLS 1.2 要 2 RTT,而 TLS 1.3 只需要 1 RTT,甚至 0 RTT,这里国外网站测试的数据通常是可以节省 100ms 以上的握手时间。 via https://medium.com/codavel-blog/measuring-tls-1-3-performance-ee301b1e8774

结语

我其实蛮期待如果证券交易所的服务支持了 HTTP/3 会发生什么事情。。。

参考文章:

工具: