1.什么是SPDY?

简单地说,在SSL层上增加一个SPDY会话层,以在一个TCP连接支持并发的HTTP请求。也就是他能通过复用仅仅一条(或几条)TCP连接,在客户端与服务器间发送几十个请求或回应。

SPDY(speedy)是google开发的基于TCP的应用层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验。SPDY并不是一种替代HTTP的协议,而是对HTTP协议的增强。新协议的功能包括数据流的多路复用、请求优先级以及HTTP报头压缩。引入SPDY协议后,在实验室测试中页面加载速度比原先快64%。不过在实际生活中的网站上我没发现有这么大的进步。老实说,我的测试表明SPDY仅比HTTPS快一点点,同时还比HTTP要慢。

2.原理及特征

在SSL层上增加一个SPDY会话层,以在一个TCP连接中实现并发流。

通常的HTTP GET和POST格式仍然是一样的;然而SPDY为编码和传输数据设计了一个新的帧格式。
流是双向的,可以在客户端和服务器端启动。
SPDY旨在通过基本(始终启用)和高级(可选启用)功能实现更低的延迟。
基本特征
  • 复用流:SPDY允许在一个连接上无限制并发流。因为请求在一个通道上,TCP效率更高:更少的网络连接,发出更少更密集的数据包。
  • 请求优先级:虽然无限的并发流解决了序列化的问题,但他们引入了另一个问题:如果带宽通道受限制, 客户端可能会因防止堵塞通道而阻止请求。为了克服这个问题,SPDY实行请求优先级:客户端从服务器端请求它希望的项目数量,并为每个请求分配一个优先级。这可以防止在网络通道被非关键资源堵塞时,高优先级的请求被挂起。
  • HTTP报头压缩:SPDY压缩请求和响应HTTP报头,从而减少传输的数据包数量和字节数。
高级特征
SPDY提供了高级特征:服务器启动流。服务器启动流能用来分发内容到客户端,而不需要客户端发起请求。此选项可以由Web开发人员通过如下两种方法配置:
  1. Server push:SPDY通过X-Associated-Content头试验了服务器推送数据给客户端的选项。这个头告诉客户端服务器将在客户端请求资源之前,推送资源给它。对于初始页面下载(例如用户初次访问这个网站),这样能大大提升用户体验。
  2. Server hint:相对于自动推送资源到客户端,在服务器事先知道客户端需要的资源的情况下,服务器使用X-Subresources头建议客户端请求特殊的资源。但是,服务器仍然在发送内容前等待客户请求。通过窄带,这个选项能减少一个客户端发现它所需要的资源的数百毫秒,可能更适合于非初始页面加载。

3.然而SPDY的测试表现并非如此

SPDY有许多原因没有改善性能,但以下两个问题很明显:

1.域名使用过多

Web页面使用许多不同的域,SPDY在每个域都要建立连接。这意味着在多个跨域请求的时候SPDY并不能减少连接,此时SPDY的价值会减弱。

2.资源阻塞

Web页面的其他瓶颈导致SPDY无法发起请求。例如,SPDY无法预防脚本阻塞,也不能使CSS无阻塞渲染。SPDY比HTTP好,但大多数页面的瓶颈不在HTTP协议上。

加载一个网页并不是简简单单的并行下载完所有资源就搞定了。比如说当加载一个网页时,浏览器一般不会下载任何图片,除非JavaScript和CSS文件获取完毕并得到处理。CSS文件也有可能导入其他CSS文件,浏览器还没先进到能预测这种情况。有些脚本也会产生需要浏览器加载的新资源。
SPDY对这种延迟无能为力,并且总的来说我能断定相关的浏览器行为并无改变。对于许多(要么就是大多数)网页来说,这些延迟才是真正的瓶颈,只留下极少的空间给SPDY发挥。 

