【澳门葡京】特点和抓包分析,系数解析HTTP

一分钟预览 HTTP2 风味和抓包分析

2016/09/26 · JavaScript
· HTTP/2

原文出处: 段隆贤   

背景

不久前,http网络请求量日益丰盛,以下是httparchive总结,从2012-11-01到2016-09-01的哀告数量和传导大小的矛头图:

澳门葡京 1

近来大部分份客户端&服务端架构的应用程序,都是用http/1.1连续的,现代浏览器与单个域最达累斯萨Lamb接数,都在4-6个左右,由上图Total
Requests数据,假设不用CDN分流,平均有20个左右的串行请求。
HTTP2
是1999年公布http1.1后的两遍重大的革新,在探究层面改进了以上问题,缩短资源占用,来,直接感受一下差距:

HTTP/2 is the future of the Web, and it is
here!
这是 Akamai 集团确立的一个合法的言传身教,用以阐明 HTTP/2 相比于事先的
HTTP/1.1 在性能上的宏大升高。 同时伸手 379 张图纸,从Load time
的比较可以见到 HTTP/2 在速度上的优势。

澳门葡京 2

正文所有源码和抓包文件在github

http2 协议

HTTP/2 源自 SPDY/2,正式版http2规格标准叫做RFC
7540,发表于2015年八月15日。

  • RFC 7540 – Hypertext Transfer Protocol Version 2
    (HTTP/2)

  • RFC 7541 – HPACK: Header Compression for
    HTTP/2

  • fex-team翻译的 htt2
    中英文对照.md)

HTTP/2 跟 SPDY 仍有不同的地点,重假诺以下两点:

  1. HTTP/2 协助明文 HTTP 传输,而 SPDY 强制行使 HTTPS

  2. HTTP/2 音讯头的压缩算法采纳 HPACK,而非 SPDY 采纳的 DELEFT

原稿地址

背景

前不久,http网络请求量日益增长,以下是httparchive总结,从2012-11-01到2016-09-01的呼吁数量和传导大小的取向图:

澳门葡京 3

 

当前多数份客户端&服务端架构的应用程序,都是用http/1.1连连的,现代浏览器与单个域最奥斯汀接数,都在4-6个左右,由上图Total
Requests数据,要是不用CDN分流,平均有20个左右的串行请求。
HTTP2
是1999年宣布http1.1后的四遍重大的精益求精,在商事层面改良了以上问题,缩短资源占用,来,直接感受一下差别:

HTTP/2 is the future of the Web, and it is
here!
这是 Akamai 公司确立的一个官方的以身作则,用以注脚 HTTP/2 相比于事先的
HTTP/1.1 在性能上的翻天覆地进步。 同时呼吁 379 张图片,从Load time
的对待能够见见 HTTP/2 在进度上的优势。

澳门葡京 4

 

本文所有源码和抓包文件在github

HTTP/2 源自 SPDY/2

SPDY 系列协议由谷歌支付,于 2009 年堂而皇之。它的规划目标是下跌 50%
的页面加载时间。当下众多尽人皆知的互联网公司都在投机的网站或 APP 中利用了
SPDY 系列协议(当前最新版本是
SPDY/3.1),因为它对性能的擢升是尽人皆知的。主流的浏览器(Google、火狐、Opera)也都早已经帮助SPDY,它早已变为了工业标准,HTTP Working-Group 最后决定以 SPDY/2
为根基,开发 HTTP/2。HTTP/2标准于2015年9月以RFC 7540专业刊出。

只是,HTTP/2 跟 SPDY 仍有不同的地点,首尽管以下两点:

HTTP/2 协助明文 HTTP 传输,而 SPDY 强制行使 HTTPS
HTTP/2 音讯头的压缩算法拔取 HPACK ,而非 SPDY 采取的 DEFLATE(感谢网友
逸风之狐指正)

合计文档请见:rfc7540:HTTP2

http2 特点

http2 性能,http2
demo

  • HTTP/2’s binary framing layer

  • Streams, messages, and frames

  • Request and response multiplexing

  • Stream prioritization

  • One connection per origin

  • Flow control

  • Server push

  • Header compression

(1)二进制

HTTP/2 采用二进制格式传输数据,而非 HTTP/1.x
的文本格式。二进制协议分析起来更快速。

(2)二进制格式

HTTP/1
的伸手和响应报文,都是由最先行、首部和实体正文(可选)组成,各部分之间以文件换行符分隔。

HTTP/2 将请求和响应数据分割为更小的帧,并对它们选用二进制编码。

帧(Frame):HTTP/2 数据通信的小小单位。

音信(Message):指 HTTP/2 中逻辑上的 HTTP
音信。例如请求和响应等,音信由一个或四个帧组成

流(Stream):存在于连接中的一个虚构通道。流可以承接双向信息,每个流都有一个唯一的整数
ID。

HTTP/2
中,同域名下持有通信都在单个连接上做到,这多少个连续可以承接任意数量的双向数据流。每个数据流皆以音信的样式发送,而音讯又由一个或四个帧组成。四个帧之间可以乱序发送,因为依据帧首部的流标识可以再度组建。

Frame 是 HTTP/2 二进制格式的基础,Frame 的主干格式如下

