架构师-网络文章汇总
HTTP 2.0协议是在SPDY(一种旨在加速网络传输的实验性协议,隶属于Chromium项目)这一基础上发展而来的,代表了互联网通信协议的下一代技术。HTTP/2的目标在于通过实现请求与响应的多路并行处理来减少延迟,借助压缩HTTPS头部信息以降低协议的总体开销,并且提升了请求的优先级处理能力,以及增强了服务器端主动推送功能。
本文旨在深入探究HTTP 2.0的工作机制kaiyun全站网页版登录,并对其通信过程中的具体环节进行详尽分析。
1. 二进制分帧层
二进制分帧层,是HTTP 2.0性能增强的核心。
HTTP 1.x在应用层以纯文本方式实现数据交互,而HTTP 2.0则将传输内容细分为更小的消息与帧,并采用二进制格式进行编码。因此,客户端与服务器端均需采纳新的二进制编码与解码技术。
如图中所示,HTTP 2.0并未对HTTP 1.x的语义进行改动,其传输方式仅是在应用层采用了二进制分帧技术。

因此,也引入了新的通信单位:
1.1 帧(frame)
HTTP 2.0传输中的基本构成要素涵盖帧头部、流标签、优先级设置以及帧负载内容等。

其中,帧类型又可以分为:
标志位在区分不同帧类型时,负责设定特定的信息标识。以DATA帧为例,它可以通过End Stream: true来表明消息传输的结束。此外,流标识位用于指明帧所属的特定流ID。在HEADERS帧中,优先值用来表示请求的优先程度。而R则代表保留位。
下面是Wireshark抓包的一个DATA帧:

1.2 消息(message)
信息指的是在逻辑层面上的HTTP信息,包括请求与响应两种类型。一个完整的消息通常由多个数据帧构成。以请求消息为例,它可能由一系列的DATA帧以及一个HEADERS帧共同组成。
1.3 流(stream)
流充当着连接的虚拟通道,它能够实现信息的双向传递。每个流都配备了一个独一无二的整数作为标识。为了避免在两端出现流ID的重复,客户端创建的流拥有奇数ID,而服务器端创建的流则拥有偶数ID。
HTTP 2.0的通信过程均在单一的TCP连接中进行,该连接能够支持不限数量的双向数据流Stream。这些数据流以消息的形式进行传输,而每个消息则由一个或多个帧构成。这些帧的发送可以不受顺序限制,随后会根据每个帧头部携带的流标识符进行重新排列组合。

二进制分帧层确保了HTTP的语义保持不变,这涵盖了头部信息、请求方法等关键部分,从应用层的视角来看,与HTTP 1.x版本并无二致。此外,所有源自同一主机的通信操作都可以在单一的TCP连接中得以实现。
2. 多路复用共享连接
在二进制分帧层的支持下,HTTP 2.0能够在同一TCP连接中并发传输请求与响应。它将HTTP消息细分为单个帧,确保了消息语义的完整性,然后这些帧被交错发送。在接收端,依据流ID和头部信息,这些帧被重新组装。
让我们来比较一下HTTP 1.x与HTTP 2.0版本。在忽略1.x的pipeline功能的前提下,两者的四层通信均基于一个TCP连接。客户端向服务器发送了三个图片请求,分别是/image1.jpg、/image2.jpg以及/image3.jpg。
在HTTP 1.x版本中,请求的发送是按照顺序进行的开yun体育app官网网页登录入口,只有当image1的响应到来之后,才能继续发送image2的请求,同理,只有image2的响应返回之后,才能启动image3的请求。

HTTP 2.0在建立TCP连接之后,会同时处理三个数据流。客户端会无序地向服务器发送stream1至stream3的DATA帧。在此过程中,服务器也已经开始向客户端回传stream 1的DATA帧。

性能一对比,高下立判。HTTP 2.0有效克服了HTTP 1.x中的队首阻塞难题(尽管TCP层的阻塞问题仍未得到解决),而且,它不再依赖pipeline机制来通过多条TCP连接实现并行请求与响应。这样的改进显著降低了TCP连接数量,从而对服务器的性能提升起到了重要作用。
3. 请求优先级
流可以带有一个31bit的优先级:
客户端对优先级进行了明确设定,服务端便能够依据这一优先级来处理交互数据,例如当客户端将优先级设定为.css>.js>.jpg(详情可参考《高性能网站建设指南》)时,服务端依照优先级返回结果,这样做有助于更高效地使用底层连接,从而提升用户的使用体验。
然而,也不能过分迷信请求优先级,仍然要注意以下问题:
4. 服务端推送
HTTP 2.0引入了服务端推送特性,允许服务器依据客户端的请求预先生成并传递多个响应,向客户端发送额外的资源。例如,客户端发起对stream 1以及/page.html的请求,服务器在发送stream 1的相关信息时,一并推送了stream 2的资源/script.js和stream 4的资源/style.css。

