代码改变世界

SPDY以及示例

2013-10-15 19:52  sniper007  阅读(585)  评论(0编辑  收藏  举报

SPDYGoogle开发的基于传输控制协议(TCP)的应用层协议 。Google最早是在Chromium中提出的SPDY协议[1]。目前已经被用于Google Chrome浏览器中来访问Google的SSL加密服务。

SPDY当前并不是一个标准协议,但SPDY的开发组已经开始推动SPDY成为正式标准(现为互联网草案[2]),Google Chrome[3]Mozilla FirefoxOperaInternet Explorer[4]均已支持SPDY协议。SPDY协议类似于HTTP,但旨在缩短网页的加载时间和提高安全性。SPDY协议通过压缩、多路复用和优先级来缩短加载时间[1]。SPDY并不是首字母缩略字,而仅仅是"speedy"的缩写。SPDY现为Google的商标[5]

设计

设计SPDY的目的在于降低网页的加载时间[6]。通过优先级和多路复用,SPDY使得只需要建立一个TCP连接即可传送网页内容及图片等资源[1][7]。SPDY中广泛应用了TLS加密,传输内容也均以gzipDEFLATE格式压缩(与HTTP不同,HTTP的头部并不会被压缩)。另外,除了像HTTP的网页服务器被动的等待浏览器发起请求外,SPDY的网页服务器还可以主动推送内容[8]

与HTTP的关系

SPDY并不用于取代HTTP,它只是修改了HTTP的请求与应答在网络上传输的方式[1]; 这意味着只需增加一个SPDY传输层,现有的所有服务端应用均不用做任何修改。 当使用SPDY的方式传输,HTTP请求会被处理、标记简化和压缩。比如,每一个SPDY端点会持续跟踪每一个在之前的请求中已经发送的HTTP报文头 部,从而避免重复发送还未改变的头部。而还未发送的报文的数据部分将在被压缩后被发送。

浏览器支持

Google ChromeChromium已经支持SPDY[9][10].

Mozilla Firefox自11.0开始内嵌支持SPDY,但默认并不使用[11][12]。从Firefox 13开始默认开启对SPDY的支持[13]

Opera从12.10开始支持SPDY.[14][15][16]

IE将在IE11开始支持SPDY。[4]

以上来自维基百科  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下打开网络请求,如下