专栏名称: Cocoa开发者社区
CocoaChina苹果开发中文社区官方微信,提供教程资源、app推广营销、招聘、外包及培训信息、各类沙龙交流活动以及更多开发者服务。
目录
相关文章推荐
51好读  ›  专栏  ›  Cocoa开发者社区

关于 iOS HTTP2.0 的一次学习实践

Cocoa开发者社区  · 公众号  · ios  · 2017-04-26 17:20

正文

请到「今天看啥」查看全文



  • 单一连接:刚才也说到 1.1 在请求多的时候,会开启6-8个连接,而 HTTP2 只会开启一个连接,这样就减少握手带来的延迟。

  • 头部压缩:HTTP2.0 通过 HPACK 格式来压缩头部,使用了哈夫曼编码压缩、索引表来对头部大小做优化。索引表是把字符串和数字之间做一个匹配,比如method: GET对应索引表中的2,那么如果之前发送过这个值是,就会缓存起来,之后使用时发现之前发送过该Header字段,并且值相同,就会沿用之前的索引来指代那个Header值。具体实验数据可以参考这里:HTTP/2 头部压缩技术介绍


  • Server Push:就是服务端可以主动推送一些东西给客户端,也被称为缓存推送。推送的资源可以备客户端日后之需,需要的时候直接拿出来用,提升了速率。具体的实验可以参考这里:iOS HTTP/2 Server Push 探索


除了上面讲到的特性,HTTP2.0 还有流量控制、流优先级和依赖性等功能。更多细节可以参考: Hypertext Transfer Protocol Version 2 (HTTP/2)

iOS客户端接入HTTP 2.0

iOS 如何接入 HTTP 2.0呢?其实很简单:

  • 保证服务端支持 HTTP2.0,并且留意下 NPN 或 ALPN

  • 客户端系统版本 iOS 9 +

  • 使用 NSURLSession 代替 NSURLConnection

  • 客户端是使用 h2c 还是 h2,它们可以说是 HTTP2.0的两个版本,h2 是使用 TLS 的HTTP2.0协议,h2c是运行在明文 TCP 协议上的 HTTP2.0协议。浏览器目前只支持h2,也就是说必须基于HTTPS部署,但是客户端可以不部署HTTPS,因为我司早已部署HTTPS,所以我这里的实践都是基于h2的

HTTP 2.0的协商机制

上面说了一堆名次,什么NPN、ALPN呀,还有h2、h2c之类的,有点懵逼。NPN(Next Protocol Negotiation)是一个 TLS 扩展,由 Google 在开发 SPDY 协议时提出。随着 SPDY 被 HTTP/2 取代,NPN 也被修订为 ALPN(Application Layer Protocol Negotiation,应用层协议协商)。二者目标一致,但实现细节不一样,相互不兼容。以下是它们主要差别:

  • NPN 是服务端发送所支持的 HTTP 协议列表,由客户端选择;而 ALPN 是客户端发送所支持的 HTTP 协议列表,由服务端选择;

  • NPN 的协商结果是在 Change Cipher Spec 之后加密发送给服务端;而 ALPN 的协商结果是通过 Server Hello 明文发给客户端

同时,目前很多地方开始停止对NPN的支持,仅支持 ALPN,所以公司使用的话,最佳是直接使用 ALPN。

下面就直接来看看 ALPN 的协商过程是怎样的,ALPN 作为 TLS 的一个扩展,其过程可以通过 WireShark 查看 TLS握手过程来查看

下面通过 WireShark 来进行调试,接入真机,然后终端输入
rvictl -s 设备 UDID来创建一个映射到 iPhone 的虚拟网卡,UUID 可以在 iTunes 中获取到,运行命令后会看到成功创建 rvi0 虚拟网卡的,双击 rvi0 开始调试。







请到「今天看啥」查看全文