www.22138com「太阳集团游戏」太阳2007娱乐官方网址

欢迎更多朋友与我们www.22138com合作,太阳集团游戏是由安全软件管理软件整合而成的最新安全卫士,其实这是因为目前已经推出了太阳2007娱乐官方网址的新网址,带您体验至尊级享受!。

原文出处

2019-06-01 03:14 来源:未知

HTTP2 Server Push的研究

2017/01/05 · 基础手艺 · HTTP/2

原来的书文出处: AlloyTeam   

1,HTTP2的新特征。

有关HTTP2的新特征,读着能够参谋作者事先的文章,这里就不在多说了,本篇文章首要讲一下server push这几个特点。

HTTP,HTTP贰.0,SPDY,HTTPS你应有明了的一对事

 

2,Server Push是什么。

总结来说就是当用户的浏览器和服务器在创造链接后,服务器主动将部分能源推送给浏览器并缓存起来,那样当浏览器接下去请求这个能源时就径直从缓存中读取,不会在从服务器上拉了,提高了速率。举3个例证正是:

就算一个页面有一个财富文件index.html,index.css,index.js,当浏览器请求index.html的时候,服务器不唯有再次来到index.html的剧情,同一时间将index.css和index.js的原委push给浏览器,当浏览器后一次央求那二多个文件时就能够直接从缓存中读取了。

叁,Server Push原理是怎么。

要想驾驭server push原理,首先要精通一些定义。大家清楚HTTP贰传输的格式并不像HTTP壹使用文本来传输,而是启用了贰进制帧(Frames)格式来传输,和server push相关的帧首要分为这两种等级次序:

  1. HEADETucsonS frame(请求重回头帧):这种帧首要指点的http请求头新闻,和HTTP一的header类似。
  2. DATA frames(数据帧) :这种帧存放真正的数额content,用来传输。
  3. PUSH_PROMISE frame(推送帧):这种帧是由server端发送给client的帧,用来代表server push的帧,这种帧是落到实处server push的基本点帧类型。
  4. RST_STREAM(撤消推送帧):这种帧表示请求关闭帧,轻便讲正是当client不想接受一些能源依旧收受timeout时会向发送方发送此帧,和PUSH_PROMISE frame一同使用时表示拒绝只怕关闭server push。

Note:HTTP二.0有关的帧其实包涵太阳2007娱乐官方网址,10种帧,便是因为尾巴部分数据格式的变动,才为HTTP2.0拉动大多的表征,帧的引入不只有有益于减弱数量,也造福数据的安全性和有限辅助传输性。

刺探了相关的帧类型,上边正是现实server push的贯彻进度了:

  1. 由多路复用我们能够领悟HTTP第22中学对此同多个域名的伸手会使用一条tcp链接而用不相同的stream ID来分别各自的伏乞。
  2. 当client使用stream 壹请求index.html时,server符合规律管理index.html的伸手,并能够得知index.html页面还将在会呈请index.css和index.js。
  3. www.22138com,server使用stream 1发送PUSH_PROMISE frame给client告诉client笔者那边能够使用stream 二来推送index.js和stream 三来推送index.css财富。
  4. server使用stream 一通常的出殡和埋葬HEADE汉兰达S frame和DATA frames将index.html的从头到尾的经过重返给client。
  5. client接收到PUSH_PROMISE frame得知stream 二和stream 3来选取推送财富。
  6. server得到index.css和index.js便会发送HEADEPAJEROS frame和DATA frames将财富发送给client。
  7. client得到push的能源后会缓存起来当呼吁这一个能源时会从平素从从缓存中读取。

下图表示了全方位流程:

www.22138com 1

4,Server Push怎么用。

既然server push这么美妙,那么大家什么行使啊?怎么设置服务器push哪些文件呢?

第二并不是有所的服务器都扶助server push,nginx近些日子还不帮助这一个本性,能够在nginx的官方博客上赢得表明,不过Apache和nodejs都已经帮助了server push那叁个特点,须求验证一些的是server push那本性子是依据浏览器和服务器的,所以浏览器并不曾提供对应的js api来让用户直接操作和决定push的剧情,所以只可以是通过header新闻和server的布署来落到实处具体的push内容,本文首要以nodejs来验证具体怎么使用server push这一特征。

防微杜渐职业:下载nodejs http2支撑,本地运转nodejs服务。

1. 率先我们应用nodejs搭建基本的server:

JavaScript

