之前的文章提到过本站已启用了 SPDY 协议,只要使用最新的 Firefox, Chrome, Opera 浏览器访问就是使用的 SPDY 协议。那么什么是 SPDY 协议呢?和 HTTP 相比又有什么优点呢?下面就是我自己的一些理解:

HTTP 为什么慢

下面是我认为影响比较大的原因:

  • 请求是串行的,只有等上一个请求应答接收完之后才能发送下一个请求。如果有个请求应答时间很长,则会导致后续的请求都阻塞住。就算是在有 HTTP pipelining 的时候也好不到哪儿去,因为对于客户端同时提交的多个请求,服务器应答的时候必须按照同样的顺序进行应答,因此如果某个请求的应答时间很长,同样会导致后面的应答阻塞。
  • 连接建立的开销。现在的浏览器为了避免上面提到的问题,都会采用多连接的方式,在有丢包和延迟的情况下面,建立连接代价是比较高的。而且 TCP 都会有一个慢启动的过程,而网页一般都比较小,往往这条连接还没有(或刚刚达到)最佳的速度就把内容下载完成,请求其他内容时又要重新完成慢启动的过程。

其他原因,影响应该不是那么明显:

  • 只能有客户端主动发起连接,不能服务器进行推送。
  • 头部没有压缩。

SPDY 做了什么

详细的协议介绍可以直接看其协议文档,这里简单的说一下,SPDY 在一个 TCP 流中分出了多个 SPDY 通道(协议里面叫做 stream),每个通道完成一个请求和应答,并且这些通道是并行的。这样一来就一举解决了上面提到的问题:

  • 请求在不同的通道中,并且可以并行,那么浏览器就可以一起把需要的资源请求同时发给服务器,而服务器也可以同时处理这些请求,同时将应答回复给客户端。不会出现等待每个请求或者某个应答才能继续的问题。
  • 由于一条 TCP 就能有多个通道(现有协议规定可以创建 2G 个,客户端与服务端各可创建 1G 个),因此客户端和服务器就只需要一条 TCP 连接即可,因此就不会有建立连接的开销,也没有慢启动那些的问题。
  • SPDY 的头部总是压缩的,这样可以减少传输量。
  • SPDY 的通道双方都可以创建,因此服务器可以主动推送资源,不需要被动等待客户端请求。
  • 通道在创建的时候可以指定优先级,可以让重要的请求优先处理。

SPDY 现状

新闻上说 HTTP 2.0 的第一个草案就是直接拷贝 SPDY 的协议文档,因此 SPDY 很有希望成为以后的 HTTP 2.0 标准。

不过至少在成为标准之前,SPDY 还没有自己的独有端口,那如何使用该协议呢?Google 提出了在 HTTPS 之上使用 SPDY,只需要增加一个 SSL 的扩展协议 NPN,在 SSL 协商的同时协商出上层使用的协议,这样在 SSL 握手完成后,客户端与服务器就知道上层的应用是 SPDY 还是普通 HTTP,从而使用相应的协议进行处理。这样做的好处就是对用户透明,不需要显示使用类似 spdy:// 这样的前缀去指定使用 SPDY 协议,现有的网页也不需要修改,只需要对浏览器和服务端进行升级即可。