+-----------------------------------------------+
|                 Length (24)                   |
+---------------+---------------+---------------+
|   Type (8)    |   Flags (8)   |
+-+-------------+---------------+-------------------------------+
|R|                 Stream Identifier (31)                      |
+=+=============================================================+
|                   Frame Payload (0...)                      ...
+---------------------------------------------------------------+

字段含义可查阅协议

澳门葡京 5

http2.png

(3)多路复用

HTTP/1.X 存在线端阻塞(head-of-line blocking)的题目。HTTP/1.1
试过用流水线(pipelining)来缓解那一个问题,
不过功力并不雅观(数据量较大如故速度较慢的响应,
会阻碍排在他背后的呼吁)。HTTP 管道技术无法大规模使用。

多路复用,代替原先的连串和封堵机制。就是富有的呼吁都是经过一个 TCP一连出现完成。流辅助优先级流量控制

HTTP/2
的多路复用特性,使得可以在一个连续上同时开辟多少个流,双向传输数据。每趟请求/响应使用不同的
Stream ID。通过 Stream ID 标识,所有的请求和响应都同时跑在一条 TCP
链接上。
当流并发时,就会涉嫌到流的优先级和依赖。优先级高的流会被先行发送。图片请求的优先级要小于
CSS 和
SCRIPT,这多少个规划可以确保重点的事物可以被先行加载完。http2上边每个流都拥有和谐的公示的流量窗口,它可以界定另一端发送数据。

(4)头压缩

HTTP
1.1请求的大大小小变得尤为大,有时甚至会高于TCP窗口的上马大小,这会严重拖累发送请求的速度。因为它们需要拭目以待带着ACK的响应回来之后,才能持续被发送。

HTTP/2 对音讯头采纳 HPACK
(专为http2头部设计的压缩格式)进行削减传输,能够节约音信头占用的网络的流量。而
HTTP/1.x 每趟请求,都会辅导大量冗余头音信,浪费了成百上千带宽资源。

(5)服务端推送

服务端可以在殡葬页面 HTML
时积极推送此外资源,而不用等到浏览器解析到相应岗位,发起呼吁再响应。例如服务端能够主动把
JS 和 CSS 文件推送给客户端,而不需要客户端解析 HTML 再发送那多少个请求。

服务端可以积极推送,客户端也有权利挑选接受与否。如若服务端推送的资源已经被浏览器缓存过,浏览器可以通过发送
RST_STREAM 帧来拒收。

写在面前

超文本传输协议(英文:HyperText Transfer
Protocol,缩写:HTTP)是互联网上运用最为广泛的一种网络协议。设计 HTTP
最初的目标是为着提供一种公布和吸收 HTML 页面的法门。通过 HTTP 或者 HTTPS
协议请求的资源由统一资源标识符(URI)来标识。

固然HTTP/1.1平安运转了十多年了,但HTTP/2来势汹汹,作为技术工程师有必不可少学习一下HTTP/2。前几日,阿里云CDN安防技术专家金九将从历史、特性、调试、性能五个层面,来宏观解析HTTP/2,希望本文可以给您带来一些启发。


HTTP/2 源自 SPDY/2

SPDY 序列协议由Google开发,于 2009 年精通。它的计划性目的是下跌 50%
的页面加载时间。当下游人如织有名的互联网商家都在团结的网站或 APP 中行使了
SPDY 系列协议(当前流行版本是
SPDY/3.1),因为它对性能的升迁是明确的。主流的浏览器(Google、火狐、Opera)也都早已经支撑
SPDY,它已经成为了工业标准,HTTP Working-Group 最后决定以 SPDY/2
为底蕴,开发 HTTP/2。HTTP/2标准于2015年二月以RFC 7540正式刊出。

不过,HTTP/2 跟 SPDY 仍有不同的地方,紧如果以下两点:

HTTP/2 帮忙明文 HTTP 传输,而 SPDY 强制行使 HTTPS
【澳门葡京】特点和抓包分析,系数解析HTTP。HTTP/2 音讯头的压缩算法采纳 HPACK ,而非 SPDY 拔取的 DEFLATE(感谢网友
逸风之狐指正)

情商文档请见:rfc7540:HTTP2

HTTP2特性概览

浏览器和web服务支撑意况

http2
援助清单

一、历史

1、 HTTP/0.9
最早的原型,1991年宣布,该版本极其简约,只援助 GET 方法,不帮助 MIME
类型和各类 HTTP 首部等等。

2、 HTTP/1.0
1996年通告。HTTP/1.0在HTTP/0.9的底子之上添加很多主意,各类 HTTP
首部,以及对多媒体对象的拍卖。

除去GET命令,还引入了POST命令和HEAD命令,丰裕了浏览器与服务器的交互手段。

任何格式的情节都足以发送。这使得互联网不但可以传输文字,仍可以传输图像、视频、二进制文件。这为互联网的大提升奠定了基础。

HTTP请求和回复的格式也变了。除了数量部分,每一回通信都必须概括头信息(HTTP
header),用来讲述一些元数据。

可以说,HTTP/1.0是对HTTP/0.9做了革命性的改动,但HTTP/1.0仍旧有局部通病,其紧要症结是各个TCP连接只可以发送一个伸手,发送数据完毕后总是就关门,即使还要伸手其他资源,就得再新建一个总是。固然有些浏览器为了缓解这多少个问题,用了一个非标准的Connection头部,但以此不是明媒正娶头部,各样浏览器和服务器实现有可能不同等,由此不是根本解决办法。