浅析SPDY的更多相关文章

  1. HTTPS、SPDY和HTTP/2的性能比较

    http://www.infoq.com/cn/news/2015/02/https-spdy-http2-comparison/ https://segmentfault.com/a/1190000 ...

  2. 【转载】浅析从外部访问 Kubernetes 集群中应用的几种方式

    一般情况下,Kubernetes 的 Cluster Network 是属于私有网络,只能在 Cluster Network 内部才能访问部署的应用.那么如何才能将 Kubernetes 集群中的应用 ...

  3. SQL Server on Linux 理由浅析

    SQL Server on Linux 理由浅析 今天的爆炸性新闻<SQL Server on Linux>基本上在各大科技媒体上刷屏了 大家看到这个新闻都觉得非常震精,而美股,今天微软开 ...

  4. 【深入浅出jQuery】源码浅析--整体架构

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  5. 高性能IO模型浅析

    高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking  ...

  6. netty5 HTTP协议栈浅析与实践

      一.说在前面的话 前段时间,工作上需要做一个针对视频质量的统计分析系统,各端(PC端.移动端和 WEB端)将视频质量数据放在一个 HTTP 请求中上报到服务器,服务器对数据进行解析.分拣后从不同的 ...

  7. Jvm 内存浅析 及 GC个人学习总结

    从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C ...

  8. 从源码浅析MVC的MvcRouteHandler、MvcHandler和MvcHttpHandler

    熟悉WebForm开发的朋友一定都知道,Page类必须实现一个接口,就是IHttpHandler.HttpHandler是一个HTTP请求的真正处理中心,在HttpHandler容器中,ASP.NET ...

  9. 【深入浅出jQuery】源码浅析2--奇技淫巧

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

随机推荐

  1. css3常用样式

    .box{ //改变轴的方向 flex-direction:column; //两端对齐 justify-content:space-between; //换行 flex-wrap: wrap; // ...

  2. 使用WSGI创建REST接口

    问题 你想使用一个简单的REST接口通过网络远程控制或访问你的应用程序,但是你又不想自己去安装一个完整的web框架. 解决方案 构建一个REST风格的接口最简单的方法是创建一个基于WSGI标准(PEP ...

  3. Python中GUI库PyQt5的安装和配置

    在使用Tkinter开发GUI程序时,发现相关文档比较少,开发起来太累.经过综合比较,决定使用PyQt这个库.下面是简单的安装步骤. 1.安装 PyQt5 : pip install PyQt5 -i ...

  4. Win7自带的系统备份还原功能如何去使用?

    很多用户都会反映Win7系统使用过程中会出现系统或应用程序方面的小故障,针对这些小问题,再选择进行电脑系统的重装就有些过于麻烦了. 其实Win7系统内带有系统备份和还原的功能,可以在电脑系统出现小问题 ...

  5. resultMap自定义映射---8.3.1. 解决列名(表中的字段名称)和实体类中的属性名不一致

    1.1.1.1.      步骤一:将驼峰匹配注释掉 --------------测试完成后仍然 回来开启  其他地方可能用到 一旦注释掉驼峰匹配,那么再通过queryUserById查询的结果中,用 ...

  6. RHEL7网络管理NetworkManager和nmcli指令

    1.NetworkManager简介 在 Red Hat Enterprise Linux 7 中,NetworkManager 提供的默认联网服务是一个动态网络控制和配置守护 进程,它尝试在其可用时 ...

  7. 使用metamask钱包

    一.安装火狐浏览器metamask插件 打开火狐浏览器的附件组件,搜索metamask 点击第一个 点击“添加到Firefox” 添加成功后,浏览器右上角有一个狐狸标志 点击这个标志,打开插件 二.创 ...

  8. Mysql索引类型分析

    一.简介   MySQL目前主要有以下几种索引类型:   1.普通索引   2.唯一索引   3.主键索引   4.组合索引   5.全文索引   二.语句 CREATE TABLE table_na ...

  9. Python:多线程threading模块

    目录 Thread对象 Lock对象 local对象 Thread对象: 多任务可以由多进程完成,也可以由一个进程内的多线程完成.进程是由至少1个线程组成的. threading模块在较低级的模块 _ ...

  10. 开启防火墙如何部署k8s

    你可以不关闭防火墙,只需要开启这些端口就行了MASTER节点6443* Kubernetes API server 2379-2380 etcd server client API 10250 Kub ...