老青菜

SPDY

2019-06-13

2009年,Google推出 SPDY(SPeeDY),重写了HTTP的连接管理、数据传输部分。解决了HTTP/1.1队头阻塞的问题,优化了传输效率,减少了网页延迟。不过SPDY作为实验性的协议,现在官方文档已经不建议使用了,建议使用后继者HTTP/2.0

作为HTTP/2.0的前身,我们来看下SPDY做了哪些改动?

design

首先我们先来了解一下SPDY的设计结构,如下图:

如上图所示,SPDY强制要求使用SSL,在SSL之上添加了一个会话层,该会话层允许通过单个TCP连接发送多个并发的,交错的流。
应用层HTTP GET、POST消息格式保持不变,为了在多个并发传输的HTTP消息之间,正确的对应HTTP Request和Response,SPDY增加了分帧层,通过了流和帧来管理HTTP的Request、Response。

features

接着来我们再看一看SPDY的特性。

Multiplexed streams

多路流。针对单个域名,SPDY只建立一个TCP连接,并且允许无限并发流。因为请求是在单个通道上交错的,所以TCP的利用率要高得多;而且需要建立的TCP连接更少,避免了三次握手、慢启动、四次断开,发出去的包也会少很多,并且服务器的并发数得到充分利用。

Request prioritization

请求优先级。尽管无限制的并行流解决了队头阻塞的问题,但它们引入了另一个问题:如果通道上的带宽受到限制,则客户端可能会阻塞请求,以免阻塞通道。 为了解决此问题,SPDY实现了请求优先级:客户端可以从服务器请求任意数量的项目,并为每个请求分配优先级。 这样可以防止网络通道被非关键资源阻塞,高优先级请求被挂起。

HTTP header compression

HTTP头部压缩。针对Header块,SPDY使用 zlib(rfc1950) 算法进行压缩,大大减少了数据包和字节的传输。

Server Push

服务端推送,SPDY允许服务器可以针对单个请求向客户端发送多个答复。基本原理是这样,某些时候服务器知道它需要发送多个资源来响应单个请求。如果没有服务器推送功能,则客户端必须首先下载主要资源,然后发现次要资源并进行请求,推送资源可避免这种延迟。命中Server Push后,Server会通过SYN_STREAM打开新流,并携带Associated-To-Stream-ID关联到之前开放的流,告诉Client,是这个关联的流触发了推送流。

测试结果

了解了这些特性以后,我们来看下官方的实际实验结果。

Average page load times

模拟家庭网络连接,丢包率为1%,然后下载25个“前100个”网站,并且每个站点运行了10次下载,最后统计所有站点的平均页面加载时间。结果显示,SPDY的速度比普通HTTP的页面加载时间提高了27%-60%,而与普通HTTPS相比,则提高了39%-55%。实验数据如下:

The role of header compression

头部压缩技术,使请求头的大小减少了约88%,响应头的大小减少了约85%。比如说在上传带宽仅为375Kbps的低带宽DSL链路上,针对那些发出大量资源请求的站点,页面加载时间得到了显着改善,仅由于头部压缩,页面加载时间减少了45-1142ms。

The role of packet loss and round-trip time (RTT)

在不同的丢包比例情况下,SPDY的等待时间节省与丢包率的增加成比例地增加,以2%的速度最多可提高48%,这种增加在2%的丢包率之上逐渐减小,而在2.5%之上则完全消失。总结一下,只要有以下几点原因:

  1. SPDY发送的数据包大小要比普通HTTP少40%,这意味着更少的数据包会受到丢包的影响。
  2. SPDY使用更少的TCP连接,这意味着丢失SYN数据包的机会更少,而且避免了拥塞控制的慢启动策略。

在一个RTT(round trip time)不同的延迟情况下,SPDY的延迟节省也与RTT的增加成比例地增加,在200ms时加速高达27%。SPDY随着RTT上升而表现更好的原因是因为SPDY并行获取所有请求。如果HTTP客户端每个域有4个连接,则大约需要5个RT才能获取全部20个项目。而SPDY能在一个RT中获取所有的20个资源。

我们来看下官方实验数据:

开启SPDY

上面简单的介绍了下SPDY的一些特性,接下来我们来看下如何开启SPDY。以nginx为例,编辑nginx.conf:

listen  443 ssl spdy xx;
listen  [::]:443 ssl spdy xx;

不过在ngnix v1.10以后移除了spdy的支持,建议使用http2模块。

listen  443 ssl http2 xx;
listen  [::]:443 ssl http2 xx;

参考链接

google spdy whitepaper(需要梯子)
google spdy protocol(需要梯子)

Tags: SPDY
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章