3 、HTTP/1.1
1999年专业公布。HTTP/1.1是如今主流的 HTTP 协议。完善了事先 HTTP
设计中的结构性缺陷,明确了语义,添加和删除了有些特征,帮助更加错综复杂的的
Web 应用。

因此了十多年将近20年的提高,这么些版本的HTTP协议已经很平稳了,跟HTTP/1.0比较,它新增了累累领会的新特性,比如Host协议头、Range分段请求、默认持久连接、压缩、分块传输编码(chunked)、缓存处理等等,至今都大方应用,而且不少软件看重那么些特色。

虽说HTTP/1.1并不像HTTP/1.0对于HTTP/0.9这样的批判性,然而也有广大增强,近日主流浏览器均默认使用HTTP/1.1。

# 4、SPDY
SPDY(发音:speedy)协议由Google开发,紧要解决 HTTP/1.1
效能不高的问题,于二〇〇九年堂而皇之,到2016年终结束使命。因为HTTP/2已经被IETF标准化了,将来各类新版浏览器都会支撑HTTP/2,Google认为SPDY已经远非存在的必要了,接下去的重任由HTTP/2去做到。

5、HTTP/2
HTTP/2是新型的HTTP协议,已于2015年十二月份正规公布, Chrome、
IE11、Safari以及Firefox 等主流浏览器已经扶助 HTTP/2商谈。

留神是HTTP/2而不是HTTP/2.0,这是因为IETF(Internet Engineering Task
Force,互联网工程任务组)认为HTTP/2已经很干练了,没有必要再公布子版本了,未来如果有重点改变就一直披露HTTP/3。

实际,HTTP/2的前身是SPDY,甚至它俩的对象、原理和核心落实都差不多。IETF组委会中有很多Google工程师,将SPDY推动成为规范也就司空眼惯了。

HTTP/2不仅优化了性能而且十分了HTTP/1.1的语义,其几大特色与SPDY差不多,与HTTP/1.1有巨大区别,比如它不是文件协议而是二进制协议,而且HTTP头部接纳HPACK进行削减,补助多路复用、服务器推送等等。


HTTP2特性概览

1. 二进制协议

HTTP/2 接纳二进制格式传输数据,而非 HTTP/1.x 的文本格式

澳门葡京 6

由上图能够见见HTTP2在原先的应用层和HTTP层添加了一层二进制传输。

二进制协议的一个利益是,可以定义额外的帧。

HTTP/2
定义了近十种帧(详情可分析抓包文件),为将来的高档应用打好了根基。倘诺接纳文本实现这种效果,解析数据将会变得分外劳累,二进制解析则有利于得多。
RFC7540:Frame
Definitions
澳门葡京 7
协议中定义的帧

设置配备

从 Nginx 1.9.5 开始,http_v2_module 已经替换了
ngx_http_spdy_module,安装版本用1.10.1

nginx

./configure --with-http_v2_module

mac

brew options nginx
brew install nginx --with-http2

二、特性

1、二进制协议

