作者:Tom, QQMailApp 创始团队成员之一,经历了 QQMailApp 从0到亿的过程。2017年加入字节跳动,现在负责字节跳动广州研发中心的技术管理工作。正在搭建团队中,大量招聘 iOS /Android/Windows/前端/后端,也可以加微信号 tomtan 交流一下喔
Sessions: https://developer.apple.com/videos/play/wwdc2020/10111/
前言
本 session 主要关注的是,如何使用一些苹果内置的网络层技术,来达到提升性能、增强安全性、适配移动端网络特点的目标,并保护好用户隐私。
IPv6
苹果原生支持使用 IPv6,并且支持 IPv6 和 IPv4 混合使用(一个 App 内)或者仅使用 IPv6 网络,目前来看,使用 IPv6 能够带来更低的网络延迟,原因是不需要过多的 NAT,还有就是支持 IPv6 的硬件性能更好。好了,注意一下,IPv6 协议本身并没有特别关注性能问题,只不过是甩掉了一些 IPv4 的历史包袱,从而“意外”地获得了性能提升。下面解释一下苹果提到的,使用 IPv6 以后带来性能提升的原因
NAT(网络地址映射)
在 IPv4 时代,为了解决 IP 地址紧缺的问题,需要大量用到 NAT 技术,相信很多人都在体验过,出口同一个公网 IP,经过路由器的处理,对内区分了192.168.xxx.xxx等内网 IP。以下的图说明了这个过程


显而易见,当 NAT 层数变多了以后,因为网络拓扑结构变复杂了,导致不同 NAT 网络之间的主机如果需要进行互相通信的话,将需要经过非常多的结点才能做到。而 IPv6 协议下,因为 IP 地址空间足够大,并不需要架设过多的 NAT 网络,基本可以认为大概率是通过 IP 直连的方式进行通讯
硬件性能
实际上,很多的旧设备无法直接软件升级支持 IPV6。要发挥 IPV6 的性能,对应的 MAC 地址编码也是有所变化。另外由于要加密,所以对硬件能力也有要求,最好实现硬件加密,所以现有设备无法直接升级。在落地 IPv6 的实际过程中,很多运营商采取直接更换硬件的方式进行部署,由于硬件性能的提升,对于 IPv6 网络整体而言也获得了不少好处。
苹果的数据
根据 Safari 中的数据,目前 IPv6 的请求分布大概如下图

跟 Google 的线上统计比例差不多

目前主流的 App Store 应用,有不少是已经开始试水 IPv6
随便抓包一下网易新闻,可以看到确实有启用了 IPv6 的场景

App 业界中有名的激进派,闲鱼团队,已经率先汇报他们的改造案例了
最后附带一个重要信息,为什么必须正视 IPv6?因为 IPv4 地址已经分配完毕了,IPv6 落地是大势所趋
HTTP/2
从 WWDC2018 开始,苹果已经内置了 HTTP/2 协议的支持,上个月 Safari 的统计数据来看,已经有79%的网络请求,使用了 HTTP/2 协议了

根据 https://w3techs.com/technologies/details/ce-http2 的统计,全球已经超过40%的网站使用 HTTP/2 协议了

HTTP/2 协议的特点和优势可以看下面的知识点,这里不再展开详述
二进制分帧层 (Binary Framing Layer)
多路复用 (MultiPlexing)
服务端推送 (Server Push)
Header 压缩 (HPACK)
应用层的重置连接
请求优先级设置
流量控制
公开分享 HTTP/2 优化实践的团队不多,以下是来自2017年 QQ 空间团队的数据
TLS1.3
关于 TLS1.3 的优势,可以看回2018年的分析文章[1]
直观的流程对比如下所示

再贴一个图,说明以下 TLS1.3 是怎么实现 0-RTT 的,左图是第一次握手建立,需要 1RTT,右图是后续的网络请求,可以实现 0RTT

苹果贴了一张基于线上设备网络请求的对比图,可以看到接近一半的网络请求已经使用了 TLS1.3 协议,并且确实获得了性能提升

Netfilx分享了他们使用TLS1.3以后的一些经验,可以参考一下这篇文章,使用了TLS1.3以后,时延明显下降

