iOS网络更新WWDC

2015WWDC

最近在恶补iOS网络相关的知识,所以从WWDC入手,本文是WWDC2015网络部分讲座,学习笔记方便日后复习,后续内容会陆续以笔记的形式发布。欢迎大家一起学习😆!

网络和URL会话(Networking with NSURLSession)

主要内容

  • 网络传输安全问题
  • URLSession添加了哪些新特性
  • URLSession API变化

视频地址: Networking with NSURLSession

1 网络传输安全问题

1.1 URL会话和HTTP协议的背景

URLSession

  • URLSession是一个网络API,主要用于从网站下载HTTP内容。
  • 大量的委托方法(Delegate),可以用来处理认证或者其他重要的事情
  • 另外,可以在没有后台下载API的情况下做网络层任务

HTTP/HTTPS

HTTP使用明码(cleartext)进行数据传输,存在安全问题。HTTPS解决了HTTP的安全问题,HTTPS的本质是HTTP的上一层协议,属于传输层安全协议,传输层安全协议会通过公钥密码学方式进行一个多点的信号交换之后,创建一个安全的连接。

所谓的安全性是基于三个属性来讲的:

  • Encryption(加密):网络上传输的数据是被加密过的。
  • Integrity(完整):提供消息完整性参数,所以消息在检测之前是不可修改的
  • Authentication(验证):支持身份验证,可以验证对话对象

关于HTTP1.1和HTTP2的详情内容请看【**从 HTTP1.x 到 HTTP 2.0 变迁**】

1.2 App Transport Security

App Transport Security(ATS) 是iOS9的一个新功能,从本质上讲其核心是防止用户的个人隐私数据被意外泄露。ATS加强了URL会话的默认方法。

什么是ATS?

  • 不允许明码HTTP进行加载,只使用HTTPS连接,对TLS进行了限制,其中密码组合,信任证书,证书密钥的大小等都是作为限制条件。

  • 通过info.plist进行配置ATS
    ATS配置.png

  • 在特殊情况下ATS也可以加载HTTP,需要配置NSExceptionDomains,将特殊的URL地址添加到里面

  • 另外,可以设置NSAllowsArbitraryLoads = YES,这时ATS可以加载HTTP和HTTPS。可以对特定资源进行保护NSExceptionAllowsInsecureHTTPLoads = NO

1.3 URLSession添加了哪些新的协议

URLSession支持HTTP/2协议。

为什么需要HTTP/2,HTTP/1.1有什么问题?

HTTP/1.1的问题

  • 每一个TCP连接只有一个优先请求
  • HTTP管道并不适用于所有的服务器或网络,大多数主流网页浏览器都是禁止的。
  • 多个连接,增加服务器资源开销
  • 缺少头压缩

HTTP/2协议的重要的功能?

  • HTTP/2仅支持一台主机开放一个TCP连接,减少服务器资源开销
  • HTTP/2完全多路复用,多个请求合并到同一个TCP连接中
  • HTTP/2有请求优先级,所以重要资源可以优先提供给有用更高权限的客户端。
  • HTTP/2是一个二进制协议,数据处理和解析速度更快
  • HTTP/2使用HPACK头压缩机制,HTTP/1.1没有头压缩

HTTP/2多路复用如何解决队首阻塞问题?

HTTP:2解决队首阻塞问题.png

HTTP/2的头压缩机制(HPACK)

HPACK基于两个表静态表和动态表。静态表中包含常用的HTTP信息头并且不可修改,动态表可以通过指针应用静态表内容。

HTTP/2协议在程序中的适配性?

HTTP/2被无缝集成到URLSession的API中,只需要支持HTTP/2的服务器。

1.4 URLSession API变化

HTTPCookieStorage

分享cookie在APPs和扩展之间

  • 默认情况下,APP和扩展的cookie存在不同的位置。
  • 可以使用程序组来访问共享数据存储其,这些存储器无论APP还是扩展都可以访问。
  • HTTPCookieStorage可以创建一个与组存储器相关的cookie存储。
1
2
3
4
5
let ident = "group.mycompany.mygroupname"
let cookieStorage = HTTPCookieStorage.sharedCookieStorage(forGroupContainerIdentifier: ident)
let config = URLSessionConfiguration.default
config.httpCookieStorage = cookieStorage
let session = URLSession(configuration: config)

创建一个cookieStorage,所有的操作都会被存到这个cookie组中。

URLSessionStreamTask

在底层提取文件直接在TCP连接上。

相对NSInputStream和NSOutputStream的优点

  • 异步读写接口,只需设置一个委托监听事件。
  • 自动通过HTTP代理

支持TCP/IP连接

  • 可以通过主机名和端口号创建一个连接

2. 补充

2.1 知识点

  • TLS : 传输层安全协议(Transport Layer Security),及其前身安全套接触(Secure Sockert Layer, SSL)是一种安全协议,目的是为互联网通信,提供安全及数据完整性保障。
  • HPACK : 是HTTP/2的一个算法,用于HTTP头部压缩。