HTTP/2
接纳二进制格式传输数据,而非HTTP/1.x的文本格式。音信头和音讯体均拔取二进制格式,并称之为”帧“(Frame)。Frame二进制基本格式如下(摘自rfc7540#section-4.1):

+———————————————–+
| Length (24) |
+—————+—————+—————+
| Type (8) | Flags (8) |
+-+————-+—————+——————————-+
|R| Stream Identifier (31) |
+=+=============================================================+
| Frame Payload (0…) …
+—————————————————————+

于是说是大旨格式,是因为拥有HTTP/2
Frame都是由该中央格式来封装,类似于TCP头,目前有10个Frame,由Type字段来区分,各种Frame都有自己的二进制格式,都封装Frame
Payload中。

中间有五个紧要的Frame:Headers Frame(Type=0x1)和Data
Frame(Type=0x0),分别对应HTTP/1.1中的音信头(Header)和音讯体(Body),总而言之语义并从未太大转移,而是文本格式变成二进制的Frame。二者的更换和涉及如下图(摘自
《High Performance Browser Networking》):

澳门葡京 8

此外,HTTP/2中还有流(Stream)和音讯(Message)的定义,通过Stream
Identifier(即流ID)字段来标识,流ID一样的是同一个流,流中含有音讯,这么些信息对应HTTP/1.x的请求音信(Request
Message)或者响应音讯(Response
Message),音信是通过帧(Frame)来传输的,响应信息相比大,可能由六个Data
Frame来传输。HTTP/2中流、音信和帧的照应关系如下图(摘自 《High
Performance Browser Networking》):

澳门葡京 9

2、头部压缩

HTTP/1.x 每一次请求和响应,都会带走大量冗余消息头音信,比如Cookie和User
Agent,基本相同的内容,每一遍请求浏览器都会默认引导,这会浪费广大带宽资源,也影响了进度。这是因为HTTP是无状态协议,每一遍请求都不可能不附上所有消息,从而致使了每回请求都带上大量重复的音讯头。

为此,HTTP/2做了优化,对消息头拔取HPACK格式进行压缩传输,并对音讯头建立索引表,相同的音信头只发送索引号,从而提升功效和速度。但付出的代价是客户端和服务器均维护一个索引表,在目前内存不值钱的时日,这一点空间换取时间依旧这个值得的。

关于HPACK请参考RFC7541。

3、多路复用

多路复用是指在一个TCP连接里,客户端和服务器都足以而且发送多少个请求或者响应,对HTTP/1.x来说各类请求和响应都是有严峻的程序要求,而在HTTP/2中,不用依据次序一一对应,而且出现的六个请求或者响应中另外一个呼吁阻塞了不会潜移默化另外的哀告或者响应,这样就避免了“队头堵塞”。如下图(摘自
《High Performance Browser Networking》):
澳门葡京 10

4、服务器推送

服务器推送(Server
Push)是指在HTTP/2中服务器未经请求能够主动给客户端推送资源。例如服务端可以积极把
图片、JS 和 CSS
文件推送给浏览器,而不需要浏览器解析HTML后再发送那个请求。当浏览器解析HTML后这多少个需要的资源都早就在浏览器里了,大大提升了网页加载的快慢。如下图(摘自
《High Performance Browser Networking》):

澳门葡京 11

浏览器发起呼吁page.html这一个页面,那一个页面中援引了script.js和style.css,服务器在响应page.html后顺手推送了script.js和style.css那多少个文本,这样浏览器解析完page.html后意识引用的script.js和style.css已经在地头了,不需要再发送请求了,这样就节约了一回呼吁和这三遍呼吁所花的网络时间,大大提高了网络性能和用户体验。

5、安全

HTTP的安全是由SSL/TLS来保持,也就是HTTPS,其实HTTP/2并不强制要求倚重SSL/TLS,然则,当前主流浏览器均只匡助基于SSL/TLS的HTTP/2,况且在网络胁迫日益有恃无恐的互联网环境下,HTTPS将是前景的可行性,HTTP/2基于HTTPS也是鹏程的取向,而各大主流浏览器在落实HTTP/2之初均只支持SSL/TLS的HTTP/2,可见安全也是HTTP/2的机要特征之一。


1. 二进制协议

HTTP/2 采用二进制格式传输数据,而非 HTTP/1.x 的文本格式

澳门葡京 12

 

由上图能够看看HTTP2在原本的应用层和HTTP层添加了一层二进制传输。

二进制协议的一个益处是,可以定义额外的帧。

HTTP/2
定义了近十种帧(详情可分析抓包文件),为前几天的尖端应用打好了基础。如果应用文本实现这种功用,解析数据将会变得不得了辛勤,二进制解析则有利得多。
RFC7540:Frame Definitions

澳门葡京 13

钻探中定义的帧

2. 多路复用

HTTP/2
复用TCP连接,在一个一连里,客户端和浏览器都可以同时发送四个请求或应对,而且不要按照顺序依次对应,那样就避免了”队头堵塞”(见TCP/IP详解卷一)。
各种 Frame Header 都有一个 Stream ID
就是被用来落实该特性。每回请求/响应使用不同的 Stream ID。就像同一个 TCP
链接上的数额包通过 IP: PORT 来区别出多少包去往哪儿一样。
澳门葡京 14

rfc7540: HTTP2
Multiplexing中对Multiplexing的说明

Streams and Multiplexing

   A "stream" is an independent, bidirectional sequence of frames
   exchanged between the client and server within an HTTP/2 connection.
   Streams have several important characteristics:

   o  A single HTTP/2 connection can contain multiple concurrently open
      streams, with either endpoint interleaving frames from multiple
      streams.

   o  Streams can be established and used unilaterally or shared by
      either the client or server.

   o  Streams can be closed by either endpoint.

   o  The order in which frames are sent on a stream is significant.
      Recipients process frames in the order they are received.  In
      particular, the order of HEADERS and DATA frames is semantically
      significant.

   o  Streams are identified by an integer.  Stream identifiers are
      assigned to streams by the endpoint initiating the stream.

配置https

HTTP/2 研究本身并没有要求必须依照 TLS 部署,但是 Chrome 和 Firefox
均代表只补助 HTTP/2 Over
TLS。一方面更安全,希望怜惜以及偏重用户的隐情,一方面选拔 TLS
的加密机制可以更好地穿透网络中间节点。需要先安排https。

# 创建一个私钥文件:

openssl genrsa -des3 -out server.key 1024

openssl req -new -key server.key -out server.csr

openssl rsa -in server.key -out server_nopass.key

# 结合密钥和证书生成请求,创建一个自签署的CA证书

openssl req -new -x509 -days 3650 -key server_nopass.key -out server.crt

配置nginx

server
{
    listen 443 ssl http2;
    server_name  www.kailian.com;
    index index.php index.html;
    root  /data/web/www;
    ssl on;
    ssl_certificate /usr/local/etc/nginx/server.crt;
    ssl_certificate_key /usr/local/etc/nginx/server_nopass.key;
    ssl_prefer_server_ciphers on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
    keepalive_timeout 70;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m; 

    charset utf-8;
    location ~ .*\.php$
    {
        include fastcgi.conf;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index index.php;
    }

}

三、调试

从常理和目的上看HTTP/2和SPDY差不多,从Nginx官方代码上看HTTP/2和SPDY的实现也基本上。Nginx官方代码中已经去除了spdy模块的代码,取而代之的是http2模块(ngx_http_v2_module)。

1、启用

1.1、在编译参数中参与http2模块(默认已经有ssl模块了):

# git clone https://github.com/alibaba/tengine.git
# cd tengine
# ./configure --prefix=/opt/tengine --with-http_v2_module
# make
# make install

1.2、生成测试注明和私钥

# cd /etc/pki/CA/
# touch index.txt serial
# echo 01 > serial
# openssl genrsa -out private/cakey.pem 2048
# openssl req -new -x509 -key private/cakey.pem -out cacert.pem
# cd /opt/tengine/conf
# openssl genrsa -out tengine.key 2048
# openssl req -new -key tengine.key -out tengine.csr
...
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:ZJ
Locality Name (eg, city) []:HZ
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Aliyun
Organizational Unit Name (eg, section) []:CDN
Common Name (e.g. server FQDN or YOUR name) []:www.tengine.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
...
# openssl x509 -req -in tengine.csr -CA /etc/pki/CA/cacert.pem -CAkey /etc/pki/CA/private/cakey.pem -CAcreateserial -out tengine.crt

1.3、配置http2

server {
        listen       443 ssl http2; 
        server_name  www.tengine.com;
        default_type  text/plain;
        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
        ssl_certificate     tengine.crt;
        ssl_certificate_key tengine.key;
        ssl_ciphers         EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:EECDH+AES256:EECDH+3DES:RSA+3DESi:RC4-SHA:ALL:!MD5:!aNULL:!EXP:!LOW:!SSLV2:!NULL:!ECDHE-RSA-AES128-GCM-SHA256;
        ssl_prefer_server_ciphers  on;

        location / {
            return 200 "http2 is ok";
        }
    }

1.4、启动tengine即可:

# /opt/tengine/sbin/nginx -c /opt/tengine/conf/nginx.conf
1.5、测试
先绑定/etc/hosts:
127.0.0.1 www.tengine.com
用nghttp工具测试:
jinjiu@j9mac ~/work/pcap$ nghttp 'https://www.tengine.com/' -v
[  0.019] Connected
[  0.043][NPN] server offers:
          * h2
          * http/1.1
The negotiated protocol: h2
[  0.064] recv SETTINGS frame <length=18, flags=0x00, stream_id=0>
          (niv=3)
          [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):128]
          [SETTINGS_INITIAL_WINDOW_SIZE(0x04):2147483647]
          [SETTINGS_MAX_FRAME_SIZE(0x05):16777215]
