`
wy1208
  • 浏览: 1529 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

探究Google SPDY

阅读更多

1.HTTP协议的不足

1)单路连接

     最初的HTTP 1.0规范规定了在每一个单独的请求/相应之后都必须关闭与服务器间的连接:也就是说连接无法重用,必须为每次请求重新创建一条新的TCP连接。

     HTTP 1.1的最大改变就是针对这个问题的:将连接默认为"keep-alive",并且介绍了一个"pipelining"的特性,keep-alive可以在多个请求之间重用TCP连接,而pipelining则允许一次发起多个请求。如今,keep-alive已经被大部分服务器和客户端所接受,但是pipelining却在大多数浏览器中被默认禁用(除了opera)。

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


                       

 

2)只允许客户端主动发起请求

     在HTTP协议中,只允许客户端发起请求。即使在服务器知道客户端需要的资源,也只能等待客户端主动请求相应的资源。

3)HTTP头冗余及未压缩

     HTTP 头在同一个会话里是反复发送的,中间的冗余信息,比如 User-Agent、Host 等不需要重复发送的信息也在反复发送,另外HTTP头没有被压缩,浪费带宽和资源。

2.SPDY 结构及特性

    SPDY 协议只是在性能上对 HTTP 做了很多的优化,其核心思想是复用TCP连接,SPDY对于 HTTP 的语义并没有修改,只是修改了传送HTTP内容的方式。

    1)SPDY实现

         SPDY强制使用SSL协议,SDPY在SSL之上增加了Session层,用来实现多路复用,在一个TCP连接中交错发送多个流(streams)。     

 


                 

 

 

   2)SPDY特性

        i)基本特性

           多路复用:SPDY 规定在一个 SPDY 连接内可以有无限个并发请求,即允许多个并发 HTTP 请求共用一个 TCP会话;

           请求优先级:SPDY 可以设置请求优先级,而不像HTTP 那样严格按照FIFO处理请求,它会优先传输重要的资源,这样可以避免让非关键资源占用网络通道的问题,提升性能;

           HTTP头压缩:舍弃掉了不必要的头信息,并对头信息进行压缩,降低数据传输量。

        ii)高级特性:
           服务器推送(server push):服务器可以主动向客户端推送数据,适合在初始页面时使用。例如,用户访问平安主页,当服务器收到用户的请求后,可直接向用户推送主页上的css,js,图片等资源,不需要像HTTP那样等用户收到页面,解析页面后再逐一向服务端请求。

           服务器提示(server hint) : 服务器建议客户端应该请求某些资源,适合在非初始页面时使用。该特性中,服务器是不能主动向客户端发送数据的。 

3.具体实现

   SPDY是建立在TCP可靠传输之上的,并且是长连接。

   SPDY标准包含两层,framing layer和HTTP layer。framing layer使用帧来实现TCP连接的多路复用;HTTP layer定义了在framing layer之上实现HTTP请求和响应的机制。

   在浏览器中访问Google主页,对比其在HTTP和SPDY协议下的实现,来说明SPDY怎样实现多路复用,优先级设定等特性,下图为HTTP实现与SPDY实现流程对比。


    1)SPDY framing layer

        SPDY在Framing layer定义了两种帧,控制帧和数据帧。通过这两种帧,可实现全双工流(stream),SPDY中的每个请求都有一个stream ID,服务器和客户端之间可以再单个TCP通道并行传输数据,在同一时间通过同一个通道响应多个资源请求,只需要识别出数据对应的stream就可以了。例如,上图中,使用SPDY协议向google服务器分别请求CSS,请求图片,都是一个stream,这些stream可以并发,每个流有不同的stream_id,用来区分不同的请求及其响应。

 


                                      

        为了管理一个stream,SPDY定义了三种控制帧,分别为:

        i)SYN_STREAM:创建一个新的stream。

        ii)SYN_REPLY:响应一个stream。

        iii)RST_STREAM:关闭一个steam。

    2)SPDY实现(无服务器推)

        客户端向服务器请求CSS:

        i)客服端发送SYN_STREAM创建一个新的stream,用来请求CSS。

          在SYN_STREAM帧中,使用Stream_ID来唯一标识该stream,并在Priority标志位说明该请求的优先级,优先级从0-7逐渐降低,服务器会首先处理优先级高的stream。

          在Name/Value Header blocker,这部分用来存储HTTP报头内容,例如cookie,host等等,并使用gzip进行压缩。

          stream的创建是异步的,在发送了SYN_STREAM创建流之后,不需要等待服务器回应,可立即发送数据帧。数据帧的Stream_ID需要与创建流控制帧的Stream_ID相同,Data所存储的内容即是HTTP报文的body部分。

        ii)服务端使用SYN_REPLY帧响应stream请求:

           服务端收到创建流的帧之后,对请求进行处理并响应,发送SYN_REPLY帧到客户端,应答帧的Stream_ID字段应该与创建帧的Stream_ID的字段相同,以便在客户端收到应答帧之后确认是对哪个请求的应答。

          与SYN_STREAM创建帧类似,应答帧SYN_REPLY也有Name/Value Header blocker,用来存储HTTP报文头。在应答帧发送之后的数据帧,用来传送HTTP报文的body内容。

        iii)发送RST_STREAM关闭流。

          Stream_ID字段表示要关闭的流。

     3)SPDY实现(服务器推)

        当客户访问Google主页时,客户端会创建一个流,该流的Stream_ID为5,当服务器收到创建流的控制帧之后,知道客户要访问Google主页,同时,服务端知道客户端主要需要的其他资源,如CSS,js,图片等。服务器可以主动创建流将这些资源发送到客户端。

        服务端向客户推送这些资源时,创建的流associated_stream_id说明了这个push stream对应哪个请求流。服务器推送CSS,js,图片分别创建三个不同的流,其流创建帧的associated_stream_id要为请求Google主页创建流的stream_id。

分享到:
评论

相关推荐

    SPDY

    SPDY(发音为 "speedy")是一种由Google开发的网络协议,旨在减少网页加载时间,提高用户在浏览网页时的性能体验。这个协议是在HTTP/1.1的基础上设计的,目标是解决HTTP/1.1存在的若干效率问题,如头部冗余、请求...

    SPDY英文文档(HTTP2基础)

    SPDY(Speedy)是Google开发的一种网络协议,它的目标是优化HTTP协议,减少网页的加载时间并提高网络通信的安全性。在HTTP2被广泛采用之前,SPDY被视为一种潜在的替代方案,它引入了两个关键特性:多路复用和压缩,...

    SPDY协议文档 (英文)

    SPDY(读作“speedy”)是一种由Google设计并开发的网络传输协议,旨在为万维网上的内容提供低延迟的传输服务。该协议的设计目的是减少网页加载时间,并提高用户体验。SPDY通过引入两个层次的协议来实现这一目标:...

    Node.js-spdy-node.js中的SPDY服务器

    而SPDY(发音为 "speedy")是Google提出的一种网络协议,旨在提高网页加载速度,减少延迟,优化用户体验。它在HTTP的基础上进行了改进,尤其是对多路复用的支持,减少了TCP连接的数量。 **SPDY协议的特性** 1. **多...

    mod-spdy-beta_current_i386.rpm

    SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强。新协议的功能包括数据流的多路复用、请求优先级...谷歌已经开发一个网络服务器原型机,以及支持SPDY协议的Chrome浏览器版本。 该文件是apache支持SPDY的扩展

    Chrome插件HTTP/2 and SPDY indicator

    Chrome插件HTTP/2 and SPDY indicator,安装完毕后访问启用HTTP2的站点,如果地址栏出现蓝色的闪电,说明站点已启用HTTP2.0

    HTTP SPDY客户端开发包okhttp.zip

    okhttp 是一个 Java 的 HTTP SPDY 客户端开发包,同时也支持 Android。 示例代码: OkHttpClient client = new OkHttpClient(); String get(URL url) throws IOException { HttpURLConnection connection = ...

    第十二章:SPDY.pdf

    SPDY(发音同“Speedy”)是由Google开发的一种基于传输控制协议(TCP)的应用层协议,旨在优化互联网上的网页加载速度和提高安全性。SPDY的目标是通过压缩、多路复用和优先级调度来减少延迟,从而加快网页的加载时间...

    SPDY for iPhone.zip

    SPDY (Speedy) 是一种由 Google 开发的网络协议,旨在提高网页加载速度,降低延迟,优化用户在互联网上的体验。它通过压缩头部信息、多路复用连接以及优先级排序等技术,显著提高了HTTP协议的效率。对于iPhone应用...

    支持SPDY的Web服务器KORE.zip

    KORE 是一个用 C 语言开发的支持 SPDY 的 Web 服务器。支持 Linux 和 BSD 系统。 特性: - Supports SNI - Supports SPDY/3 - Supports HTTP/1.1 - Secure by default - SSL connections only - Virtual host ...

    node-spdy:Node.js上的SPDY服务器

    用法例子服务器: var spdy = require ( 'spdy' ) , fs = require ( 'fs' ) ;var options = { // Private key key : fs . readFileSync ( __dirname + '/keys/spdy-key.pem' ) , // Fullchain file or cert file &#...

    为Nginx添加SPDY功能

    SPDY是一种由Google主导的网络传输协议,旨在加快网页加载速度和提升网络传输效率。它是基于TCP的应用层协议,并被设计为HTTP的替代者或增强者。SPDY透过多路复用流、优先级请求、压缩头部等技术来优化网络传输。 ...

    前端开源库-spdy-push

    SPDY(发音为 "speedy")是Google提出的一种网络传输协议,设计目标是优化网页加载速度,减少页面渲染时间。SPDY在HTTP/1.1的基础上进行了改进,引入了多路复用、优先级排序、头部压缩等特性,其中SPDY Push技术是其...

    前端开源库-spdy-keys

    SPDY是由Google开发的一种网络传输协议,旨在优化网页加载速度,减少延迟,并提高用户访问网站的安全性。它在HTTP/2之前被广泛使用,为HTTP提供了一种更高效的替代方案。 首先,让我们详细了解一下SPDY协议。SPDY的...

    Nginx(Tengine)启用 SPDY 支持的配置方法

    SPDY(Speedy)是由Google提出的一种网络传输协议,旨在解决HTTP协议的性能瓶颈问题,特别是为了提升网页加载速度。HTTP协议的局限性在于它不支持多路复用,每次请求和响应都需要建立新的TCP连接,这在高延迟的网络...

    spdy, SPDY是一种旨在减少网页延迟的协议.zip

    spdy, SPDY是一种旨在减少网页延迟的协议 SPDYSPDY是一个实验协议,旨在减少网页的延迟。 SPDY v2草案是HTTPbis工作组领导的HTTP 2.0计划的基础。 在实验室测试中,SPDY显示页面加载时间减少 64% ! 有关详细信息,...

    spedye: A reverse proxy for the HTTPS and SPDY protocols

    而"SPDY"(Speedy)是由Google开发的一种网络传输协议,旨在提高网页加载速度,通过减少延迟和优化HTTP协议来改善用户体验。"HTTPS"则是HTTP协议的安全版本,通过SSL/TLS协议提供数据加密、服务器身份验证和消息完整...

Global site tag (gtag.js) - Google Analytics