阅读更多

0顶
0踩

Web前端
HTTP/2 的目标

2015 年 2 月,互联网工程任务组(IETF)批准了 HTTP/2 标准提案,1999 年 HTTP/1.1 正式标准化 ,而 HTTP/2 是自那时以来的首个重大升级。HTTP/2 的主要目标是与 HTTP/1.1 完全语义兼容的基础上,进一步减少网络延迟。换句话说,HTTP/2 要在不破坏原有 Web 体系的基础上使它变得更快。

SPDY 的起源

自 2009 年底以来,Google 一直在开发一个实验性的协议,这个神秘的协议名叫 SPDY(读作 speedy)。SPDY 并不是一个首字母缩略词,其实,它是 Google 注册的一个商标,HTTP/2 正是起源于这个 SPDY 实验。事实上,后来有许多曾经参与 SPDY 项目的核心开发者同样也加入到 HTTP/2 的开发中去。在 2015 年 2 月,Google正式宣布停止支持 SPDY 计划,全力支持 HTTP/2 的开发,预计在 2016 年前实现全部功能。

HTTP/1.1

自 1999 年以来,HTTP/1.1 默默地为我们服务了十几年,它是在当时那样的计算机和网络应用场景下被设计出来的。我不说你也知道,HTTP 早就应该升级了。为了便于描述 HTTP/1 是如何工作的,我在下面放了几张图解。根据序号的顺序你就会看到,从客户端开始(很可能是一个web浏览器)与右方的服务器建立一个 HTTP/1 的连接。

(2) 客户端/浏览器随后发送一个 GET 请求(HTTP 方法)获取 index.html 页面。 (3) 服务器响应客户端请求的资源。 (4-7) 在我们这个简单的示例中,这个不断进行的 请求-响应循环过程 持续地获取样式表和脚本来完善整个 HTML 文档。 (8) 最终,这个 HTTP/1 连接断开了。

线头阻塞(Head-of-Line Blocking)

如你所见,客户端/浏览器 花费大量的时间等待每一个资源被响应。因为 HTTP/1 不能在同一个连接上进行并发请求,浏览器通常需要开启多个连接来加速请求资源的过程。

代价高昂的连接

即使开启多个连接能有效提高资源的加载速度,但是从计算机网络的角度来看,开启每一个连接的代价都很高。所以,现代浏览器通常都有最多 6-8 个 HTTP/1.1 连接的限制,许多网站现在需要加载 80多个或者更多的资源,这些连接限制逐渐成为了整个 Web 系统的性能瓶颈。

HTTP 管线化(HTTP Pipelining)