[  0.064] recv WINDOW_UPDATE frame <length=4, flags=0x00, stream_id=0>
          (window_size_increment=2147418112)
[  0.064] send SETTINGS frame <length=12, flags=0x00, stream_id=0>
          (niv=2)
          [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
          [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535]
[  0.064] send SETTINGS frame <length=0, flags=0x01, stream_id=0>
          ; ACK
          (niv=0)
[  0.064] send PRIORITY frame <length=5, flags=0x00, stream_id=3>
          (dep_stream_id=0, weight=201, exclusive=0)
[  0.064] send PRIORITY frame <length=5, flags=0x00, stream_id=5>
          (dep_stream_id=0, weight=101, exclusive=0)
[  0.077] send PRIORITY frame <length=5, flags=0x00, stream_id=7>
          (dep_stream_id=0, weight=1, exclusive=0)
[  0.077] send PRIORITY frame <length=5, flags=0x00, stream_id=9>
          (dep_stream_id=7, weight=1, exclusive=0)
[  0.077] send PRIORITY frame <length=5, flags=0x00, stream_id=11>
          (dep_stream_id=3, weight=1, exclusive=0)
[  0.077] send HEADERS frame <length=39, flags=0x25, stream_id=13>
          ; END_STREAM | END_HEADERS | PRIORITY
          (padlen=0, dep_stream_id=11, weight=16, exclusive=0)
          ; Open new stream
          :method: GET
          :path: /
          :scheme: https
          :authority: www.tengine.com
          accept: */*
          accept-encoding: gzip, deflate
          user-agent: nghttp2/1.9.2
[  0.087] recv SETTINGS frame <length=0, flags=0x01, stream_id=0>
          ; ACK
          (niv=0)
[  0.087] recv (stream_id=13) :status: 200
[  0.087] recv (stream_id=13) server: Tengine/2.2.0
[  0.087] recv (stream_id=13) date: Mon, 26 Sep 2016 03:00:01 GMT
[  0.087] recv (stream_id=13) content-type: text/plain
[  0.087] recv (stream_id=13) content-length: 11
[  0.087] recv HEADERS frame <length=63, flags=0x04, stream_id=13>
          ; END_HEADERS
          (padlen=0)
          ; First response header
http2 is ok[  0.087] recv DATA frame <length=11, flags=0x01, stream_id=13>
          ; END_STREAM
[  0.087] send GOAWAY frame <length=8, flags=0x00, stream_id=0>
          (last_stream_id=0, error_code=NO_ERROR(0x00), opaque_data(0)=[])

用chrome浏览器测试:
澳门葡京 15

2、抓包分析

从抓包来学习HTTP/2格式是最好的法门,但HTTP/2又是基于https的,也就是加密的,直接抓包看到的是密文,没有意思,还好Wireshark提供解密https流量的措施可以比较有利地调试HTTP/2。

2.1、起初出系统变量$SSLKEYLOGFILE,以OSX系统为例

#bash
echo "\nexport SSLKEYLOGFILE=~/ssl_debug/ssl_pms.log" >> ~/.bash_profile && . ~/.bash_profile

2.2、打开Chrome或者Firefox

#chrome
open /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome 
#firefox
open /Applications/Firefox.app/Contents/MacOS/firefox

用打开的Chrome或者Firefox浏览器打开https网站,比如:https://www.taobao.com
然后看看文件~/ssl_debug/ssl_pms.log有没有内容,有内容就足以用Wireshark解密https数据了。

2.3、Wireshark设置

Wireshark->Perferences...->Protocols->SSL

开行抓包:
澳门葡京 16

澳门葡京 17

看得出曾经能获取HTTP/2的公然数据了。篇幅所限,在此不举办具体细节了,更多HTTP/2二进制协议细节请参考RFC7540。


2. 多路复用

HTTP/2
复用TCP连接,在一个连续里,客户端和浏览器都得以而且发送三个请求或回应,而且不要遵照顺序依次对应,这样就防止了”队头堵塞”(见TCP/IP详解卷一)。
各种 Frame Header 都有一个 Stream ID
就是被用来落实该特性。每一趟请求/响应使用不同的 Stream ID。就像同一个 TCP
链接上的数量包通过 IP: PORT 来区别出多少包去往哪儿一样。

澳门葡京 18

rfc7540: HTTP2
Multiplexing中对Multiplexing的说明

Streams and Multiplexing A “stream” is an independent, bidirectional
sequence of frames exchanged between the client and server within an
HTTP/2 connection. Streams have several important characteristics: o A
single HTTP/2 connection can contain multiple concurrently open streams,
with either endpoint interleaving frames from multiple streams. o
Streams can be established and used unilaterally or shared by either the
client or server. o Streams can be closed by either endpoint. o The
order in which frames are sent on a stream is significant. Recipients
process frames in the order they are received. In particular, the order
of HEADERS and DATA frames is semantically significant. o Streams are
identified by an integer. Stream identifiers are assigned to streams by
the endpoint initiating the stream.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Streams and Multiplexing
 
   A "stream" is an independent, bidirectional sequence of frames
   exchanged between the client and server within an HTTP/2 connection.
   Streams have several important characteristics:
 
   o  A single HTTP/2 connection can contain multiple concurrently open
      streams, with either endpoint interleaving frames from multiple
      streams.
 
   o  Streams can be established and used unilaterally or shared by
      either the client or server.
 
   o  Streams can be closed by either endpoint.
 
   o  The order in which frames are sent on a stream is significant.
      Recipients process frames in the order they are received.  In
      particular, the order of HEADERS and DATA frames is semantically
      significant.
 
   o  Streams are identified by an integer.  Stream identifiers are
      assigned to streams by the endpoint initiating the stream.

3. 数据流

数量流发送到一半的时候,客户端和服务器都足以发送信号(RST_STREAM帧),撤销这多少个数据流。1.1版裁撤数据流的绝无仅有方法,就是关闭TCP连接。这就是说,HTTP/2
能够裁撤某一回呼吁,同时确保TCP连接还打开着,可以被其他请求使用。

测试

chrome插件

ssllabs翻开https配置是否够快

在 Chrome 地址栏输入chrome://net-internals/#http2,打开 Chrome 自带的
HTTP/2 查看工具,可查阅 HTTP/2 帧音讯

Wireshark抓包查看

四、性能

测试机器配置:cache1.cn1, 115.238.23.13, 16核Intel(R) Xeon(R) CPU L5630
@ 2.13GHz,48G内存,万兆网卡
测试工具:h2load
测试结果:

澳门葡京 19

澳门葡京 20


3. 数据流

多少流发送到一半的时候,客户端和服务器都得以发送信号(RST_STREAM帧),撤消以此数据流。1.1版裁撤数据流的唯一模式,就是关门TCP连接。这就是说,HTTP/2
可以废除某一回呼吁,同时保证TCP连接还开辟着,可以被其余请求使用。

4. 头音信压缩:

HTTP/2 对音讯头接纳
HPACK
举办压缩传输,可以节省消息头占用的网络的流量。而 HTTP/1.x
每便请求,都会引导大量冗余头音讯,浪费了许多带宽资源。
HTTP2对http头建立索引表,相同的头只发送hash
table 的index, 同时还用了霍夫曼编码和传统的gzip压缩。

连锁材料

  • http2
    讲解

  • http2 home

  • http2
    专题

  • 【协议分析】HTTP2优势分析

结论

1、无论是否keepalive,HTTP/2与SPDY/3.1性能非凡,HTTP/2略优。
2、在size为1k、2k、4k测试结果中保障较低RT状况下QPS也较高,CPU没有达到瓶颈,加大压测客户端数量后QPS有所提升,但RT变大,5xx也变多(那有的数据尚未交到,是测试时记下的景观)。
在size为16k、32k、64k、128k、256k的测试结果中CPU达到瓶颈,随着size变大,QPS降低,RT变高,CPU性能消耗较多的函数是gcm_ghash_clmul。
在size为512k时网卡达到瓶颈,CPU没有达标瓶颈。
3、在开启keepalive的情景下,HTTP/1.1的性质与HTTP/2的性质差别不是很大。但关闭keepalive时HTTP/2的习性比HTTP/1.1更好。

初稿地址

澳门葡京 21
 

4. 头音讯压缩:

HTTP/2 对音信头采用
HPACK
举办压缩传输,可以节约信息头占用的网络的流量。而 HTTP/1.x
每回请求,都会指引大量冗余头消息,浪费了好多带宽资源。
HTTP2对http头建立索引表,相同的头只发送hash
table 的index, 同时还用了霍夫曼编码和历史观的gzip压缩。

5. 服务器推送

服务端可以更快的把资源推送给客户端。例如服务端可以积极把 JS 和 CSS
文件推送给客户端,而不需要客户端解析 HTML
再发送这么些请求。当客户端需要的时候,它早已在客户端了。

那么存在一个问题,倘若客户端设置了缓存怎么做。有两种方法(来自社区)

  • 客户端可以透过安装SETTINGS_ENABLE_PUSH为0值公告服务器端禁用推送
  • 发觉缓存后,客户端和服务器都得以发送信号(RST_STREAM帧),撤销这么些数据流。
  • cache-digest(提案)

    rfc7540: HTTP2 Server
    Push

    #### 6. 流优先级

    HTTP2允许浏览器指定资源的优先级。

    rfc7540: Stream
    Priority

5. 服务器推送

服务端可以更快的把资源推送给客户端。例如服务端可以积极把 JS 和 CSS
文件推送给客户端,而不需要客户端解析 HTML
再发送这多少个请求。当客户端需要的时候,它曾经在客户端了。

这就是说存在一个题目,如若客户端设置了缓存肿么办。有二种形式(来自社区)

  • 客户端可以经过设置SETTINGS_ENABLE_PUSH为0值通告服务器端禁用推送
  • 察觉缓存后,客户端和服务器都可以发送信号(RST_STREAM帧),撤消以此数据流。
  • cache-digest(提案)

    rfc7540: HTTP2 Server
    Push

    #### 6. 流优先级

    HTTP2允许浏览器指定资源的事先级。

    rfc7540: Stream
    Priority

浏览器辅助

澳门葡京 22

主流浏览器都只协理 HTTP/2 Over TLS

浏览器帮忙

主流浏览器都只协理 HTTP/2 Over TLS

node中启用http2

node中得以用spdy模块来启动应用,spdy的api,与https是同样的且主流浏览器只援助HTTP/2
Over TLS,需要安排 私钥和证书,本地自签署服务器配置可参照引用6,7

const express = require('express');
const fs =  require('fs');
const http2 = require('spdy');
const path = require('path');
const options = {
    key: fs.readFileSync('./keys/privatekey.pem'),
    cert: fs.readFileSync('./keys/certificate.pem')
};
const app = new express();
http2
  .createServer(options, app)
  .listen(8080, ()=>{
    console.log(`Server is listening on https://localhost:8080.
     You can open the URL in the browser.`)
  }
)
app.use("/",(req,res)=>{

  res.send("hello http2!");
})

如上,对于已存在的连串只要修改几行代码就足以运用http2.0了。

请求头和响应头:
澳门葡京 23

表达:新版的Chrome,对不安全的证书(如本地的自签定服务)会降级到http1.1,firefox不会并发此题材。

启动server push

app.get("/",(req,res)=>{
    var stream = res.push('/app.js', {   //服务器推送
    status: 200, // optional
    method: 'GET', // optional
    request: {
      accept: '*/*'
    },
    response: {
      'content-type': 'application/javascript'
    }
  })
  stream.on('error', function() {
  })
  stream.end('console.log("http2 push stream, by Lucien ");')

  res.send(`hello http2!
    <script src="/app.js"></script>`);//express 并没有host static ,这个app.js 来自push 
})