var http二 = require('http贰');   var url=require('url'); var fs=require('fs'); var mine=require('./mine').types; var path=require('path');   var server = http二.createServer({   key: fs.readFileSync('./zs/localhost.key'),   cert: fs.readFileSync('./zs/localhost.crt') }, function(request, response) {     var pathname = url.parse(request.url).pathname;     var realPath = path.join("my", pathname);    //这里安装本人的文件名称;       var pushArray = [];     var ext = path.extname(realPath);     ext = ext ? ext.slice(1) : 'unknown';     var contentType = mine[ext] || "text/plain";       if (fs.existsSync(realPath)) {           response.writeHead(200, {             'Content-Type': contentType         });           response.write(fs.readFileSync(realPath,'binary'));       } else {       response.writeHead(404, {           'Content-Type': 'text/plain'       });         response.write("This request URL " pathname " was not found on this server.");       response.end();     }   });   server.listen(443, function() {   console.log('listen on 443'); });

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
var http2 = require('http2');
 
var url=require('url');
var fs=require('fs');
var mine=require('./mine').types;
var path=require('path');
 
var server = http2.createServer({
  key: fs.readFileSync('./zs/localhost.key'),
  cert: fs.readFileSync('./zs/localhost.crt')
}, function(request, response) {
    var pathname = url.parse(request.url).pathname;
    var realPath = path.join("my", pathname);    //这里设置自己的文件名称;
 
    var pushArray = [];
    var ext = path.extname(realPath);
    ext = ext ? ext.slice(1) : 'unknown';
    var contentType = mine[ext] || "text/plain";
 
    if (fs.existsSync(realPath)) {
 
        response.writeHead(200, {
            'Content-Type': contentType
        });
 
        response.write(fs.readFileSync(realPath,'binary'));
 
    } else {
      response.writeHead(404, {
          'Content-Type': 'text/plain'
      });
 
      response.write("This request URL " pathname " was not found on this server.");
      response.end();
    }
 
});
 
server.listen(443, function() {
  console.log('listen on 443');
});

这几行代码正是简单搭建三个nodejs http二服务,打开chrome,大家能够观察有着请求都走了http二,同一时候也得以印证多路复用的性子。

www.22138com 2

太阳集团游戏,此地需求注意几点:

  1. 创立http贰的nodejs服务必须时根据https的,因为前天主流的浏览器都要援救SSL/TLS的http二,证书和私钥能够团结通过OPENSSL生成。
  2. node http二的连带api和例行的node httpserver一样,可以一向运用。

  3. 安装我们的server push:

JavaScript

var pushItem = response.push('/css/bootstrap.min.css', {        request: {             accept: '*/*'        },       response: {             'content-type': 'text/css'      } }); pushItem.end(fs.readFileSync('/css/bootstrap.min.css','binary'));

1
2
3
4
5
6
7
8
9
var pushItem = response.push('/css/bootstrap.min.css', {
       request: {
            accept: '*/*'
       },
      response: {
            'content-type': 'text/css'
     }
});
pushItem.end(fs.readFileSync('/css/bootstrap.min.css','binary'));

大家设置了bootstrap.min.css来因而server push到我们的浏览器,大家得以在浏览器中查阅:

www.22138com 3

能够看来,运转server push的能源timelime非常的慢,大大加速了css的得到时间。

那边需求专注上边几点:

  1. 咱俩调用response.push(),就是也正是server发起了PUSH_PROMISE frame来告诉浏览器bootstrap.min.css将会由server push来获得。
  2. response.push()再次回到的靶丑时二个例行的ServerResponse,end(),writeHeader()等方法都得以健康调用。
  3. 这里一旦针对某些能源调用response.push()即发起PUSH_PROMISE frame后,要搞好容错机制,因为浏览器在下一次央求那个财富时会且只会等待那些server push回来的财富,这里要做好超时和容错即下边包车型大巴代码:
  4. JavaScript

    try {     pushItem.end(fs.readFileSync('my/css/bootstrap.min.css','binary'));     } catch(e) {        response.writeHead(404, {            'Content-Type': 'text/plain'        });        response.end('request error'); }   pushItem.stream.on('error', function(err){     response.end(err.message); });   pushItem.stream.on('finish', function(err){    console.log('finish'); });

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    try {
        pushItem.end(fs.readFileSync('my/css/bootstrap.min.css','binary'));
        } catch(e) {
           response.writeHead(404, {
               'Content-Type': 'text/plain'
           });
           response.end('request error');
    }
     
    pushItem.stream.on('error', function(err){
        response.end(err.message);
    });
     
    pushItem.stream.on('finish', function(err){
       console.log('finish');
    });

    地方的代码你可能会意识众多和健康nodejs的httpserver不等同的事物,那正是stream,其实任何http2都以以stream为单位,这里的stream其实能够领略成2个伸手,越多的api能够参见:node-http2。

  5. 最后给大家推荐多少个老外写的极度服务http贰的node server有兴趣的能够品味一下。

5,Server Push相关难点。

  1. 大家知晓以往大家web的财富一般都是身处CDN上的,那么CDN的优势和server push的优势有什么差别吗,到底是哪位相当慢吧?那么些难点作者也平昔在切磋,本文的连锁demo都只好算做八个示范,具体的线上施行还在开始展览中。
  2. 是因为HTTP二的部分新特征比如多路复用,server push等等都是依附同一个域名的,所以那大概会对我们事先对于HTTP1的片段优化措施比方(财富拆分域名,合并等等)不自然适用。
  3. server push不止能够看做拉取静态财富,我们的cgi请求即ajax请求同样可以采纳server push来发送数据。
  4. 最完善的结果是CDN域名协助HTTP2,web server域名也还要帮忙HTTP二。

 

参照他事他说加以调查资料:

  1. HTTP2官方正式:
  2. 维基百科:
  3. 1 赞 1 收藏 评论

www.22138com 4

版权声明:本文由太阳集团发布于太阳2007娱乐官方网址,转载请注明出处:原文出处