Python实战社群
Java实战社群
长按识别下方二维码,按需求添加
扫码关注添加客服
进Python社群▲
扫码关注添加客服
进Java社群▲
作者:Tom, QQMailApp 创始团队成员之一,经历了 QQMailApp 从0到亿的过程。2017年加入字节跳动,现在负责字节跳动广州研发中心的技术管理工作。正在搭建团队中,大量招聘 iOS /Android/Windows/前端/后端,也可以加微信号 tomtan 交流一下喔
Sessions: https://developer.apple.com/videos/play/wwdc2020/10111/
本 session 主要关注的是,如何使用一些苹果内置的网络层技术,来达到提升性能、增强安全性、适配移动端网络特点的目标,并保护好用户隐私。
苹果原生支持使用 IPv6,并且支持 IPv6 和 IPv4 混合使用(一个 App 内)或者仅使用 IPv6 网络,目前来看,使用 IPv6 能够带来更低的网络延迟,原因是不需要过多的 NAT,还有就是支持 IPv6 的硬件性能更好。好了,注意一下,IPv6 协议本身并没有特别关注性能问题,只不过是甩掉了一些 IPv4 的历史包袱,从而“意外”地获得了性能提升。下面解释一下苹果提到的,使用 IPv6 以后带来性能提升的原因
在 IPv4 时代,为了解决 IP 地址紧缺的问题,需要大量用到 NAT 技术,相信很多人都在体验过,出口同一个公网 IP,经过路由器的处理,对内区分了192.168.xxx.xxx等内网 IP。以下的图说明了这个过程
如果没有 NAT 网络,假设每个接入子网都需要一组/24的 IP,而且还能对外连接,对外的路由至少要保留或申请1000个对外 IP 带 NAT 网络,通过 NAT 转换,接入子网可以使用私用 IP,对外连接时由路由绑定私用 IP 与对外 IP 的关系,修改传输的 IP 包上的地址,从而只需要255个对外 IP 就能满足内部接入子网的对外连接需求显而易见,当 NAT 层数变多了以后,因为网络拓扑结构变复杂了,导致不同 NAT 网络之间的主机如果需要进行互相通信的话,将需要经过非常多的结点才能做到。而 IPv6 协议下,因为 IP 地址空间足够大,并不需要架设过多的 NAT 网络,基本可以认为大概率是通过 IP 直连的方式进行通讯
实际上,很多的旧设备无法直接软件升级支持 IPV6。要发挥 IPV6 的性能,对应的 MAC 地址编码也是有所变化。另外由于要加密,所以对硬件能力也有要求,最好实现硬件加密,所以现有设备无法直接升级。在落地 IPv6 的实际过程中,很多运营商采取直接更换硬件的方式进行部署,由于硬件性能的提升,对于 IPv6 网络整体而言也获得了不少好处。
根据 Safari 中的数据,目前 IPv6 的请求分布大概如下图
跟 Google 的线上统计比例差不多
目前主流的 App Store 应用,有不少是已经开始试水 IPv6
随便抓包一下网易新闻,可以看到确实有启用了 IPv6 的场景
App 业界中有名的激进派,闲鱼团队,已经率先汇报他们的改造案例了
汇报一下,闲鱼的ipv6改造之路
最后附带一个重要信息,为什么必须正视 IPv6?因为 IPv4 地址已经分配完毕了,IPv6 落地是大势所趋
最后一个 IPV4 地址分配完毕,正式向 IPV6 过渡!
从 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 的优势,可以看回2018年的分析文章[1]
直观的流程对比如下所示
再贴一个图,说明以下 TLS1.3 是怎么实现 0-RTT 的,左图是第一次握手建立,需要 1RTT,右图是后续的网络请求,可以实现 0RTT
苹果贴了一张基于线上设备网络请求的对比图,可以看到接近一半的网络请求已经使用了 TLS1.3 协议,并且确实获得了性能提升
Netfilx分享了他们使用TLS1.3以后的一些经验,可以参考一下这篇文章,使用了TLS1.3以后,时延明显下降
多路 TCP 对于网络请求的体验有极大的提升,众所周知,手机包含两种上网方式,蜂窝移动数据网络(2G,3G,4G)和 WIFI 网络。我们希望在有 WIFI 的时候尽量使用 WIFI,这样可以节省成本,没有 WIFI 的时候自动切换到蜂窝移动网络,避免断连。同样在 PC 端,我们希望有线网卡和无线网卡可以同时上网,提高网速。参考一下 Apple Music 的数据,当用户在听歌的时候,如果遇到了网络切换,如果是过去的 TCP 管理方式,就会需要重新建立连接,因此用户就会遇到重新缓冲的情况。在应用多路 TCP 以后,减少了13%遇到重新缓冲的场景,另外在遇到重新缓冲的时候,提升了22%的缓冲时间
这里实际上是介绍了 Bonjour 协议的变化,主要是隐私性和安全性上面的提升,具体可以看看今年的 WWDC10110[2]
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 协议可以认为是基于 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:需要用户在设置界面开启,需要服务器端支持
[1]
2018年的分析文章: https://xiaozhuanlan.com/topic/0168239547#pios12tls13
[2]WWDC10110: https://developer.apple.com/videos/play/wwdc2020/10110/
程序员专栏 扫码关注填加客服 长按识别下方二维码进群
近期精彩内容推荐:
女友认为年薪50万是平均水平,怎么办?
全国最大直男论坛的性感女神翻车了
IntelliJ IDEA超全优化设置,效率杠杠的!
非常有用的 Python 技巧
在看点这里好文分享给更多人↓↓