源码在github

响应

澳门葡京 24

澳门葡京 25

node中启用http2

node中得以用spdy模块来启动应用,spdy的api,与https是同等的且主流浏览器只匡助HTTP/2
Over TLS,需要配备 私钥和表明,本地自签约服务器配置可参考引用6,7

JavaScript

const express = require(‘express’); const fs = require(‘fs’); const
http2 = require(‘spdy’); const path = require(‘path’); const options = {
key: fs.readFileSync(‘./keys/privatekey.pem’), cert:
fs.readFileSync(‘./keys/certificate.pem’) }; const app = new express();
http2 .createServer(options, app) .listen(8080, ()=>{
console.log(`Server is listening on . You can
open the URL in the browser.`) } ) app.use(“/”,(req,res)=>{
res.send(“hello http2!”); })

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const express = require(‘express’);
const fs =  require(‘fs’);
const http2 = require(‘spdy’);
const path = require(‘path’);
const options = {
    key: fs.readFileSync(‘./keys/privatekey.pem’),
    cert: fs.readFileSync(‘./keys/certificate.pem’)
};
const app = new express();
http2
  .createServer(options, app)
  .listen(8080, ()=>{
    console.log(`Server is listening on https://localhost:8080.
     You can open the URL in the browser.`)
  }
)
app.use("/",(req,res)=>{
    
  res.send("hello http2!");
})

