`
gaojingsong
  • 浏览: 1210325 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

【HTTP/2 介绍】

阅读更多

What is HTTP/2?

HTTP/2 is a replacement for how HTTP is expressed “on the wire.” It is not a ground-up rewrite of the protocol; HTTP methods, status codes and semantics are the same, and it should be possible to use the same APIs as HTTP/1.x (possibly with some small additions) to represent the protocol.

The focus of the protocol is on performance; specifically, end-user perceived latency, network and server resource usage. One major goal is to allow the use of a single connection from browsers to a Web site.

The basis of the work was SPDY, but HTTP/2 has evolved to take the community’s input into account, incorporating several improvements in the process.

See our charter for more details of the scope of the work, as well as our Frequently Asked Questions.

See also HTTP/2 JP, maintained by the Japanese HTTP/2 community.

 

Specifications

HTTP/2 is comprised of two specifications:

Hypertext Transfer Protocol version 2 - RFC7540

HPACK - Header Compression for HTTP/2 - RFC7541

 

 

HTTP/2 源自 SPDY/2

SPDY 系列协议由谷歌开发,于 2009 年公开。它的设计目标是降低 50% 的页面加载时间。当下很多著名的互联网公司,例如百度、淘宝、UPYUN 都在自己的网站或 APP 中采用了 SPDY 系列协议(当前最新版本是 SPDY/3.1),因为它对性能的提升是显而易见的。主流的浏览器(谷歌、火狐、Opera)也都早已经支持 SPDY,它已经成为了工业标准,HTTP Working-Group 最终决定以 SPDY/2 为基础,开发 HTTP/2。

但是,HTTP/2 跟 SPDY 仍有不同的地方,主要是以下两点:

HTTP/2 支持明文 HTTP 传输,而 SPDY 强制使用 HTTPS

HTTP/2 消息头的压缩算法采用 HPACK,而非 SPDY 采用的 DELEFT

 

 

HTTP/2 的优势

相比 HTTP/1.x,HTTP/2 在底层传输做了很大的改动和优化:

HTTP/2 采用二进制格式传输数据,而非 HTTP/1.x 的文本格式。二进制格式在协议的解析和优化扩展上带来更多的优势和可能。

HTTP/2 对消息头采用 HPACK 进行压缩传输,能够节省消息头占用的网络的流量。而 HTTP/1.x 每次请求,都会携带大量冗余头信息,浪费了很多带宽资源。头压缩能够很好的解决该问题。

多路复用,直白的说就是所有的请求都是通过一个 TCP 连接并发完成。HTTP/1.x 虽然通过 pipeline 也能并发请求,但是多个请求之间的响应会被阻塞的,所以 pipeline 至今也没有被普及应用,而 HTTP/2 做到了真正的并发请求。同时,流还支持优先级和流量控制。

Server Push:服务端能够更快的把资源推送给客户端。例如服务端可以主动把 JS 和 CSS 文件推送给客户端,而不需要客户端解析 HTML 再发送这些请求。当客户端需要的时候,它已经在客户端了。

 

 

HTTP/2,也就是超文本传输协议第2版,不论是1还是2,HTTP的基本语义是不变的,比如方法语义(GET/PUST/PUT/DELETE),状态码(200/404/500等),Range Request,Cacheing,Authentication、URL路径, 不同的主要是下面几点:

HTTP2 主要是针对 Http1的下面几个问题做的优化:

 

并行能力有限

每一个源最大只支持6个请求 

管道在实际使用时不起作用 

竞争性的TCP流,强制快速重传(Spurious retransmissions) 

额外的握手、内存缓冲等

 

客户端请求队列

队首阻塞 

延迟的请求分发

 

较高的协议负载

头信息和Cookies大约要800字节 

HTTP元数据没有压缩

 

另外,HTTP/1.1只允许由客户端主动发起请求,服务端只能等待客户端发送请求,这对于满足预加载的现状是一种桎梏。

 

 

 

http2是一个二进制协议。

HTTP/2 传输的数据是二进制的。相比 HTTP/1.1 的纯文本数据,二进制数据一个显而易见的好处是:更小的传输体积。这就意味着更低的负载。二进制的帧也更易于解析而且不易出错,纯文本帧在解析的时候还要考虑处理空格、大小写、空行和换行等问题,而二进制帧就不存在这个问题。

image

 

在 HTTP/2 的语境下,有三个概念需要厘清,它们就是:流(Stream)、消息(Message) 和帧(Frame)。

Stream 处于一个连接中的双向二进制数据流,可以包含一个或者多个 Message。

Message 一个完整的请求或者响应,包含多个 Frame 序列。

Frame HTTP/2 通讯中的最小传输单位,至少含有一个 Frame header,能够表示它属于哪一个 Stream。

如下图所示:

image

帧(Frame)的类型有很多种,但他们都有如下的公共字段: 
Type, Length, Flags, Steam Identifier和frame payload

image

一个具体请求的HTTP2类似如下图:

image

多路复用的流

每个http2连接上传输的帧都关联到一个“流”。流是一个逻辑上的结合,一个独立的,双向的帧序列。它在客户端和服务器端中间通过http2连接进行帧交换。

每个单独的http2连接都可以包含多个并发的流,任何一端都可以交错地插入帧。流既可以被客户端/服务器端单方面的建立、使用,也可以被双方共享。同时,两边都可以关闭流。

image

流的多路复用意味着在同一连接中来自各个流的数据包被混合在一起。两个(或者更多)独立的“数据列车”被拼凑到了一辆列车上,最终在终点站被分开。下面就是两列“数据火车”:

image

它们就是这样通过多路复用的方式被组装到了同一列火车上。

image

在http2里面,我们很容易可以看到10个甚至100个同时并存的流。创建一个新的流的代价也非常低。

它允许多个并发 HTTP 请求共用一个 TCP会话,而不是为每个请求单独开放连接,这样只需建立一个 TCP 连接就可以传送网页上所有资源,不仅可以减少消息交互往返的时间还可以避免创建新连接造成的延迟,使得 TCP 的效率更高。

HTTP1.x上如果一个只用一个持久链接,请求只能一个一个顺序请求,为了高效地并行下载资源,浏览器允许我们打开多个TCP会话,但是一个域名下限制6个链接,如下。

image

优先级和依赖关系

每个流都包含一个优先级,优先级被用来告诉对端哪个流更重要。

优先级能动态的被改变,这可以让用户滚动一个全是图片的页面的时候,浏览器可以指定哪个图片有更高的优先级。或者是在你切换标签页的时候,浏览器可以提升新切换到页面所包含流的优先级。

 

 

服务器推送

HTTP/2 的服务器推送所作的工作就是,服务器在收到客户端对某个资源的请求时,会判断客户端十有八九还要请求其他的什么资源,然后一同把这些资源都发送给客户端,即便客户端还没有明确表示它需要这些资源。

客户端可以选择把额外的资源放入缓存中(所以这个特点也叫 Cache push),也可以选择发送一个 RST_STREAM frame 拒绝任何它不想要的资源。

image

流量控制

 

帧类型决定了是否适用流量控制规则。只有DATA帧受流量控制;其他类型的帧不受流量控制。

有些浏览器希望事先知道图片显示尺寸,可用更好的做布局,减少reflow现象,如果可以预先下载图片的元数据(图片头内有)就太好了, 用这个技术就可以先发前面的~kb

image

http://segmentfault.com/a/1190000002676016

 

备选服务

随着http2逐渐被接受,我们有理由猜测,相对于HTTP 1.x,TCP连接会更长且被保持的更久。客户端到每个主机/站点的每一条连接都可以做尽可能多的事情,因此每个连接也可能被保持开启更长的时间。

这会影响到HTTP负载均衡器的正常工作,也可能在一个网站想建议客户端连接到另外一个主机的时候引起问题。通常,网站此举的目的在照顾性能,也可能是正常维护或类似原因。

服务器将会通过发送Alt-Svc头(或者http2的ALTSVC帧)通知客户端另一个备选服务。即另外一条获取同样内容的路由,但它指向不同的服务源、主机或端口。

客户端可以尝试异步的连接到服务,或者可能的话,使用备选服务。

0
0
分享到:
评论

相关推荐

    HTTP/2规范中文版

    2. 帧和流层:详细介绍了HTTP/2帧的结构和如何通过帧的多路复用来实现流的传输。帧层定义了帧的格式和类型,流层定义了流的协议和流控制机制。 3. 帧和错误类型:阐述了HTTP/2中各种帧类型及其使用方法,以及在处理...

    http2解析pdf版

    在介绍HTTP/2的世界一节中,文档描述了HTTP/2协议在Web世界中的普及和应用,包括主流浏览器的支持情况和一些大型网站对HTTP/2的支持程度。文档还提到了如何检测网站是否支持HTTP/2以及如何启用HTTP/2支持。 文档...

    http://jhttp2.sourceforge.net/

    标题 "http://jhttp2.sourceforge.net/" 暗示我们关注的是一个与HTTP协议和可能的Java实现相关的项目。这个项目可能是一个开源的HTTP/2客户端库,它允许开发者在Java应用程序中集成HTTP/2通信功能。HTTP/2是HTTP协议...

    c#使用Socket发送HTTP/HTTPS请求的实现代码

    本文主要介绍了如何使用C#的Socket类来发送HTTP/HTTPS请求,并对相关的知识点进行了详细的解释。 Socket编程 在C#中,Socket是使用最广泛的网络编程接口之一。Socket允许程序员在不同的网络协议上发送和接收数据,...

    http2讲解 HTTP/2协议产生的背景

    《http2讲解》这篇文档会从技术和协议层面介绍HTTP/2协议,主要内容包括HTTP/2协议产生的背景、协议本身、实现和未来。原作者为Daniel Stenberg。

    HTTP2 讲解

    ### HTTP2讲解 #### 背景与现状 自从HTTP 1.1成为互联网通信的主要协议以来,大量的研发资源被投入到其基础设施建设中,使之不断完善并成为现今大多数在线内容的基础。HTTP 1.1虽然已经相当成熟,但在面对现代网络...

    http2讲解.pdf

    本书《http2讲解》由Daniel Stenberg编写,提供了HTTP/2协议的技术和协议介绍。Daniel Stenberg是著名的开源开发者,为网络项目和标准化工作贡献了20多年的时间,其中包括著名的curl工具和libcurl库的首席开发者,...

    藏经阁-阿里巴巴HTTP2实践及无线通信协议的演进之路.pdf

    阿里巴巴HTTP/2实践及无线通信协议的演进之路是阿里云的一篇技术文章,主要介绍了HTTP/2协议的实现和优化过程。下面是该文章的知识点总结: 一、HTTP/2简介 * HTTP/2是下一代HTTP协议,旨在提高网络传输效率和性能...

    Laravel开发-laravel-http2serverpush

    打开 `app/Http/Kernel.php` 文件,在 `$middleware` 数组中添加 `Spatie\Http2ServerPush\Middleware\AddHttp2PushHeaders`: ```php protected $middleware = [ // ... \Spatie\...

    site2U网站管理系统

    类别:php源码->cms<br/>下载地址:http://www.site2u.cn/site2u1.0beta.rar<br/>官方网址:http://www.site2u.cn<br/>平台:Linux, FreeBSD, Unix, Win2000,Win2003 <br/>功能介绍 :<br/>Site2U(建站任我行)网站...

    用CWinInet访问HTTP/HTTPS资源

    ### 二、CWinInet类介绍 CWinInet类提供了对HTTP和HTTPS协议的支持,可以创建HTTP和HTTPS请求,执行GET和POST操作。以下是一些关键成员函数: 1. **CreateInternetSession()**:创建一个Internet会话对象,这是...

    centos安装jdk1.8时出现没有/lib/ld-linux.so.2:这个文件的原因分析

    -bash: /usr/local/jdk/jdk1.8.0_181/bin/java: /lib/ld-linux.so.2: bad ELF interpreter:...以上所述是小编给大家介绍的centos安装jdk1.8时出现没有/lib/ld-linux.so.2:这个文件,希望对大家有所帮助,如果大家有任何

    电子网址大全 60个中国顶级电子技术网站.doc

    - **介绍**: 该网站提供集成电路(IC)和PDF文档的查询服务,是电子工程师查找所需IC数据手册的重要平台之一。 2. **电子元器件查询** - **网站**: [http://www.chinadz.com/](http://www.chinadz.com/) - **...

    优秀网站源码、编程源码下载网站大集中

    2. **源码之家** (http://www.codejia.com/):包含多种编程语言的源码,包括PHP、ASP、ASP.NET等,适合各种技术背景的开发者。 3. **源码网** (http://www.codepub.com/):提供了大量的开源项目源码,涵盖各种领域...

    PS/2接口协议解析及应用

    摘要:文中详细介绍了PS/2接口协议的内容、电气特性和标准键盘的第二套键盘扫描码集。给出了基于嵌入式系统的PS/2接口的软、硬件实现方法,并介绍了工控PC外接双键盘的解决方案。通过使用模拟开关CD4052巧妙地解决了...

    Benchmarking for http2

    本文将详细介绍如何使用`h2load`这一工具来进行HTTP/2的基准测试。 #### 使用`h2load`进行HTTP/2基准测试 `h2load`是`nghttp2`项目中的一个测试工具,专门用于对HTTP/2服务器进行负载测试。通过`h2load`,我们可以...

    网络知识 OS详解(win9x/2k/xp)功防技术大全 网络知识大全

    OS详解(win9x/2k/xp)功防技术大全 网络知识大全 (1)ARcnet简介 (2)Token Ring简介 (3)Switching网络简介 (4)FDDI网简介(5)ATM网络简介 (6)Ethernet网简介

    Merlin是使用golang编写的跨平台的利用后HTTP / 2命令和控制服务器和代理。-Golang开发

    可以在以下位置找到介绍性博客文章:https://medium.com/@Ne0nd0g/introducing-me梅林(BETA)梅林(Merlin)是一个跨平台的利用HTTP / 2命令和控制的服务器和代理,用golang编写。 可以在下面找到介绍性博客文章:...

Global site tag (gtag.js) - Google Analytics