Optimizing Your App for Today’s Internet

这个 session 的主讲人感觉是一个很典型的美国人,年纪也不小。

网络现状

四十亿人在使用因特网,大概占有世界人口的一半。上网人数的增长在减缓。 但是网络仍然在增长。增长点主要在物联网、第三世界国家(中国、印度)、移动设备。
2G 网络仍然很普遍,要使用 Network Link Conditioner (NLC) 来模拟真实世界的网络状况。

IPV6

通过 IPV6 建立的连接数目仍然不多。

根据印度的数据,使用 IPV6,75% 的连接建立时间在 150ms 以下。使用 IPV4,75% 的连接建立时间在 325ms 以上。所以多用 IPV6。

Quick UDP Internet Connections (QUIC)

是 TCP 的继承者,IETF 的标准化正在进行中。
但是 Coming Soon

DNS 性能

为了防止目标主机变化,很多网站设置 DNS 缓存时间在 6s 以下,这样子目标主机宕机以后,可以及时响应。
但是这样子会使得每次请求都要去更新 DNS,大概需要 250ms。 苹果新增一个接口,可以使用缓存的 DNS。发起请求和更新 DNS 同时进行,大概率 DNS 不会变。如果请求失败了或者 DNS 变了,使用更新后的 DNS。

给我们的建议

不要用 SCNetworkReachability

因为结果是不准的,预测未来是不靠谱的。 要使用 waitsForConnectivity 选项。

API Choices

不要用 BSD Socket。太古老了,使用 Network.framework。

URLSession 及其使用建议

  • 支持 HTTP/2 和 HTTP/1.1
  • 进程间通信

推荐在所有的苹果平台上使用这个网络 API

延时提升

主要是 HTTP/2,去掉了 HTTP 层的 head-of-line blocking,即要收到上一个请求返还,才能发出下一个请求。提升了带宽利用率,只需要服务器端改变就好,客户端已经由 URLSession 搞定了。

HTTP/1.1 和 HTTP/2 的区别

请求合并

针对不同主机的请求,也可能会复用请求,前提条件如下:

  • IP 地址一致
  • 域名被同一个 TLS 证书覆盖

这是 URLSession 的新的行为。可以创建更少的 URLSession 对象。

提升吞吐量

  1. 减少请求大小
    • 减少 cookie 的大小
    • HTTP/2 头部压缩
  2. 使用压缩算法 Gzip 和 Brotli。 第二个没有听说过。

Responsiveness

QoS

URLSession 可以感知到所在队列的 QoS,具体来说是感知到 task.resume() 所在队列的 QoS。

NSURLRequest.NetworkServiceType 新增了一个叫做 networkServiceTypeResponsiveData

一般来说,应该用 defaultbackground

如何响应网络状态变化

  1. 设置 waitsForConnectivity 属性为 true
  2. urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask) 这个回调中处理网络中断情况,比如给用户提醒。
  3. 如果不在需要请求,调用 task.cancel()

节省系统资源

  • 对后台网络请求,激活 isDiscretionary
    这样子,系统可以在合适的时机发起网络请求。
  • 合理使用缓存

参考

猜你喜欢

转载自www.cnblogs.com/huahuahu/p/Optimizing-Your-App-for-Todays-Internet.html