HTTP/2 Features and iOS or Android Useage

HTTP


  • 超文本传输协议(HyperText Transfer Protocol)
  • 客户端与服务器应答标准
  • 基于TCP/IP协议的应用层协议
  • 91年发布HTTP/0.9,96年HTTP/1.0, 99年HTTP/1.1
  • 2015年HTTP/2 Spec 发布 RFC 7540

HTTP/0.9 - HTTP/1.1


  • 0.9仅有一个Get方法
  • 1.0增加若干内容如Post Head,不支持永久TCP连接...
  • 1.1版本增加更多内容,支持持久连接,管道机制,缓存...

HTTP面临的问题


  • TCP不能够充分被利用
  • 网络差就会延迟
  • 目前优化HTTP的方案都比较繁琐
  • HTTP包含太多的细节和可选部分,过于庞大
  • HTTP Pipelinging(通过管线提高TCP利用率),会队头阻塞(Head-of-line blocking)
  • 延迟,HTTP Streaming延迟
  • 请求的内容越来越大
WebRequest

目前的解决方法

  • 合并脚本
  • 样式表
  • 图片嵌入CSS
  • 域名分片

SPDY(Speed)

  • 由Google开发,设计目的在于降低网页的加载时间
  • SPDY不用于替换HTTP,只是修改了HTTP的传输方式
  • 有多路复用,优先级,和压缩的特性
  • 仅支持在TLS(安全传输层协议)层
  • SPDY是Google的注册商标

HTTP/2


  • 基于SPDY草案修改
  • 在现有协议上之上构建的新协议,保留现有
  • 更好的利用TCP特性来减少传输过程中的等待和暂停
  • 更好的Web体验
  • HTTP/2 是google开发的 SPDY协议的一个子集
  • 解决队头阻塞(Head-of-line blocking)问题
  • 下一个协议是HTTP/3
  • RFC 7540

HTTP/2特性

与HTTP1.x兼容

使用NPN或者ALPN在请求之前确定应该如何使用哪种协议来通讯.

  • ALPN(Application Layer Protocol Negotiation)(HTTP2)
  • NPN(Next Protocol Negotiation)(SYPD)

NPN与ALPN的区别在于: 谁来决定会话所使用的协议
ALPN:客户端先发送一个协议优先级列表给服务器,有服务器选择合适的
NPN:服务通知客户端所有它支持的格式,客户端来选合适的进行通信

NPN已经被ALPN取代

二进制协议

  • HTTP由文本协议变成二进制协议
  • 为了更好的实现成帧,使用文本再数据处理会很繁琐
  • 一个帧包含数据帧和头帧
  • 使用curl或者Wireshark来解析


  • 连接建立之后之后用帧来传输数据
  • Length表示帧的大小
  • Type类型定义了剩余的帧报头和帧主体将如何被解释
  • Flags在不同帧类型赋予不同的语义
  • StreamIdentifier流的标识符号,用于确定是那个流的帧
  • FramePayload 数据
  • 目前已定义的帧有10种DATA、HEADERS、PRIORITY 、RST_STREAM、SETTINGS、PUSH_PROMISE、PING、GOAWAY、WINDOW_UPDATE、CONTINUATION

多路复用Multiplexing

  • 在一个TCP连接里,可以发送多个请求或回应,可以不按照顺序发送

Multiplexing 在一个TCP连接里,服务器同时收到了A请求和B请求,于是先回应A请求,结果发现处理过程非常耗时,于是就发送A请求已经处理好的部分,接着回应B请求,完成后,再发送A请求剩下的部分。 ——

数据流

  • 每个请求或回应的数据包为一个流
  • 每个流都会有一个StreamID,由启动流的终端分配
  • 客户端可以定义流的并发量

优先级和依赖性

  • 每个的帧头都会包含流的优先级标识
  • 可以根据优先级帧来调整已经发送的流的优先级
  • 没有明确指定使用默认值
  • 流可以显示依赖其他流

头压缩 HPack

  • HTTP属于无状态协议,表示每次请求都会携带相同的信息,为了减少冗余信息使用了HPACK机制来对请求头进行压缩
  • 使用了默认的Static Table 和 可以由客户端添加字段的Dynamic Table
  • 使用哈夫曼编码
  • 压缩效率高效
  • RFC 7541

中断请求

  • 如果想取消一个请求只需要发送RST_STREAM 帧就可以了

服务器推送

  • 可以在没有请求的情况下主动向客户端推送内容
  • 客户端可以选择是否中断推送

    ServerPush-1294

HTTP连接管理

HTTP/2连接是永久性的。为了最佳的性能,它期待直到确定与服务端的进一步沟通不再必要的时候,客户端才会关闭连接(例如,当用户导航到其他特定的网页),或者直到服务端关闭连接。

Chrome Debug


  1. 使用Node.js 搭建一个建议HTTP2服务器
    https://github.com/molnarg/node-http2

  2. 使用Developer Tools来查看HTTP与HTTP/2的区别



    可以看出HTTP/2使用一条TCP连接完成所有的资源请求

  3. 查看HTTP/2的建立与帧传输
    chrome://net-internals/#http2

  4. WireShark也支持抓包,不过因为HTTP/2走了TLS,所以要做一些代理处理,不做解释。

Mobie


iOS


NSURLSession


  • NSURLSession在iOS9.0之支持HTTP/2,SYPD
  • 开发者不需做修改
  • iOS10之后支持调试可查看请求使用的协议
  • 推测通过NSURLSession通过curl实现HTTP2...(经过ida拆解只找到使用了和curl相同的HTTP/2头解析库😭)

ASPN


  • New provider API
  • ASPN服务使用HTTP/2来实现,通过减少TCP连接大幅度提升服务器效率,减少服务端压力

总结

iOS同学基本上,如果使用了URLSession去做网络请求可以啥都不用干,只要Server支持HTTP/2就可以了

Android


没有写过安卓...本部分仅参考

OKHttp


  • 安卓端的一个HTTP的实现
  • JAVA实现了HTTP/2
  • 据Android同学SK IMSK 分享,该库在重用TCP方面做的非常好

REF

http://kamranahmed.info/blog/2016/08/13/http-in-depth/ HTTP协议简介
https://github.com/square/okhttp 安卓Http网络请求的实现
https://github.com/kylef/hpack.swift hpackSwift实现
https://github.com/curl/curl libcurl
https://github.com/nghttp2/nghttp2 curl里HPack的实现
https://github.com/apple/swift-corelibs-foundation Swift版本Foundation实现
http://opensource.apple.com/source/CF/CF-1153.18/
https://http2.github.io/
http://httpwg.org/specs/rfc7540.html RFC7540 HTTP2.0详细实现
http://www.chromium.org/spdy/spdy-whitepaper
https://developer.apple.com/videos/play/wwdc2016/711/ NSURLSession: New Features and Best Practices
https://developer.apple.com/videos/play/wwdc2015/711/ Networking with NSURLSession
https://developer.apple.com/videos/play/wwdc2015/720/ What’s New in Notifications
https://developer.apple.com/videos/play/wwdc2015/724/
What’s New in Apple Push Notification Service

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容