一、SPDY协议诞生记

  SPDY (SPDY 是 Speedy 的昵音,意思是更快)是 Google 开发的基于传输控制协议 (TCP) 的应用层协议 ,那么为什么要搞一个SPDY出来呢?距离万维网之父蒂姆·伯纳斯-李1999年发明并推动 HTTP 成为如今互联网最流行的协议已经过去十几年了(现用 HTTP 1.1 规范也停滞了 13 年了),随着现在 WEB 技术的飞速发展尤其是 HTML5 的不断演进,包括 WebSockets 协议的出现以及当前网络环境的改变、传输内容的变化,当初的 HTTP 规范已经逐渐无法满足人们的需要了。HTTP 需要进一步发展,因此 HTTPbis 工作组已经被组建并被授权考虑 HTTP 2.0 ,希望能解决掉目前 HTTP 所带来的诸多限制。而 SPDY 正是 Google 在 HTTP 即将从 1.1 跨越到 2.0 之际推出的试图成为下一代互联网通信的协议,在今年的2月份,Google终于取得了成功,SPDY被认定作为HTTP2.0的基础。Google也将从2016年开始弃用SPDY,转而支持Http2.0。

二、SPDY解决的问题

SPDY急于解决的问题的很大部分实际上也就是传统的HTTP协议的不足,主要体现在以下几个方面:

1. 每个HTTP连接在同一个时间只能响应一个资源请求。即便是有类似Keep Alive的帮助,但是从逻辑上仍然只是一个FIFO队列,不能够异步响应。

2. 仅能从客户端发起请求。在传统的HTTP协议中,每一个HTTP请求都是从浏览器端发起的,即便是服务器知道浏览器端此时需要某个资源,也必须要通过浏览器端的发起来完成整个交互过程。

3. 响应头的冗余与未压缩。目前HTTP请求头的标准大小从200字节到2KB。Web应用中带大量的cookie表示应用的各种状态的请求头也是很常见的,而在传统的HTTP协议中,HTTP头都是明文未压缩的,这块的带宽浪费也是显而易见的问题。其次,单条链路重复的HTTP头信息(比如HOST, PROXY等等),也实际上是一种带宽的浪费,这部分的某些信息实际上发送一次以后就无需再发送了。

SPDY的出现也解决了以上的几个问题,同时也提出了以下几个目标:

1. 允许多个并发的HTTP请求运行在一个单独的TCP会话中。

2. 为了减少带宽,使用HTTP压缩头和消除不必要的头。

3. 要定义一个很容易实现且提高服务器效率协议。

4. 为了使SSL底层的传输协议更好地提高与现有网络基础设施的安全性和兼容性。

5. 为了使服务器启动与客户端的通信时,尽可能将数据推送到客户端。

三、SPDY协议的原理

简单来说SPDY是SSL之上添加一个会话层,允许多个并发交错流过一个单一的TCP连接。传统的HTTP GET和POST消息格式保持不变,但中SPDY会指定一个新的帧格式进行编码和通过线路传输的数据。

SPDY的framing layer(session),运行可靠的传输层(如TCP)之上。客户端的TCP连接发起方。SPDY的连接是永久性连接。为了获得最佳性能,客户端将无法关闭打开的连接,直到用户浏览所有网页引用的连接,直到服务器关闭连接。服务器被鼓励保留打开的连接,只要可能,但如有必要,可以终止空闲连接。正是因为这个特性,服务器完全有能力push数据信息到浏览器端,当两个端点关闭传输层的连接,它必须首先发送一个GOAWAY的frame,如果请求结束前完成,这样才能使端点能够可靠地确定。

在SPDY协议有几个概念是比较重要的:

1. session--会话,一个SPDY会话实质上就是一个TCP连接;

2. stream--虚拟流,一个SPDY会话可以拥有多条虚拟流,每条流都有标识其身份的流ID,所有的请求和应答都是通过流进行的;

3. frame--SPDY帧,在SPDY协议中,客户端和服务器交互的数据就是SPDY帧,SPDY帧可以分为控制帧和数据帧,数据帧和控制帧通过帧的第一个比特位进行区分,帧的具体结构这里就不分析了,有兴趣的同学可以去查看google发布的SPDY草案。

(备注,本文部分内容是从http://cube.qq.com/?p=346 得来的)

05-11 22:21