Google SPDY初探:HTTP 1.1之外的世界

转载地址:http://heikezhi.com/2011/05/11/life-beyond-http-11-googles-spdy/

蒂姆.伯纳斯李爵士以他早期在URI,HTTP以及HTML方面的卓越贡献而收获盛誉,正是他的这些努力促成了1996年HTTP 1.0规范(RFC 1945)的发布,1997年的HTTP 1.1协议草案(RFC 2068)以及1999年HTTP 1.1规范(RFC 2616)的发布,如果没有这些协议,我们所熟知的Web根本不会存在。

尽管如此,但是这些协议发布至今已经过去了十几个年头,全世界的网民数量已经达到10亿级别,我们的Web应用的体积和复杂度也在直线上升,当初HTTP规范已经已经不能适应这个新时代,Google的Chrome浏览器早在一年前就已经从地址栏移除了http://前缀,并且不仅如此,如果你使用Chrome浏览器,同时使用Google的网络服务,那么有可能,你已经不再是通过HTTP访问这些服务了,没错,很有可能你的浏览器使用的是SPDY——下面就让我们来一探究竟。

HTTP的延迟问题

当我们将每天工作的大部分时间都投入到我们的Web应用上时,延迟问题就变的举足轻重,不幸的是,这正是HTTP规范的痛处,最初的HTTP 1.0规范规定了在每一个单独的请求/相应之后都必须关闭与服务器间的连接:也就是说连接无法重用,必须为每次请求重新创建一条新的TCP连接——这是方式代价非常高。

HTTP 1.1的最大改变就是针对这个问题的:RFC 2616 将连接默认为”keep-alive“,并且介绍了一个”pipelining“的特性,keep-alive让我们可以在多个请求之前重用tcp连接,而pipelining则让我们可以一次发起多个请求,两个都是很不错的改变,但不幸的是,keep-alive如今已经被大部分服务器和客户端所接受,但是pipelining却在今日的大多数浏览器中被默认禁用(除了opera)

尽管如此,即使我们部署了pipelining支持,仍然还有一个无法解决的问题:HTTP严格限制请求必须以FIFO的方式被处理,因此如果在你的请求队列中有一个非常慢的动态请求,那么与它共用同一TCP通道的其它请求都必须等待这个请求先处理完成。

SPDY:HTTP 1.1之外的世界

SPDY(SPeeDY)是Google的一个研究项目,它旨在提供一个应用层的协议用于传输Web内容,SPDY最主要的目标就是降低网络延迟,这是他们在项目发布时的承诺:而根据与HTTP的对比测试,事实显示SPDY平均可以降低大约64%的页面读取时间!同样的页面,同样的TCP管道,只是协议不同。

关于SPDY的变化和特性简单说来就是:真正的请求pipelining,没有FIFO限制,同时消息帧机制可以有效简化客户端和服务端的开发,强制压缩(包括头部),调度优先级,甚至双向通讯(服务器push),让我们继续深入看看。

不同于HTTP,SPDY中的每个请求都有一个stream ID,这让我们可以使用单个TCP通道来在服务器和客户端之间并行传输数据:我们可以在同一时间通过同一个通道响应多个资源请求,只需要识别出数据对应的stream就可以了,为了实现这一点,SPDY协议定义了两种非常简单的二进制帧类型:控制帧数据帧

另外,在HTTP载荷被压缩时,HTTP头依然在以明文形式传输,而SPDY会使用一个预定义的字典来压缩所有的头部元数据,同样,因为SPDY支持真正的pipelining,我们就可以为每个资源请求分配一个优先级(比如HTML优先,JS第二),还有,为什么不让浏览器一次性发起所有请求呢?简单点说,如果服务器知道你要抓取那个页面,那么它就会在客户端解析完HTML之前”提示“客户端还需要加载哪些图片-服务器推送!

SPDY应用

事实上,Chomium项目已经完成了对SPDY的初步集成和测试,Google的chrome浏览器也已经内置了SPDY支持,并且如果没有意外,Google的服务器也已经支持SPDY了,换句话说,如果你使用chrome,那么当你访问Google的服务时,你已经在使用SPDY加载页面而不是http了。

想要自己体验SPDY?可以看看这个Apache插件(mod-spdy),以及Python实现,或者Ruby的spdy gem,目前这个Ruby的spdy解析器尚未完工,但是它已经可以解析收到的数据,并为SPDY客户端生成响应,可以试试这个hello world例子:

$: << 'lib' << '../lib'

require 'eventmachine'
require 'spdy'

class SPDYHandler < EM::Connection
def post_init
@parser = SPDY::Parser.new
@parser.on_headers_complete do |stream_id, associated_stream, priority, headers|
p [:SPDY_HEADERS, headers]

sr = SPDY::Protocol::Control::SynReply.new
h = {'Content-Type' => 'text/plain', 'status' => '200 OK', 'version' => 'HTTP/1.1'}
sr.create(:stream_id => 1, :headers => h)
send_data sr.to_binary_s

p [:SPDY, :sent, :SYN_REPLY]

d = SPDY::Protocol::Data::Frame.new
d.create(:stream_id => 1, :data => "This is SPDY.")
send_data d.to_binary_s

p [:SPDY, :sent, :DATA]

d = SPDY::Protocol::Data::Frame.new
d.create(:stream_id => 1, :flags => 1)
send_data d.to_binary_s

p [:SPDY, :sent, :DATA_FIN]
end

start_tls
end

def receive_data(data)
@parser << data
end

def unbind
p [:SPDY, :connection_closed]
end
end

EM.run do
EM.start_server '0.0.0.0', 10000, SPDYHandler
end

# (1) start the SPDY eventmachine server
# > ruby spdy_server.rb
#
# (2) start Chrome and force it to use SPDY over SSL.. on OSX:
# > /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --use-spdy=ssl
#
# (3) visit https://localhost:10000/


通向HTTP 2.0,还是其它?

SPDY提供了如此多的好处,但奇怪的却没有引起多大的反响,就连Google自己也在发布声明后就没了动静——低延迟的Web服务还是非常吸引人的,或许他们的低调是出于某种考虑吧,不管怎么说,这是一个开发的协议,并且值得关注。

本文翻译自: "Life beyond HTTP 1.1: Google’s SPDY", 作者:Ilya Grigorik


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值