如上,对于已存在的类别只要修改几行代码就足以行使http2.0了。

请求头和响应头:

表达:新版的Chrome,对不安全的证书(如本地的自签定服务)会降级到http1.1,firefox不会出现此题材。

启动server push

JavaScript

app.get(“/”,(req,res)=>{ var stream = res.push(‘/app.js’, {
//服务器推送 status: 200, // optional method: ‘GET’, // optional
request: { accept: ‘*/*’ }, response: { ‘content-type’:
‘application/javascript’ } }) stream.on(‘error’, function() { })
stream.end(‘console.log(“http2 push stream, by Lucien “);’)
res.send(`hello http2! <script
src=”/app.js”></script>`);//express 并没有host static
,这个app.js 来自push })

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
app.get("/",(req,res)=>{
    var stream = res.push(‘/app.js’, {   //服务器推送
    status: 200, // optional
    method: ‘GET’, // optional
    request: {
      accept: ‘*/*’
    },
    response: {
      ‘content-type’: ‘application/javascript’
    }
  })
  stream.on(‘error’, function() {
  })
  stream.end(‘console.log("http2 push stream, by Lucien ");’)
 
  res.send(`hello http2!
    <script src="/app.js"></script>`);//express 并没有host static ,这个app.js 来自push
})

源码在github