Multipath TCP
多路 TCP 对于网络请求的体验有极大的提升,众所周知,手机包含两种上网方式,蜂窝移动数据网络(2G,3G,4G)和 WIFI 网络。我们希望在有 WIFI 的时候尽量使用 WIFI,这样可以节省成本,没有 WIFI 的时候自动切换到蜂窝移动网络,避免断连。同样在 PC 端,我们希望有线网卡和无线网卡可以同时上网,提高网速。参考一下 Apple Music 的数据,当用户在听歌的时候,如果遇到了网络切换,如果是过去的 TCP 管理方式,就会需要重新建立连接,因此用户就会遇到重新缓冲的情况。在应用多路 TCP 以后,减少了13%遇到重新缓冲的场景,另外在遇到重新缓冲的时候,提升了22%的缓冲时间

Local Network Privacy
这里实际上是介绍了 Bonjour 协议的变化,主要是隐私性和安全性上面的提升,具体可以看看今年的 WWDC10110[2]
Encrypted DNS
DNS 是一个解析域名 IP 的一个技术,他的工作方式可以看下面的时序图,当用户想要访问 twitter.com 的时候,需要先从DNS 服务器获得具体的服务器 IP 地址,才能进行后续的网络通信流程

最早期的 DNS 协议,并没有定义加密流程,所以如果有一些恶意的 WIFI 结点,或者网络运营商进行用户行为嗅探的话,能够很明确地看到用户的 DNS 请求数据,从而实现 DNS 劫持,对于特定的域名访问,重定向到恶意的 IP 地址访问,从而获得不法的收益。如下图所示,可以看到用户通过不安全的端口(53)访问 twitter.com,然后希望获得的 IP 服务器地址是104.244.42.129。此时可以篡改返回值,指向钓鱼服务器 IP

如果采用了 Encrypted DNS 以后,以上的攻击行为将会变得无用武之地了,用户的网络请求将会如下所示

如果简单理解 Encrypted DNS 的流程,相当于在 DNS 流程上加上了 TLS 加密流程,从而使得 DNS 请求就像 HTTPS 请求一样,安全性对比以前提升了好几个等级
苹果的建议
从 iOS14 开始,如果开发者的网站已经支持了 Encrypted DNS,可以直接在代码中开启这个配置,这样子客户端的网络请求将会获得安全性的收益

HTTP/3
HTTP/3 协议可以认为是基于 QUIC 的新一代网络协议,基于 UDP 流程,解决了上一代网络协议基于 TCP 的诸多问题,HTTP/3 协议的新特性可以看下面的知识点,因为有很多还是在草案中,所以不展开讨论
基于 TLS1.3 实现 0RTT
降低队头阻塞的问题
连接迁移
更好的拥塞控制算法
更好的流量控制算法
当前的 HTTP/3 协议的进度还在草稿中,不过苹果已经在 iOS14 中率先支持了 HTTP/3 协议,看起来很有可能在 iOS14 的其中一个大版本更新以后,将会正式支持。在 iOS14 系统更新以后,可以在手机开启 HTTP/3 试用

也可以在 Mac 电脑开启 HTTP/3 试用

总结
在 iOS14 中,苹果内置的网络技术,主要在以下几个方面可以提升网络层的表现,并且提醒开发者注意服务器端的配置,确保能够前后端都采用最新的网络协议配合使用,达到最优体验。
IPv6:客户端默认开启,需要服务器端支持
HTTP/2:客户端默认开启,需要服务器端支持
TLS 1.3:客户端默认开启,需要服务器端支持
Multipath TCP:客户端默认开启,需要服务器端支持
Encrypted DNS:客户端默认开启,需要服务器端支持
HTTP/3:需要用户在设置界面开启,需要服务器端支持

推荐阅读
关注我们
我们是「老司机技术周报」,每周会发布一份关于 iOS 的周报,也会定期分享一些和 iOS 相关的技术。欢迎关注。

关注有礼,关注【老司机技术周报】,回复「2020」,领取学习大礼包。
支持作者
这篇文章的内容来自于 《WWDC20 内参》。在这里给大家推荐一下这个专栏,专栏目前已经创作了 108 篇文章,只需要 29.9 元。点击【阅读原文】,就可以购买继续阅读 ~
WWDC 内参 系列是由老司机周报、知识小集合以及 SwiftGG 几个技术组织发起的。已经做了几年了,口碑一直不错。 主要是针对每年的 WWDC 的内容,做一次精选,并号召一群一线互联网的 iOS 开发者,结合自己的实际开发经验、苹果文档和视频内容做二次创作。
参考资料
[1]
2018年的分析文章: https://xiaozhuanlan.com/topic/0168239547#pios12tls13
[2]WWDC10110: https://developer.apple.com/videos/play/wwdc2020/10110/
转载:https://blog.csdn.net/sinat_35969632/article/details/109377095