PUSH_PROMISE帧作为一种信号,由服务端主动发送给客户端,旨在传达推送资源的意图。
Apache mod_headers example
Header add Link ";rel=preload"
Header add Link ";rel=preload"
12345
5. 首部压缩
在HTTP 1.x中,每次进行通信(无论是请求还是响应)时,都会附带一些首部信息,这些信息用于阐述资源的特性。而在HTTP 2.0版本中,客户端与服务器之间会运用一个“首部表”来追踪并保存之前已发送的键值对。这个首部表在连接的全过程中持续存在,每当有新的键值对产生,它们就会被添加到表的末尾。因此,在通信过程中,就无需每次都携带首部信息了。

此外,HTTP 2.0引入了首部压缩技术,该技术采用了HPACK压缩算法。这一措施使得报头更加紧凑,传输速度得到提升,对于移动网络环境尤为有益。
需留意的是,HTTP 2.0主要聚焦于首部信息的压缩,而我们所熟知的gzip等工具则是对报文内容(body)进行压缩。这两种压缩方式并不相互矛盾,反而可以协同作用,实现更为显著的压缩效果。
6. 一个完整的HTTP 2.0通信过程
在探讨一个问题时,我们需思考客户端如何确认服务端是否具备HTTP 2.0的兼容性,以及是否能够对二进制分帧层的编码与解码进行操作。因此,在客户端与服务器端采用HTTP 2.0进行通信之前,必须经历一个协议的协商阶段。
6.1 基于ALPN的协商过程
支持HTTP 2.0的浏览器能够自主在TLS会话层进行协议协商,进而判断是否采用HTTP 2.0进行通信。该机制基于TLS 1.2版本引入的扩展字段,旨在支持协议的进一步扩展。在此过程中,ALPN协议(即应用层协议协商,原名为NPN)负责在客户端与服务器之间进行协议的协商。
服务端配置了ALPN协议,对443端口进行监听,以此默认提升HTTP 1.1的效率,同时支持与其他协议进行协商,例如SPDY和HTTP 2.0。
例如,在TLS握手过程中的Client Hello阶段,客户端会声明其具备HTTP 2.0的兼容性。

服务端在接收到信息后,向对方发送了Server Hello的响应,以此表明自身同样能够支持HTTP 2.0协议。随后,双方便开始了基于HTTP 2.0的通信过程。

6.2 基于HTTP的协商过程
难道HTTP 2.0的运用就必然是HTTPS(TLS 1.2)的专属权益吗?
当然并非如此,客户终端即便采用HTTP协议,同样能够启动HTTP 2.0的通信方式。由于HTTP 1.0与HTTP 2.0均采用相同的端口80,且无法获取服务器是否支持HTTP 2.0的相关信息,因此客户端只能借助HTTP Upgrade机制(如OkHttp、nghttp2等组件,或自行编码实现)来协商并确定合适的通信协议。
HTTP Upgrade request
GET / HTTP/1.1
host: nghttp2.org
连接:提升,采用HTTP2配置
执行带有HTTP2.0升级头的请求操作,即发送一个包含HTTP2.0升级信息的请求。
客户端使用的HTTP2配置为:AAMAAABkAAQAAP__,这表示的是客户端的SETTINGS数据负载。
user-agent: nghttp2/1.9.0-DEV
HTTP Upgrade response
HTTP/1.1 101 协议切换成功,表示服务器已接受升级请求,准备从HTTP 1.1版本过渡至HTTP 2.0。
Connection: Upgrade
Upgrade: h2c
HTTP升级操作顺利完成,协商过程圆满结束。
6.3 完整通信过程
TCP连接建立:
TLS握手和HTTP 2.0通信过程:

此外,您还可以在Chrome浏览器中,通过访问chrome://net-internals/#http2这一路径,来捕捉HTTP 2.0的通信细节。
42072: HTTP2_SESSION
textlink.simba.taobao.com端口为443,通过代理服务器10.19.110.55,端口号8080进行连接。
起始时间:二〇一七年四月五日十一点三十九分十一秒四百五十九毫秒
时间戳为370225,起始时间为0,事件类型为HTTP2_SESSION,持续时间超过32475。
主机地址设定为textlink.simba.taobao.com,端口号为443。
设置代理为“PROXY 10.19.110.55端口8080”。
时间戳为370225,起始时间为0,HTTP2会话初始化完成。
--> protocol = "h2"
源依赖项为42027,对应的是代理客户端套接字包装器。
时间戳为370225,起始时间为0,这是关于HTTP2会话发送设置的指令。
settings包含以下配置信息:[id:3, flags:0, value:1000],[id:4, flags:0, value:6291456],[id:1, flags:0, value:65536]。
时间戳为370225,状态起始时间为0,HTTP2协议中的流更新接收窗口操作。
--> delta = 15663105
--> window_size = 15728640
时间戳为370225,起始时间为0,表示HTTP2会话已发送窗口更新帧。
--> delta = 15663105
--> stream_id = 0
时间戳为370225,状态起始时间为0,执行了HTTP2协议会话中的发送头部操作。
--> exclusive = true
--> fin = true
--> has_priority = true
--> :method: GET
该链接属于淘宝平台,具有文本链接属性,位于simba.taobao.com域名之下。
:scheme: https
禁止访问路径:包含参数name为tbhs,cna为IAj9EOy3fngCAXBQ5kJ9yusH,nn为空,数量为13,pid为430266_1006,_ksTS为1491363551394_94,回调函数为jsonp95的链接。
用户代理:Mozilla 5.0版本,运行于Windows NT 6.1操作系统,采用WOW64架构;基于AppleWebKit 537.36引擎,类似于Gecko;使用Chrome浏览器,版本号为56.0.2924.87;配备Safari 537.36浏览器内核。
accept: */*
该链接指向:淘宝网。
接受编码类型包括:gzip、deflate、sdch、br。
接受语言设置为中文,优先选择中文,其权重为0.8。
cookie信息:已移除382字节内容。
--> parent_stream_id = 0
--> stream_id = 1
--> weight = 147
时间戳为370256,状态标志为31,表示HTTP2会话接收到了配置设置。
服务器地址设定为"textlink.simba.taobao.com",端口号为443。
时间戳为370256,状态标志为31,表示HTTP2会话接收设置。
--> flags = 0
--> id = 3
--> value = 128
时间戳为370256,状态标志为31,表示HTTP2会话中更新了流发送窗口的大小。
设定delta_window_size的值为2147418112
t=370256 [st= 31] HTTP2_SESSION_RECV_SETTING
--> flags = 0
--> id = 4
--> value = 2147483647
t=370256 [st= 31] HTTP2_SESSION_RECV_SETTING
--> flags = 0
--> id = 5
--> value = 16777215
时间戳为370256,状态为31,接收到了HTTP2会话的窗口更新帧。
--> delta = 2147418112
--> stream_id = 0
时间戳为370256,状态开始于31,这是关于HTTP2会话更新发送窗口的操作。
--> delta = 2147418112
--> window_size = 2147483647
时间戳为370261,状态标志为36,表示HTTP2会话接收到了头部信息。
--> fin = false
--> :status: 200
日期:星期三,四月五日,凌晨三点三十九分十一秒,格林威治标准时间。
内容类型:网页文本格式,字符集为ISO-8859-1。
vary: Accept-Encoding
server: Tengine
有效期至:2017年4月5日星期三,凌晨3点39分11秒,格林威治标准时间。
cache-control: max-age=0
严格传输安全:最大存活时间设为0
timing-allow-origin: *
content-encoding: gzip
--> stream_id = 1
时间戳为370261,状态标记为36,表示这是HTTP2会话中接收到的数据。
--> fin = false
--> size = 58
--> stream_id = 1
时间戳为370261,状态码为36,该操作涉及HTTP2协议会话的接收窗口更新。
--> delta = -58
--> window_size = 15728582
t=370261 [st= 36] HTTP2_SESSION_RECV_DATA
--> fin = true
--> size = 0
--> stream_id = 1
时间戳为370295,状态标志为70,表示HTTP2协议中的流更新接收窗口操作。
--> delta = 58
--> window_size = 15728640
t=402700 [st=32475]
备注:
本文内容源自网络资源。我计划整理一系列针对架构师所需的优质文章,鉴于亲自撰写需耗费大量时间kaiyun.ccm,故决定充当信息搜集者,为大家精选佳作。最终,我将整理成索引,便于大家便捷查阅。