响应

抓包分析

可以用chrome
内部自带的工具(chrome://net-internals/)查看http2流量,但这么些包消息量相比少,结构不如我们耳熟能详的Fiddler%E6%9F%A5%E7%9C%8Bhttp2%E6%B5%81%E9%87%8F,%E4%BD%86%E8%BF%99%E4%B8%AA%E5%8C%85%E4%BF%A1%E6%81%AF%E9%87%8F%E6%AF%94%E8%BE%83%E5%B0%91%EF%BC%8C%E7%BB%93%E6%9E%84%E4%B8%8D%E5%A6%82%E6%88%91%E4%BB%AC%E7%86%9F%E6%82%89%E7%9A%84Fiddler)
or Wireshark清晰。

Fiddler是直接作为中间代理,可以看做客户端直接与服务端通讯,可以像浏览器这样间接解密https,直接看看https报文,
然而出于受限于.NET
Framework暂不协理Http2.

用wireshark直接抓包 https:443端口的流量是这样的:
澳门葡京 26

数码被加密了,协议细节完全看不到。
这里介绍了一种方法取得私钥解包。
抓包https包时要把代理关了,不然私钥不是同一个,wireshark不可以解包(被这一个坑了两钟头T
T)。

澳门葡京 27

澳门葡京 28

一个包内有两个不等的Steam ID

澳门葡京 29

追踪解密后TCP流可以看到,由于多路复用,各种不同的呼吁交替传输不同的帧,所以流数据是乱的。但在相同帧内数据或者如常的。

抓包分析

可以用chrome
内部自带的工具(澳门葡京,chrome://net-internals/)查看http2流量,但这么些包信息量相比较少,结构不如大家耳熟能详的Fiddler%E6%9F%A5%E7%9C%8Bhttp2%E6%B5%81%E9%87%8F,%E4%BD%86%E8%BF%99%E4%B8%AA%E5%8C%85%E4%BF%A1%E6%81%AF%E9%87%8F%E6%AF%94%E8%BE%83%E5%B0%91%EF%BC%8C%E7%BB%93%E6%9E%84%E4%B8%8D%E5%A6%82%E6%88%91%E4%BB%AC%E7%86%9F%E6%82%89%E7%9A%84Fiddler)
or Wireshark清晰。

Fiddler是直接当做中间代理,能够视作客户端直接与服务端通讯,可以像浏览器这样直接解密https,直接观望https报文,
唯独由于受限于.NET
Framework暂不帮忙Http2.

用wireshark直接抓包 https:443端口的流量是这么的:

数据被加密了,协议细节完全看不到。
这里介绍了一种办法得到私钥解包。
抓包https包时要把代理关了,不然私钥不是同一个,wireshark不可能解包(被这么些坑了两钟头T
T)。

一个包内有多少个不等的Steam ID

追踪解密后TCP流可以见到,由于多路复用,各种不同的央浼交替传输不同的帧,所以流数据是乱的。但在同等帧内数据或者健康的。

最后

末尾,HTTP2有更高的传输速度,更少的资源占用,可以去除各样性能优化tricks(如css
sprite,inline-image.)
转车WEB开发的美好将来T.T

最后

末段,HTTP2有更高的传输速度,更少的资源占用,可以去除各样性能优化tricks(如css
sprite,inline-image.)
倒车WEB开发的美好将来T.T

参考资料

  1. Turn-on HTTP/2 today!
  2. Hypertext Transfer Protocol Version 2
    (HTTP/2)
  3. npm spdy
  4. npm spdy push
  5. How to create a self-signed SSL
    Certificate
  6. HPACK: Header Compression for
    HTTP/2
  7. 用Node.js创造自签定的HTTPS服务器

参考资料

  1. Turn-on HTTP/2 today!
  2. Hypertext Transfer Protocol Version 2
    (HTTP/2)
  3. npm spdy
  4. npm spdy push
  5. How to create a self-signed SSL
    Certificate
  6. HPACK: Header Compression for
    HTTP/2
  7. 用Node.js创造自签定的HTTPS服务器

    1 赞 收藏
    评论

澳门葡京 30

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website