HTTP/1.1 尝试利用一个名为 HTTP管线化的技术解决性能瓶颈问题,不幸的是,单一的大文件和过慢的响应仍然会阻塞所有后续的请求。HTTP管线化 不难部署,但你基本上不太可能去部署它,现代浏览器几乎都不怎么支持 HTTP 管线化的功能,因为许多媒介和服务器不能正确地处理它(译者注:可以参考 http://en.wikipedia.org/wiki/HTTP_pipelining 查看一下支持的平台)。

HTTP/2 多路复用(Multiplexing)

多路复用允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息,为了向你们量化展示一个 HTTP/2 连接到底快多少,我准备了一套并排的图对比 HTTP/2 与 HTTP/1 的性能,在这个简单的示例中只请求 3 个资源,从 web 页面开始渲染到加载结束,HTTP/2 比 HTTP/1 节省不少时间。

推而广之,当 80 个资源复合请求时,与 HTTP/1.1 相比,很明显通过单一连接进行传递的 HTTP/2 更高效!



其它提高 HTTP/2 性能的因素

除了多路复用,HTTP/2 还是二进制的,与 HTTP/1 这样的文本协议相比,二进制协议解析起来更加高效。很显然,二进制的协议更适合在线路进行传输,并且更不容易出错。

HTTP/2 同时也减少了压缩头部的开销,这些在 HTTP/1 里都没有实现。

服务器推送(Server Push)

在 HTTP/2 中,服务器推送是指在客户端请求之前发送数据的机制。如果一个请求是由你的主页发起的,服务器很可能响应主页内容、logo以及样式表,因为它知道客户端会用到这些东西。这相当于在一个 HTML 文档内集合了所有的资源,不过与之相比,服务器推送有一个很大的优势:可以缓存!

当然这同时也是它的一个缺点,如果客户端已经缓存了数据,此时会产生不必要的冗余。这也是为什么我推荐服务器提示(Server Hints)的原因。

服务器提示(Server Hints)

服务器提示可以先于客户端检测到将要请求的资源,提前通知客户端,服务器不发送所有资源的实体,它只发送资源的 URL。客户端接到提示后进一步验证之前的缓存,如果发现需要这些资源,则正式发起请求。服务器提示对 HTTP/2 来说兴许不是最新的,但非常值得在这里顺便一提,因为它没有上文提到的服务器推送冗余的缺点。

服务器提示是通过 HTTP Link header 和与已实现的 link prefetching 语义重叠的部分来实现的。举个例子,一个 HTTP Link header 看起来是这样的:
Link: <https://example.com/images/large-background.jpg>; rel=prefetch

如果 HTML 文档的 head 标签中有一个 prefetch link标签,不需要在服务端有额外的实现,举个例子:
<link rel="prefetch" href="https://example.com/images/large-background.jpg">

了解更多有关 rel="prefetch" 的信息,参考 Mozilla 出品的 Link prefetching 常见问题。

进一步了解资源提示

预加载关联用于声明一个资源和它的 fetch 属性,这个规范通过额外的处理策略扩展了功能,有效地获取在下一个导航可能需要请求的资源,举个例子

一些浏览器中,loadpolicy="next inert" 等同于 rel=prefetch 这样的实现,loadpolicy 属性的 next 值在语义上与 rel=prerender 相同,这个规范对预获取和预渲染的功能进行了标准化,并且给他们扩展了额外的功能。

欲了解更多,移步发布在 W3C 的由 Ilya Grigorik 编辑的文章 资源提示。

HTTP/2 安全批判

尽管 HTTP/2 的主要目标是使网络更快,但是因为它不强制加密连接,目前饱受批判。还好的是,主导的浏览器厂商迄今为止都拒绝开发不加密的 HTTP/2,所以 HTTP/2 需要通过代理部署一个加密的连接。如果你不认为这对 Web 的未来大有裨益,请移步我的文章 HTTPS 无所不在。
浏览器支持

HTTP/2 现在或者将来会被所有主流浏览器支持。
  • Chrome 40 支持 HTTP/2 14 号草案,但是默认不开启。HTTP/2 17 号草案(也就是最终草案),现在可以在 Chrome Canary 43(开发者预览版)里使用了,目前只有基于 TLS(加密的)的 HTTP/2 实现。 如需在 Chrome 中启用 HTTP/2,访问: chrome://flags/#enable-spdy4
  • Firefox 支持 HTTP/2,在第 36 版中默认启用,早在第 34 版中,就已经开始添加针对 HTTP/2 的实验性支持。目前也只有基于 TLS 的HTTP/2 实现。
  • IE11 支持 HTTP/2,但是只在 Windows 10 Beta 版里默认启用。目前也只有基于 TLS 的 HTTP/2 实现。
  • Spartan 预计也会支持基于 TLS 的 HTTP/2,尽管微软为 Windows 10 打造的新浏览器的有关细节尚未完全曝光。
  • Safari 在 Mac OS X Yosemite(10.10)和 iOS 8 中默认支持 SPDY,对于 HTTP/2 的全支持预计在 2015 年底完成。
  • Opera 默认支持 SPDY。预计在 Chrome 全部实现 HTTP/2 最终草案的特性后全面支持 HTTP/2。

服务器支持
支持 HTTP/2

  • IIS(互联网信息服务)在 Windows 10 beta 版中支持 HTTP/2。
  • OpenLiteSpeed 1.3.8 和 1.4.5 支持 HTTP/2 第 17 号草案。

支持 SPDY,但不支持 HTTP/2

  • Apache 通过 mod_spdy 模块支持老版本的 SPDY,目前这个模块已经停止开发。
  • LiteSpeed Web 服务器目前支持 SPDY/3.1。
  • Nginx 通过一个模块提供针对 SPDY(Draft 3.1) 的实验性支持,计划在 2015 年底支持 HTTP/2。

目前没有支持 HTTP/2 计划的

  • lighttpd 在版本 1.x 中没有支持 SPDY 或 HTTP/2 的计划

其它 HTTP/2 实现

  • 其它已知的 HTTP/2 实现可以在 Github HTTP/2 wiki 中找到

最后,有关 HTTP/2 的畅想

正如我们所探索的,HTTP/2 早就应该为升级 Web 而出现,当它在接下来的几年中被广泛接受,网站和其它 web 服务将会变得更快,比以前任何时候更加能干。感谢有远见的浏览器厂商们,HTTP/2 将会增强用户的隐私和安全。我认为对于整个 Web 生态来说,HTTP/2 是一次至关重要的飞跃,未来有许多新的事业正等着我们去开拓。

如果关于 HTTP/2 你有任何的问题或建议,可以在 Twitter 上 @BenjaminPatch

致谢


非常感谢 Ilya Grigorik,他是一位 Google 的 web 性能工程师,在他的协助下我完成了这篇关于 HTTP/2 的文章,Ilya 同时也是《高性能浏览器网络(High-Performance Browser Networking)》(译者注:图灵出版社已经出版,李松峰老师翻译的,《Web性能权威指南》)的作者,这是一本为 web 开发者准备书,它非常棒,阅读这本书你可以了解更多有关网络和浏览器性能的知识。

本文来自:w3ctech
  • 大小: 161.7 KB
  • 大小: 168.7 KB
来自: w3ctech
0
0
评论 共 2 条 请登录后发表评论
2 楼 finallygo 2015-03-26 20:16
简单来说就是客户端的异步io
1 楼 shuzheng5201314 2015-03-26 15:26
[b][i][u][list]
[*][img][url][flash=200,200][*][*]
  • [*]
    [flash=200,200][url][img][list]
    [*]
    引用
    引用
    引用
    引用
    引用
    引用
    引用
    [u][i][b][/b][/i][/u]
    引用
    [/list][/img][/url][/flash]
    [/flash][/url][/img][/list][/u][/i][/b]

    发表评论

    您还没有登录,请您登录后再发表评论

    相关推荐

    • wave文件压缩成mp3格式代码(c#)

      本代码整理自www.codeproject.com的C#代码,以此感谢wjq(b_wind)对我的帮助,ManWMF在http://download.csdn.net/source/1687112下

    • vs2010音频文件压缩 调用lame_enc.dll将WAV格式转换成MP3

      /* //My_lame.h */ #pragma once#include "stdafx.h"#include &lt;windows.h&gt;#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;string&gt;#include "BladeMP3EncDLL.h"class My_lame{public: M...

    • Java实现音频格式转换 WAV—mp3,可使音频压缩

      http://www.xuebuyuan.com/1749979.html 最近做的一个小项目中,师兄安排的任务,要实现录音然后保存文件,实现网络传输,然后我用初学的java实现了一个录音机的功能(见前面的博客),但是windows录音默认保存的格式是WAVE,后缀是WAV,经过大量测试,录制一分钟要1M大小,这样不便于网络的传输,于是下面的任务就是实现音频压缩了,搜了几天,找到

    • 使用lame将wav转成mp3

      安装lame: 下载lame-3.93.1.tar.gz tar -xvzf  lame-3.93.1.tar.gz ./configure && make && make install wav转化mp3脚本: #!/bin/sh  #  # file : wav2mp3.sh  # this is for debugging  PATH="/var/files"

    • 第16周-阅读程序4(3)

      #include #include using namespace std; int main() { fstream outfile,infile; outfile.open("data.txt",ios::out); for (int i=0; i<26; i++) outfile<<(char)('A'+i); outfile.close(

    • PCM音频文件(.wav)压缩成ADPCM(.wav)

       PCM音频文件压缩成adpcm格式的文件有多中方法(如使用ms ACM、sox等),本文主要介绍使用公开的算法(如下所示,如果需要可到网上搜一下:=======================================** Intel/DVI ADPCM coder/decoder.**** The algorithm for this coder was taken from

    • PCM、WAV格式介绍及用C语言实现PCM转WAV

      1、PCM格式介绍: PCM(Pulse Code Modulation)也被称为 脉码编码调制。PCM中的声音数据没有被压缩,如果是单声道的文件,采样数据按时间的先后顺序依次存入。(它的基本组织单位是BYTE(8bit)或WORD(16bit)) 参考文献http://blog.csdn.net/ownwell/article/details/8114121/ 2、WAV格

    • C++调用libmp3lame实现压缩WAV为MP3【附VS2013项目】

      The LAME Project LAME is a high quality MPEG Audio Layer III (MP3) encoder licensed under the LGPL.  VS2013项目(libmp3lame, 可直接编译)下载链接:http://pan.baidu.com/s/1eQnqS9c 密码:5mg3 /********************

    • 音频编解码·实战篇(1)PCM转至AAC(AAC编码)

      音频编解码·实战篇(1)PCM转至AAC(AAC编码) 作者:柳大·Poechant 博客:blog.csdn.net/poechant 邮箱:zhongchao.ustc@gmail.com 日期:April 7th, 2012 这里利用FAAC来实现AAC编码。 1 下载安装 FAAC 这里的安装过程是在 Mac 和 Linux 上实现的,Windows可以类似参考。 wget http...

    • 数据压缩原理与应用 WAV文件的分析

      一、WAV格式的概念 定义 WAV为微软公司开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持。 RIFF格式 RIFF即“资源互换文件格式”,基本构成单位为chunk,每个chunk由辨别码(4字节)、数据大小(4字节)及数据所组成。 WAV格式

    • liblame编译

      1.第一把网上下载  lame-3.100 2.将lame-3.100/libmp3lame/vector/中的.c和.h拷贝到lame-3.100/libmp3lame/目录下 3.将lame-3.100/include/lame.h拷贝到lame-3.100/libmp3lame/目录下 4.去除lame-3.100/libmp3lame/i386文件夹,和非.c .h的文件 5.编辑...

    • WAV格式中常见的压缩编码

      WAV格式中常见的压缩编码(compression code) WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持,该格式也支持MSADPCM,CCITT A LAW等多种压缩运算法,支持多种音频数字,取样频率...

    • Python 技术篇-用wave库实现音频mp3格式转wav格式,高保真!

      Python 技术篇-用wave库实现音频mp3格式转wav格式,高保真! 从微信下载下来的语音是 mp3 格式的,想调用百度语音 api,发现不支持 mp3,支持 wav。 准备: 需要安装 pydub 库,直接pip install pydub就好了。 还需要安装 ffmpeg.exe 文件,然后再配置一下就好了,请看: ffmpeg.exe 的安装及配置,与常见问题 原理: 读取 mp3 音频的波形数据,然后再写入 wav 文件。

    • 使用NAudio实现Wav转Mp3

      转换成MP3: using Microsoft.Win32; using NAudio.MediaFoundation; using NAudio.Wave; using System.Windows; namespace NAudioDemo { /// &lt;summary&gt; /// MainWindow.xaml 的交互逻辑 /// ...

    • MP3 编码解码 附完整c代码

      近期一直不间断学习音频处理,一直也没想着要去碰音频编解码相关。 主要是觉得没什么实际的作用和意义。 不管视频编解码,图像编解码,音频编解码,都有很多组织基金在推动。 当然,在一些特定的情景下,需要用起来编解码库, 而一般这些库都会有编译困难,使用困难等等困难综合症。 图像方面,已经有stb_image,spot,freeimage等编解码库系列,做得特别赞。 https://githu...

    Global site tag (gtag.js) - Google Analytics