SPDY以及示例
2013-10-15 19:52 sniper007 阅读(585) 评论(0) 编辑 收藏 举报SPDY是Google开发的基于传输控制协议(TCP)的应用层协议 。Google最早是在Chromium中提出的SPDY协议[1]。目前已经被用于Google Chrome浏览器中来访问Google的SSL加密服务。
SPDY当前并不是一个标准协议,但SPDY的开发组已经开始推动SPDY成为正式标准(现为互联网草案[2]),Google Chrome[3],Mozilla Firefox,Opera和Internet Explorer[4]均已支持SPDY协议。SPDY协议类似于HTTP,但旨在缩短网页的加载时间和提高安全性。SPDY协议通过压缩、多路复用和优先级来缩短加载时间[1]。SPDY并不是首字母缩略字,而仅仅是"speedy"的缩写。SPDY现为Google的商标[5]。
设计
设计SPDY的目的在于降低网页的加载时间[6]。通过优先级和多路复用,SPDY使得只需要建立一个TCP连接即可传送网页内容及图片等资源[1][7]。SPDY中广泛应用了TLS加密,传输内容也均以gzip或DEFLATE格式压缩(与HTTP不同,HTTP的头部并不会被压缩)。另外,除了像HTTP的网页服务器被动的等待浏览器发起请求外,SPDY的网页服务器还可以主动推送内容[8]。
与HTTP的关系
SPDY并不用于取代HTTP,它只是修改了HTTP的请求与应答在网络上传输的方式[1]; 这意味着只需增加一个SPDY传输层,现有的所有服务端应用均不用做任何修改。 当使用SPDY的方式传输,HTTP请求会被处理、标记简化和压缩。比如,每一个SPDY端点会持续跟踪每一个在之前的请求中已经发送的HTTP报文头 部,从而避免重复发送还未改变的头部。而还未发送的报文的数据部分将在被压缩后被发送。
浏览器支持
Google Chrome和Chromium已经支持SPDY[9][10].
Mozilla Firefox自11.0开始内嵌支持SPDY,但默认并不使用[11][12]。从Firefox 13开始默认开启对SPDY的支持[13]。
Opera从12.10开始支持SPDY.[14][15][16]
以上来自维基百科 http://zh.wikipedia.org/wiki/SPDY
DEMO
以下是DEMO页面
服务基于nodejs
nodejs 安装命令:
npm install spdy
github 地址: https://github.com/indutny/node-spdy
下载github包,然后解压,example里面有hello_world,我把app.js修改了下
如下
1 var fs = require('fs'), 2 spdy = require('../../'); 3 var Buffer = require('buffer').Buffer; 4 5 var options = { 6 key: fs.readFileSync('keys/spdy-key.pem'), 7 cert: fs.readFileSync('keys/spdy-cert.pem'), 8 ca: fs.readFileSync('keys/spdy-csr.pem') 9 }; 10 11 var big = new Buffer(16 * 1024); 12 for (var i = 0; i < big.length; i++) { 13 big[i] = '0'.charCodeAt(0) + (i % 10); 14 } 15 16 var server = spdy.createServer(options, function(req, res) { 17 if (req.url !== '/') { 18 res.writeHead(404); 19 res.end(); 20 return; 21 } 22 23 res.push('/' + Math.random() + '.txt', { 24 'Content-Type': 'text/plain' 25 }, function(err, stream) { 26 console.log('Push start'); 27 if (err) 28 return console.error(err); 29 stream.on('error', function(err) { 30 console.error('Push error', err); 31 }); 32 stream.write(big, function() { 33 console.error('Push done'); 34 }); 35 stream.end(); 36 }); 37 res.writeHead(200, { 38 "Content-Type": "text/plain" 39 }); 40 res.end('ok good'); 41 }); 42 43 server.listen(3232, function() { 44 var addr = this.address(); 45 console.log('Server is listening on %s:%d', 'localhost', addr.port); 46 });
运行 浏览器敲入 https://localhost:3232/
firefox下打开网络请求,如下