close
当前位置: 物联网在线 > 技术文库 > ios >

iOS HTTP/2 Server Push 探索

iOS HTTP/2 Server Push 探索

当用户的浏览器和服务器在建立链接后,服务器主动将一些资源推送给浏览器并缓存起来,这样当浏览器接下来请求这些资源时就直接从缓存中读取,不会在从服务器上拉了,提升了速率。举一个例子就是:

假如一个页面有3个资源文件index.html,index.css,index.js,当浏览器请求index.html的时候,服务器不仅返回index.html的内容,同时将index.css和index.js的内容push给浏览器,当浏览器下次请求这2两个文件时就可以直接从缓存中读取了。

如下图所示:

iOS HTTP/2 Server Push 探索

HTTP/2 Server Push 原理是什么

要想了解server push原理,首先要理解一些概念。我们知道HTTP/2传输的格式并不像HTTP1使用文本来传输,而是启用了二进制帧(Frames)格式来传输,和server push相关的帧主要分成这几种类型:

HEADERS frame(请求返回头帧):这种帧主要携带的http请求头信息,和HTTP1的header类似。

DATA frames(数据帧) :这种帧存放真正的数据content,用来传输。

PUSH_PROMISE frame(推送帧):这种帧是由server端发送给client的帧,用来表示server push的帧,这种帧是实现server push的主要帧类型。

RST_STREAM(取消推送帧):这种帧表示请求关闭帧,简单讲就是当client不想接受某些资源或者接受timeout时会向发送方发送此帧,和PUSH_PROMISE frame一起使用时表示拒绝或者关闭server push。

(PS:HTTP/2相关的帧其实包括 10种帧 ,正是因为底层数据格式的改变,才为HTTP/2带来许多的特性,帧的引入不仅有利于压缩数据,也有利于数据的安全性和可靠传输性。)

了解了相关的帧类型,下面就是具体server push的实现过程了:

由多路复用我们可以知道HTTP/2中对于同一个域名的请求会使用一条tcp链接而用不同的stream ID来区分各自的请求。

当client使用stream 1请求index.html时,server正常处理index.html的请求,并可以得知index.html页面还将要会请求index.css和index.js。

server使用stream 1发送PUSH_PROMISE frame给client告诉client我这边可以使用stream 2来推送index.js和stream 3来推送index.css资源。

server使用stream 1正常的发送HEADERS frame和DATA frames将index.html的内容返回给client。

client接收到PUSH_PROMISE frame得知stream 2和stream 3来接收推送资源。

server拿到index.css和index.js便会发送HEADERS frame和DATA frames将资源发送给client。

client拿到push的资源后会缓存起来当请求这个资源时会从直接从从缓存中读取。

Server Push 怎么用 使用 nghttp2 调试 HTTP/2 流量

查看 HTTP/2 流量的几种方式

在 Chrome 地址栏输入 chrome://net-internals/#http2 ,使用 Chrome 自带的 HTTP/2 调试工具;
使用方便,但受限于 Chrome 浏览器,对于 Chrome 不支持的 h2c(HTTP/2 Cleartext,没有部署 TLS 的 HTTP/2)协议无能为力。同时,这个工具显示的信息经过了解析和筛选,不够全面。

使用 Wireshark 调试 HTTP/2 流量;
Wireshark 位于服务端和浏览器之间,充当的是中间人角色,用它查看 HTTP/2 over HTTPS 流量时,必须拥有网站私钥或者借助浏览器共享对称密钥,才能解密 TLS 流量,配置起来比较麻烦。

nghttp2,是一个用 C 实现的 HTTP/2 库,支持 h2c。它可以做为其它软件的一部分,为其提供 HTTP/2 相关功能(例如 curl 的 HTTP/2 功能就是用的 nghttp2)。除此之外,它还提供了四个有用的 HTTP/2 工具:

nghttp:HTTP/2 客户端;

nghttpd:HTTP/2 服务端;

nghttpx:HTTP/2 代理,提供 HTTP/1、HTTP/2 等协议之间的转换;

h2load:HTTP/2 性能测试工具;

nghttp2 安装

先来用 brew 看一下有没有 nghttp 相关的库:

~ brew search nghttp nghttp2

看来是有 nghttp2 的,再用 brew 看下需要安装哪些环境:

~ brew info nghttp2 nghttp2: stable 1.21.0 (bottled), HEAD HTTP/2 C Library https://nghttp2.org/ Not installed From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/nghttp2.rb ==> Dependencies Build: sphinx-doc ✘, pkg-config ✔, cunit ✘ Required: c-ares ✘, libev ✘, openssl ✔, libevent ✘, jansson ✘, boost ✘, spdylay ✘ Recommended: jemalloc ✘ ==> Requirements Optional: python3 ✔ ==> Options --with-examples Compile and install example programs --with-python3 Build python3 bindings --without-docs Don't build man pages --without-jemalloc Build without jemalloc support --HEAD Install HEAD version

看来需要的依赖还挺多。

使用 brew 安装 nghttp2 :

brew install nghttp2

一切妥当后,nghttp2 提供的几个工具就可以直接用了。

nghttp
(责任编辑:ioter)

用户喜欢...

美超微推出新款2U Ultra服务器,实现突破性1800万次IOPS存储性能

计算、存储、网络技术和绿色计算领域的全球领导者美超微电脑股份有限公司(Super Micro Computer, Inc.) (NASDAQ: SMCI)今天宣...


阿里数加:机器学习算法基于信用卡消费记录做信用评分

如果你是做互联网金融的,那么一定听说过评分卡。评分卡是信用风险评估领域常用的建模方法,评分卡并不简单对...


利用PCI局部总线实现BIade Server的数据交换

新一代机架式服务器Blade Server(刀片服务器),应用iSCSI协议,通过TCP/IP实现网络存储,利用Intemet,可将SCSI数据包传到地球上的任何地方。 笔者着眼于刀片服务器的内部构架和整体方案的介绍...


如何在阿里云数加平台实践Serverless架构?

导读 移动互联网、物联网和大数据应用的快速发展极大地促进了人们对云计算的需求。 但是让应用架构拥有良好的可...


有效利用SQL Server容器的价值、用例及方法

作者:Paul Stanton 译者:周元昊 微软在2014年秋宣布,计划在Windows Server 2016中增加对Docker容器的支持。这个声明进一...


iOS实用篇:Https双向认证

年前的时候,关于苹果要强制https的传言四起,虽然结果只是一个“谣言”,但是很明显的这是迟早会到来的,间接上加速了各公司加紧上https的节奏,对于iOS客户端来说,上https需不需要改变...


分布式TensorFlow集群local server使用详解

作者:tobe迪豪 通过local server理解分布式TensorFlow集群的应用与实现。 简介 TensorFlow从0.8版本开始,支持分布式集...


2017数据科学职位报告:R超过SAS,但仍不如Python

作者:Bob Muenchun 前言 招聘广告的数量能一定程度上反应每一种软件的流行程度,并从中预测出哪一种在将来会更加流...


python爬虫入门

基础知识 HTTP协议 我们浏览网页的浏览器和手机应用客户端与服务器通信几乎都是基于HTTP协议,而爬虫可以看作是一...


说好一起做云计算,怎么都做数据库去了?

不知道大家有没有关注,Gartner最近两年发布的“Magic Quadrant for Operational Database Management Sys...