/ http/2

HTTP/2 通信的流量分析——浅析

作者:mzeyong(k2yk)

创建日期 : 2017/06/25

发布日期 : 2017/07/06
更新日期 : 2017/07/06

PDF版本:不给
word 版本: 不给

本文为作者原创,转载需要经得作者同意,作者联系方式:mzeyong@gmail.com

github


0x00 前言

本文部分一共分为1+4大部分,分为:

  • 前言
  • HTTP/2 特性描述
  • HTTP/2 的特征向量设计与其相关简介
  • HTTP/2 的特征向量提取
  • HTTP/2 特征向量的匹配公式及其算法
  • HTTP/2 特征匹配
  • 关于HTTP/2的思考
  • references

其他的要么就是关于这个东西的是什么,为什么写这个东西还有就我是怎么做的。
在这里先简单的说一下关于这片文章的起源,这篇文章和我个人的本科毕业论文写的其实是一样的东西,也是叫做HTTP/2通信的流量分析。
秉着前行路上寻找更多的道友的想法,我便开始写下了这篇东西的想法

其实在前不久有个漏洞,链接详情在这里http://www.ringroadbug.com/ ,可能这个漏洞大家看起来有点鸡肋,但应该是可以和本文中所提到的一些关于HTTP/2协议传输机制以及对应的流量特征捕抓有着一定的联系。可能有人会问了。。。POC呢?少侠别急,等我们先煎壶小酒再来慢慢谈


0x01 http/2 的特性

在谈HTTP/2通信的流量分析就不得不提一个东西就是HTTP/2的流量特性。HTTP/2 仍是对之前 HTTP 标准的扩展,而非替代。 HTTP 的应用语义不变,提供的功能不变,HTTP 方法、状态代码、URI 和标头字段等这些核心概念也不变。但是,需要注意一点的是,解决了之前协议的性能限制,HTTP/2在其流量以及信息交互等方向上进行了不小的改动,因此,也产生了新的流量特性,下面将简要的介绍一下HTTP/2的新特性:

HTTP/2 通过支持标头字段压缩和在同一连接上进行多个并发交换,让应用更有效地利用网络资源,减少感知的延迟时间。具体来说,它可以对同一连接上的请求和响应消息进行交错发送并为 HTTP 标头字段使用有效编码。 HTTP/2 还允许为请求设置优先级,让更重要的请求更快速地完成,从而进一步提升性能。出台的协议对网络更加友好,因为与 HTTP/1.x 相比,可以使用更少的 TCP 连接。

这意味着与其他流的竞争减小,并且连接的持续时间变长,这些特性反过来提高了可用网络容量的利用率。 最后,HTTP/2 还可以通过使用二进制消息分帧对消息进行更高效的处理。(超文本传输协议版本 2,草案 17,链接详情查看reference)

虽然说是简介,但是也是要说一下关键的几点关键并且对我们的研究会有很大的帮助

二进制分帧层

HTTP/2 所有性能增强的核心在于新的二进制分帧层,它定义了如何封装 HTTP 消息并在客户端与服务器之间传输。

这里所谓的“层”,指的是位于套接字接口与应用可见的高级 HTTP API 之间一个经过优化的新编码机制:HTTP 的语义(包括各种动词、方法、标头)都不受影响,不同的是传输期间对它们的编码方式变了。HTTP/1.x 协议以换行符作为纯文本的分隔符,而 HTTP/2 将所有传输的信息分割为更小的消息和帧,并采用二进制格式对它们编码。

这样一来,客户端和服务器为了相互理解,都必须使用新的二进制编码机制:HTTP/1.x 客户端无法理解只支持 HTTP/2 的服务器,不过幸运的是,现有的应用不必担心这些变化,因为客户端和服务器会替我们完成必要的分帧工作。(什么,你的客户端不支持HTTP/2?那还不赶紧加入HTTP/2升级大家庭,享受畅快的网络体验?!)

数据流、消息和帧

新的二进制分帧机制改变了客户端与服务器之间交换数据的方式。 为了说明这个过程,我们需要了解 HTTP/2 的三个概念:

数据流:已建立的连接内的双向字节流,可以承载一条或多条消息。
消息:与逻辑请求或响应消息对应的完整的一系列帧。
帧:HTTP/2 通信的最小单位,每个帧都包含帧头,至少也会标识出当前帧所属的数据流。
这些概念的关系总结如下:

所有通信都在一个 TCP 连接上完成,此连接可以承载任意数量的双向数据流。
每个数据流都有一个唯一的标识符和可选的优先级信息,用于承载双向消息。
每条消息都是一条逻辑 HTTP 消息(例如请求或响应),包含一个或多个帧。
帧是最小的通信单位,承载着特定类型的数据,例如 HTTP 标头、消息负载,等等。 来自不同数据流的帧可以交错发送,然后再根据每个帧头的数据流标识符重新组装。
HTTP/2 数据流、消息和帧

简言之,HTTP/2 将 HTTP 协议通信分解为二进制编码帧的交换,这些帧对应着特定数据流中的消息。所有这些都在一个 TCP 连接内复用。这是 HTTP/2 协议所有其他功能和性能优化的基础。

说完概念了当然还有最后一个重要的特性需要说出来的,就是

请求与响应复用

在 HTTP/1.x 中,如果客户端要想发起多个并行请求以提升性能,则必须使用多个 TCP 连接(请参阅使用多个 TCP 连接)。这是 HTTP/1.x 交付模型的直接结果,该模型可以保证每个连接每次只交付一个响应(响应排队)。更糟糕的是,这种模型也会导致队首阻塞,从而造成底层 TCP 连接的效率低下。

HTTP/2 中新的二进制分帧层突破了这些限制,实现了完整的请求和响应复用:客户端和服务器可以将 HTTP 消息分解为互不依赖的帧,然后交错发送,最后再在另一端把它们重新组装起来。

一个共享连接内的 HTTP/2 请求和响应复用

快照捕捉了同一个连接内并行的多个数据流。客户端正在向服务器传输一个 DATA 帧(数据流 5),与此同时,服务器正向客户端交错发送数据流 1 和数据流 3 的一系列帧。因此,一个连接上同时有三个并行数据流。

将 HTTP 消息分解为独立的帧,交错发送,然后在另一端重新组装是 HTTP 2 最重要的一项增强。事实上,这个机制会在整个网络技术栈中引发一系列连锁反应,从而带来巨大的性能提升,让我们可以:

  • 并行交错地发送多个请求,请求之间互不影响。
  • 并行交错地发送多个响应,响应之间互不干扰。
  • 使用一个连接并行发送多个请求和响应。
  • 不必再为绕过 HTTP/1.x 限制而做很多工作(请参阅针对 HTTP/1.x 进行优化,例如级联文件、image sprites 和域名分片。
  • 消除不必要的延迟和提高现有网络容量的利用率,从而减少页面加载时间。
  • 等等…

HTTP/2 中的新二进制分帧层解决了 HTTP/1.x 中存在的队首阻塞问题,也消除了并行处理和发送请求及响应时对多个连接的依赖。结果,应用速度更快、开发更简单、部署成本更低。


0x02 HTTP/2特征向量设计与其相关简介

想必大家再看到上面的HTTP/2特性的时候应该就会有一些自己的一些思路了吧,骚操作随着心脏扑通扑通的跳出来了。

上面所说的先不谈论关于HTTP/2中的新的分帧层这个特性,大家看到所谓的多路复用了吗?对,多路复用,大家想到了什么?!对!没错,就是单链路进行。单链路这个特性的确减少了在传输多个对象之间的握手所造成的延迟,毕竟TCP原来的3步握手现象就已经使连接速度减缓了,因此复用一条链路通路的确可以在一定程度上减轻了传输多个对象的时候的握手延迟,毕竟HTTP/1.X中所提出的长连接就是这么用的。但是单个链路就会带来一定的安全隐患,比如我可以通过嗅探此链路上的网络流量,就可以简单得出其的对应的流量的大小了。

诶说到了可以流量的大小是不是就可以得到一个关于HTTP/2流量特征的一个想法以及思考对象大小-加载顺序为一个特征