3 Reference

2017WWDC

本文是WWDC2017网络部分讲座两个部分的学习笔记。本文是学习过程中的笔记方便日后复习,后续内容会陆续以笔记的形式发布。欢迎大家一起学习😆!

1. Advances in Networking Part 1

视频地址:Advances in Networking Part 1
第一部分,介绍近几年工作中技术的更新。

  • ECN(Explicit Congestion Notification)显式拥塞通知,是一个对网际协议和传输控制协议(TCP)的扩展,定义为RFC 3168。ECN允许拥塞控制的端对端通知而避免丢包。
  • IPv6&NAT64新兴的互联网协议
  • iOS中网络堆栈的一些变化和一些可以网络扩展的新工具
  • 关于多路径协议介绍,iPhone是多路径设备。

1.1 ECN (显式拥塞通知)

ECN允许拥塞控制的端对端通知而避免丢包。通常情况下,TCP/IP 网络通过丢弃数据包来表明信道阻塞。在ECN成功协商的情况下,ECN感知路由器可以在IP头中设置一个标记来代替丢弃数据包,以表明阻塞即将发生。数据包的接收端回应发送端,发送端降低其传输速率,如同检测到丢包那样。

1.2 IPv6 / NAT64

NAT64是一种IPv6转换机制,他通过一种网络地址转换(NAT)形式促成IPv6与IPv4主机之间的通信。
iOS开发中,使用高层的网络框架,例如URLSession、CFNetwork。避免单独使用IPv4地址。

由于目前IPv4所占比重较大,所以服务器同时支持IPv6和IPv4,这种成为(Dual-Stack)双栈连接。

Dual-Stack.png

对于仅支持IPv6的应用,不能使用IPv4地址。可以通过NAT64进行转换。
NAT64.png

1.3 User-Space Networking(用户空间网络)

网络栈演变(Network Stack)
NetworkStackEvolution_1.png

NetworkStackEvolution_2.png

TCP/IPv6 从内核空间到用户空间。

1.4 Network Extension

NetworkExtension是在WWDC2015提出的,如下图:
NetworkExtension.png
在WWDC2015What’s New in Network Extension and VPN中,介绍了NetworkExtension。包含四个部分:

  • NEVPNManager 允许配置设备上的VPN堆栈。
  • NETunnelProvider 允许构建自己的VPN协议
  • NEHotspotHelper 自定义设备如何验证Wi-Fi热点
  • NEFilterProvider 允许建立一个安全的基于设备的内容过滤器

新增APIs,Wi-Fi 配置和DNS 代理,如下图:

NetworkExtensionNew.png

  • NEHotspotConfiguration:热点配置,例如,自动加入到智能相机的Wi-Fi中,而不需要输入密码等复杂操作。

代码实现例子:

NetworkExtensionWiFiConfigurationAPI.png

  • NEDNSProxyProvider

接收系统DNS查询信息,并处理他们。发送到选择的迭代解析器中,或者可以发送选择的协议中,例如,TLS或者HTTP。

1.5 多路径协议

场景:

当我们在WiFi环境下进行数据传输,在逐渐远离WiFi环境,随着信号的减弱传输最终停止,检测到进入蜂窝网络或者重新进入WiFi环境,继续进行网络传输。

上述场景看起来没问题,但是由于不知道何时会断开网络,所以需要保存传输状态并且增加了资源消耗和降低了传输效率。

**Wi-Fi Assist **

iOS9 出现Wi-Fi Assist目的解决上述问题。原理:当我们在Wi-Fi信号不理想的环境下Wi-Fi就被开启。

触发时机:

  • 边缘Wi-Fi,比较Wi-Fi信号和蜂窝网络信号强弱(优胜劣汰)。
  • Wi-Fi信号逐渐强于蜂窝网络信号。

Wi-Fi Assist 已经集成到URLSession APIs中。

参考视频:

Multipath TCP (多路径协议)

多路径协议是专为移动网路设计的协议。由IEIF提出,提供了和TCP完全一样的服务,它是建立在TCP之上的,所以可以无缝对接。

Multipath TCP (MPTCP - RFC 6824 “TCP Extension for Multipath Operation”)

  • 建立在TCP之上,可靠,拥塞控制。
  • 提供了Wi-Fi和蜂窝的无缝对接。
  • 帮助选择最佳的网络连接。

Multipath TCP 实现

Multipath TCP.png

MPTCP在URLSession下方,当通过URLSession发送数据时经过MPTCP堆栈,MPTCP负责将这些数据规划,选择通过Wi-Fi或蜂窝网络发送。

它是如何实现网络选择的?

通过创建TCP子数据流实现的,TCP子数据流实际上是完整的TCP连接。MPTCP负责创建和销毁TCP子数据流,通过管理子数据流实现数据实时传输。

在iOS 7 Siri已经实现了Multipath TCP。

Multipath TCP APIs

