iOS9 ATS HTTP/2 NSURLSession

本文主要是看了

  • WWDC 2015 - Session 711 - Networking with NSURLSession
  • WWDC 2016 - Session 711 - NSURLSession: New Features and Best Practices

做出的翻译和总结, 文字/视频链接如下 :

  • wwdc2015/711 : Networking with NSURLSession
  • wwdc2016/711 : NSURLSession: New Features and Best Practices

App Transfer Security


iOS9新特性. 核心是防止用户的个人隐私数据被意外泄漏. 加强默认Configuration的安全性.

HTTP

以前HTTP请求是明文传输(clearText)的, 别人拦截请求之后就能获取所有信息.

HTTPS

HTTPS通过在TCP于HTTP层之间加入一层SSL/TLS层, 能做到 :

  • Encryption : 信息加密传输, 别人看不懂
  • Integrity : 保证数据完整性, 即第三方篡改后能检测出来
  • Authentication : 身份验证, 防止第三方伪造通信

HTTPS in iOS

苹果希望所有所有请求都使用HTTPS来加强安全性, 但是也有以下几种例外(以下全部可以在info.plist文件中配置) :

  • 全局HTTPS请求, 但是某个域名采用HTTP请求
    NSAppTransportSecurity
    NSAllowsArbitraryLoads = NO // 默认为NO, 这一行不要也行
    NSExceptionDomains
    "media.example.com"
    NSExceptionAllowsInsecureHTTPLoads = YES
  • 全局HTTP请求, 但是某个域名采用HTTPS请求
    NSAppTransportSecurity
    NSAllowsArbitraryLoads = YES
    NSExceptionDomains
    "secure.example.com"
    NSExceptionAllowsInsecureHTTPLoads = NO
  • 全局HTTP/HTTPS(任意)请求
    NSAppTransportSecurity
    NSAllowsArbitraryLoads = YES

使用NSAllowsArbitraryLoads可以检测app中加载失败是不是因为ATS的原因.

CFNetwork中用于网络诊断的环境变量CFNETWORK_DIAGNOStICS = 1 : 所有加载失败的URL都能被确定是URL错误还是底层TLS错误. 这样能进一步排查错误.

下面为ATS新增的属性

  • NSAllowsArbitraryLoadsInWebContent : UIWebView会无视app的其他协议, 加载HTTP的内容. 仅限于UIWebVie对象, 其他对象还是对遵循安全协议.

  • NSRequiresCertificateTransparency : 保证证书的合法性.

NSURLSession新特性


NSURLSession将全面支持HTTP/2 !

为什么需要HTTP/2

由于HTTP/1.1存在许多问题 :

  • 单路连接 请求低效

    • 每个TCP连接只能对应一个HTTP请求, 每个HTTP请求只请求一个资源, 浏览器只能通过建立多个TCP连接来解决, 但是由于文本协议开销, 缺乏头压缩, 意味着对客户端和服务器的要求更高且性能更低下
    HTTP/1.1 without pipelining
    • 使用HTTP管道, 但是HTTP管道并不适用于所有的服务器或网络, 实际上在很多浏览器上是被禁止的. 事实上效率并不高.
    HTTP/1.1 with pipelining
  • HTTP只允许由客户端主动发起请求
    • 意味着缺少预加载的功能
  • HTTP头冗余
    • 每次发送HTTP请求都有一堆重复的header value

了解HTTP/2

between HTTP/1.1 and HTTP/2

HTTP/2 有什么改进 :

  • 一个TCP连接能发起多个HTTP请求
  • 实现完全多路复用, 意味着一个新的请求不用等到上一个请求得到响应之后再发出
  • 有请求优先级, 所以能把重要的资源优先提供给拥有更高权限的客户端.
  • 使用二进制分帧, 使得数据的处理和解析速度更快.
  • 使用HPACK头压缩技术
    • 使用一个静态表和一个动态表
    • 静态表包含最常用的HTTP信息头, 并且不可修改
    • 包含在静态表中的信息头可以动态添加到动态表中, 动态表中的信息头通过指针引用静态表中的信息
  • HTTP/2自动支持HTTPS, 意味着HTTP/2是安全的
  • 支持服务器自推送

HTTP/2 多路复用

Q : HTTP/2多路复用是如何队首阻塞的问题的?

A : 在HTTP/1.1的时候曾试过采用HTTP pipelining (HTTP 管道/流水线 技术)能实现同一TCP连接中不用等待旧请求的响应就可以发送新请求. 但是HTTP pipelining有个致命的缺点 : HTTP响应仍然是按照请求的顺序依次收到.

HTTP/2 多路复用+请求优先级, 发送的时候还是依次发送请求, 但是与此同时我们同时得到了回复, 同时, 更高优先级的请求我们得到以及发送给客户端的速度更快, 如下图所示 :

HTTP/2 Multiplexing

服务器自推送

在HTTP/1.1时代, 我们没有服务器自推送, 只能发一个请求, 得到响应之后再发第二个请求... 延迟可想而知 :

HTTP/1.1 without Server Push

而在HTTP/2时代, 我们有了服务器自推送, 服务器会把相关联的数据全部push给我们 :

HTTP/2 with Server Push

性能马上强了一大截, 我们再也不用像以前那样苦苦等待了.

并且这功能已经内嵌在NSURLSession中, 我们不需要写任何一行代码来支持其实现.

iOS中适配HTTP/2

NSURLSession已经自动支持HTTP/2, 客户端不需要额外写任何代码. 只需要一台支持HTTP/2通信的服务器即可. 哎呀, 要是没有怎么办, 也没关系, 看下面 :

  • 服务器支持HTTP/2
    • NSURLSession自动使用HTTP/2进行通信
  • 服务器不支持HTTP/2
    • NSURLSession自动使用HTTP/1.1或其他更优的协议

我们一句代码, 判断都不用写, 省事又省心.

SPDY

这里说句题外话, 虽然SPDY并不在该Session中提及, 但是与HTTP/2有异曲同工之处, SPDY在之前被认为是未来的HTTP/2, 所以这里说一下.

SPDY是Google开发的基于TCP的应用层协议, 通过头部压缩, 多路复用和优先级来缩短网页的加载时间和提高安全性. 可以说是HTTP/1.1的一个优化版.

  • 多路复用, 请求优化
  • 支持服务器推送技术
  • SPDY压缩了HTTP头
  • 强制使用SSL传输协议

更多有关SPDY的详情请见这里


惊 ! iOS9开始苹果弃用NSURLConnection, 不再维护NSURLConnection, 所有有关Networking的新API只会在NSURLSession上更新.

NSURLSession replace NSURLConnection

NSURLSession的新功能


cookie 共享

增加sessionCookieGroup以实现app与其扩展(例如通知中心等等)之间cookie的共享.

let ident = "group.mycompany.mygroupname" 
let cookieStorage = NSHTTPCookieStorage.sharedCookieStorageForGroupContainerIdentifier(
    identifier: ident)
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
config.HTTPCookieStorage = cookieStorage
let session = NSURLSession(configuration: config)

NSURLSessionStreamTask

以前我们使用NSInputStream/NSOutputStream来进行一些非HTTP的连接, 例如利用TCP连接一台远程的服务器等等, 现在我们有了NSURLSessionStreamTask让我们更简单地实现以上功能.

NSURLSessionStreamTask的特性 :

  • 更轻松地使用TCP进行通信
  • 替代NSInputStream/NSOutputStream, 提供更优的API
    • 异步读写API
    • 内置强大的支持功能, 能自动通过HTTP代理, 连接一个远程服务器.
    • 轻松转换成NSStream

NSURLSessionTaskMetrics

对发送请求/DNS查询/TLS握手/请求响应等各种环节时间上的统计. 更易于我们检测, 分析我们的请求缓慢到底是发生在哪个环节, 并对此进行优化提升我们APP的性能.

下面开始介绍NSURLSessionTaskMetrics的属性

Property

  • taskInterval : 任务从开始到结束总共用的时间

  • redirectCount : 任务重定向的次数

  • transactionMetrics : 在任务执行期间产生的每个请求/响应事务, 它是一个装着许多NSURLSessionTaskTransactionMetrics对象的数组

NSURLSessionTaskTransactionMetrics

property

  • request and response : 请求和响应

  • networkProtocolName : 网络协议名称

    • http/1.1
    • http/2
    • spdy/3, spdy/3.1
  • isProxyConnection : 是否连接代理服务器

  • isReusedConnection : 是否允许重连

  • resourceFetchType : 描述本次加载的类型, 枚举类型

    • networkLoad : 网络加载
    • localCache : 本地缓存
    • serverPush : 服务器自推送
  • Connection Establishment and Transmission

    transmissions
    • fetchStart : 开始发起请求.

    • domainLookupStart : 发送DNS请求, 域名->IP地址

    • domainLookupEnd : DNS请求完成, 拿到IP地址

    • connectStart : 与远程服务器开始建立TCP连接

      • secureConnectionStart : HTTPS的TLS握手开始
      • secureConnectionEnd : HTTPS的TLS握手完成
    • connectEnd : 与服务器建立起了TCP连接

    • requestStart : 开始传输HTTP header第一个字节的时间(远程/缓存)

    • requestEnd : HTTP最后一个字节传输完成的时间(远程/缓存)

    • responseStart : 从服务器得到数据(远程/缓存)

    • responseEnd : 从服务器接受完最后一个字节的数据(远程/缓存)

另外, 需要注意的是, 如果请求命中了cache, 上述很多值会为nil.

API

NSURLSessionTaskDelegate代理中新增一个方法- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didFinishCollectingMetrics:(NSURLSessionTaskMetrics *)metrics, 当收集完成的时候就会调用该方法.

我们只需要实现代理的这个方法就能在这里做统计, 输出等等操作.

Something else

苹果不再支持RC4加密.


以上图片均来自官方WWDC中的PDF.

参考资料 :
HTTP/2
NSURLSession
NSURLSessionTaskMetrics

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

推荐阅读更多精彩内容