iOS 11 开放Multipath TCP API,使用它需要条件。

注意:需要服务器支持

MPTCP两种模式

  • Handover Model (交接模式) : 提供可靠的长连接
  • Interactive Model (交互模式) : Siri使用的是交互模式,针对延迟敏连接感

Handover Model (交接模式)

数据连接从Wi-Fi到蜂窝网络切换,以及从蜂窝网络移回Wi-Fi。当Wi-Fi网络不好时,MPTCP会创建TCP子数据流,通过蜂窝网络传输数据,此时Wi-Fi子数据流未销毁。当Wi-Fi网络变好MPTCP会切换到Wi-Fi子数据流,并销毁蜂窝网络子数据流。

注意:Wi-Fi Assist 对蜂窝数据设置了上限。达到上限停止使用。

Interactive Model (交互模式)

主要目的降低延迟,与交接模式不同的是在Wi-Fi网络变好,不会立即切换。

URLSessionConfiguration配置MPTCP
URLSession配置MPTCP

注意:还需要在Xcode中添加Multipath

2. Advances in Networking Part 2

第二部内容:URLSession的新进展和新的API。

2.1 URLSession介绍

URLSession是易用的网络API,支持Apple所有平台,替代过时的NSURLConnection API。

具体看**2013&2014-What’s New in Foundation Networking**

2.2 URLSession Adaptable Connectivity API

监控连接,通过开启它告诉URLSession,任务由于无法连接而失败,它应该等待与服务器的连接,而不是直接失败。

开启方法:设置URLSessionConfiguration属性var waitsForConnectivity: Bool

新的URLSessionTaskDelegate方法 urlSession(_:taskIsWaitingForConnectivity:)只用在URLSession中配置打开才可以用,并且只会回调一次。

示例代码:

URLSession配置waitConnectivity

2.3 URLSessionTask Scheduling API

Background URLSession

在APP未运行的状态下,上传和下载数据。

后台APP刷新,什么是后台APP刷新,在APP未启动的时候,可以刷新数据减少启动时数据刷新等待时间。

BackgroundAPPRefreshAction

  1. 在APP运行时设置在后台APP刷新需要更新的数据
  2. APP关闭时,URLSessionTask更新数据
  3. 打开APP,看到后台刷新的数据

上述方法存在几个问题

  • 额外的launch影响电池寿命
  • 无法预知未来的变化,请求下来数据可能无用
  • 数据包大小问题

为了解决上述问题,提出了URLSessionTask调度API。为URLSessionTask新属性var earlistBeginDate:Date?设置一个时间,允许任务准备好开始运行。

earlistBeginDate

添加这个属性上述后台APP刷新则变为:

Background APP Refresh

新的URLSessionTaskDelegate方法 urlSession(_:task:willBeginDelayedRequest:completionHandler:)
当系统准备联网有机会改变请求。

指定URLSessionTask的传输数据量,可以让系统更好的进行调度。

URLSessionTask的两个新属性:

  • var countOfBytesClientExpectsToSend: Int64
  • var countOfBytesClientExpectsToReceive; Int64
    给出最适当的值或者设定为NSURLSessionTransferSizeUnknown

下面看一下示例代码

2.4 URLSession的改进

更新内容

  1. 进度更新
  2. Brotli 压缩
  3. 公开后缀列表更新
  4. URLSessionStreamTask和认证代理

2.4.1 URLSessionTask Progress Tracking

旧的进度计算的API。

UIRLSession API额外的工作。
键值观察设置:

1
2
countOfBytesExpectedToReceive, countOfBytesReceived
countOfBytesExpectedToSend, countOfBytesSent

不总是可用

1
2
countOfBytesExpectedToReceive
countOfBytesExpectedToSend

2.4.2 URLSessionTask Adopts ProgressReporting

新的PregressReporting协议

1
2
3
4
5
6
7
8
class URLSessionTask: NSObject,NSCopying, ProgressReporting
public var progress:Progress{get}

var fractionCompleted: Double [0.0,1.0]

// 普通和指定的进度描述
var localizedDescription: String!
var localizedAdditionalDescription: String!

可以添加到UIProgressView或者NSProgressIndicator
通过使用父进度对象来进行多个任务
键值观察和Cocoa绑定

URLSessionTask和Progress对象状态管理

2.4.3 URLSession Brotli Support

Brotli数据压缩
Content-Encoding: br
Faster URL loads
Requires HTTPS(TLS)

2.4.4 URLSession Public Suffix List

2.4.5 URLSessionStreamTask

  • 允许直接TCP/IP连接
  • 可选安全握手
  • 转换能力 NSInputStream/NSOutputStream
  • 建议新代码中使用 URLSessionStreamTask
  • 验证HTTPS代理的导航

##3 拓展

TLS : 传输层安全协议(Transport Layer Security),及其前身安全套接触(Secure Sockert Layer, SSL)是一种安全协议,目的是为互联网通信,提供安全及数据完整性保障。

Reference: