关于网络优化,你需要了解什么?

关于网络优化,你需要了解什么?_第1张图片

网络优化系列专题,聊一聊面对复杂多变的移动网络,我们需要掌握哪些网络基础知识,以及该如何做好网络优化这项工作。


网络优化系列专题
  • 网络优化背景知识(待完善)

《关于 5G,你应该知道的发展史》
《HTTP 发展的前世今生》
《关于网络优化,你需要了解什么?》

  • 如何优化网络性能(待更)

...


网络,如今已经成为我们生活中必不可少的组成部分,打开手机或电脑,我们可以非常方便的看视频、阅读新闻或听音乐等。网络不仅丰富了人们的生活方式,另一方面作为移动开发者的我们,面对错综复杂的移动网络环境,需要掌握哪些网络优化的基础知识呢?

网络基础知识

我们享受着如此便捷舒适的网络生活,离不开移动互联网的高速增长和无线网络的普及,无线网络多种多样,它们因有各自的特点而适合不同的使用场景。

下图是 iPhone 11 支持的无线网络类型,可以看到我们日常经常使用的无线网络类型 Wi-Fi、移动网络、蓝牙和 NFC 等。

关于网络优化,你需要了解什么?_第2张图片
1. 移动网络

千兆级 LTE” (长期演进技术)指的是移动通信网络在理论上的速度可以达到光纤级别的 1Gbps(128MB/s)。虽然基于 4G 标准,但通过 MIMO(多输入多输出) 、使用载波聚合的 LAA 等技术,现在已经发展到千兆级 LTE。

  • 4G 主要部署的是 TD-LTE 和 FDD-LTE 两种工作制式。TD-LTE 的理论峰值速率为 100Mbps/50Mbps(上/下行),FDD-LTE 可以达到 150Mbps/40Mbps 的理论峰值速率。有关它们更详细的介绍你可以参考这里。

5G(第五代移动通信)

通信技术的发展是一个漫长的过程,在即将到来的 2020 年我们也将迎来 5G 的商用,它的理论传输速率可以达到 20Gbps。目前 5G 的标准还没有完全 release,关于 5G 的原理你可以参考这篇文章。

关于网络优化,你需要了解什么?_第3张图片

在未来,随着移动通信技术的不断发展,手机和电脑的应用水平或许不再受限于设备本身的性能,而是可以借力云计算的强大处理能力。


2. 无线网络

“无线局域网” 指的是我们经常使用的 Wi-Fi。Wi-Fi 是由 IEEE(电气电子工程师学会) 制定和进行标准化规范,跟任何流行技术一样,IEEE 也一直在积极地发布新的协议。

目前最常用的无线网络标准是 802.11ac ,其推出的第一批产品 Wave 1 理论速度可以达到 866.7 Mbps;而在 2016 年推出的 Wave 2 可以达到更高的 1.73 Gbps。下图展示了 Wi-Fi 有史以来的世代划分:

关于网络优化,你需要了解什么?_第4张图片

Wi-Fi 6

下一代无线网络标准是 802.11ax,即 Wi-Fi 6。与前几代 Wi-Fi 技术相比,802.11 ax 通过 OFDMA(正交频分多址)和 MU-MIMO (多用户-多输入多输出)等技术,最高速率可达 9.6Gbps。但是 Wi-Fi 6 关注的重点并不是单设备的峰值速率,它将身负更具挑战性的目标:Wi-Fi 6 旨在密集用户场景下的平均吞吐量,关注的是应用、用户体验和整个无线生态。

关于网络优化,你需要了解什么?_第5张图片
  1. 一致且可靠的数据流,在连接相同数量设备的情况下,每个用户的平均吞吐量至少提高 4 倍,为更多用户提供一致且可靠的数据流;

  2. 允许更多的设备同时连接到网络,Wi-Fi 6 可以实现多个终端并行传输,不必排队等待,相互竞争,从而提升效率和降低时延;

  3. 更好的节约移动设备的电池消耗,Wi-Fi 6 采用一项名为 TWT (目标唤醒)的功能,允许终端设备在不进行数据传输时进入休眠状态,减少持续传输以及搜索信号所需时间。

Wi-Fi 6 可以说是 Wi-Fi 技术有史以来最大的革命,有关它的更详细分析你可以参考这篇文章。


3. 基带芯片

从硬件维度上来看,所有的无线网络都通过基带芯片支持,目前高通在基带芯片领域占据了比较大的优势。之前由于苹果和高通的专利诉讼,iPhone Xs 选用了英特尔的基带芯片,但同时也出现大量的用户投诉网络连接异常。

但随后在年初,苹果和高通高调和解的消息在各大网站推送,而一直默默给苹果提供芯片支持的英特尔则在官网上宣布退出 5G 手机基带芯片业务。这个消息引起了广大网友的一片哗然,“芯片领域实力排名第一的英特尔,连基带芯片都做不出来?”

基带芯片要适合全球所有的运营商和设备,市面上有那么多的无线网络标准和制式,还有双卡双待等各种特色功能,因此基带芯片对技术要求非常高。

2017 年 6 月 9 日,GSMA(全球移动通信系统协会)明确规定了全网通(暂不含 5G)终端应同时支持 LTE(TDD,FDD)、WCDMA、GSM、TD-S 以及 CDMA 六种网络制式。下图展示了国内运行商网络制式:

关于网络优化,你需要了解什么?_第6张图片

随着未来 5G 的商用和普及,这对各大芯片厂商来说既是机遇也是挑战,目前高通、三星、联发科、展讯和华为都已经发布了 5G 的基带芯片。如果你对当前的 5G 格局感兴趣,可以阅读下面相关文章:

  • 全世界 5G 格局
  • 影响 5G 发展格局的八大巨头

网络 I/O

如果按照数据来源进行划分的话,I/O 又可以划分为:文件 I/O 和网络 I/O。本地 I/O 就已经很复杂,但好在它的所有操作都在当前设备,而网络 I/O 则需要跨终端读取数据,整个过程将会更加复杂。

1. I/O 模型

在 Linux 系统下,“一切皆是文件”,在网络 I/O 中对一个 Socket 的读写也会有相应的描述符,称为 socket fd(socket 文件描述符)。

最流行的 I/O 模型是阻塞是 I/O 模型,默认情况下,所有的套接字都是阻塞的。如下图以 Socket 读取数据 recvfrom 调用为例,它整个 I/O 流程分为两个阶段:

  1. 等待 Socket 数据准备好;
  2. 将数据从内核拷贝到应用进程中。
关于网络优化,你需要了解什么?_第7张图片

在 《UNIX 网络编程》中将 UNIX 网络 I/O 模型划分为以下五种:

关于网络优化,你需要了解什么?_第8张图片

前四种模型的主要区别在于第一阶段,因为它们的第二阶段是一样的:在数据从内核复制到调用者的缓冲区期间,进程阻塞于 recvfrom 调用。相反,异步 I/O 模型在这两个阶段都要处理,从而区别于其他 4 种模型。

同步/异步 I/O

  • 同步 I/O 操作导致请求进程阻塞,直到 I/O 操作完成;
  • 异步 I/O 操作不导致请求进程阻塞。

根据如上定义规则,前面是 4 种模型 — 阻塞式 I/O 模型、非阻塞时 I/O 模型、I/O 复用模型和信号驱动模型都是同步 I/O 模型,因为其真正的 I/O 操作将阻塞进程。

在开发过程中,比较常用的有阻塞 I/O、非阻塞 I/O 以及多路复用 I/O。关于 UNIX 网络 I/O 模型的更多参考资料,你可以参考《UNIX 网络编程》第六章,另外网上也有很多关于这部分的参考资料:

  • 《聊一聊 Linux 五种 I/O 模型》
  • 《UNIX 网路 I/O 模型及 Linux 的 I/O 的多路复用模型》
  • 《彻底搞懂 epoll 高效运行的原理》

很多文章在描述该部分内容时还是会存在一些问题,我们需要辩证地看。

  • 多路复用 I/O 一定比阻塞 I/O 要好? 最简单的 I/O 并发方式就是多线程 + 阻塞 I/O。如果我们同一时间活动的网络连接非常多,使用多路复用 I/O 性能的确更好。但是对于客户端来说,这个假设不一定成立,对于多路复用 I/O 来说,整个流程会增加大量的 select / epoll 这样的系统调用,不一定比阻塞 I/O 要快;

  • epoll 一定比 select / poll 要好?如果同一时间连接非常少的情况,select 的性能不会比 epoll 差,很多时候会比 epoll 要好;

  • epoll 使用了 mmap 减少内核到用户空间的拷贝?网上有很多文章都说 epoll 使用了 mmap 技术,但是查看 Linux 与 Android 的 epoll 实现,并没有找到相关的实现。因为如果直接共享内存可能会引发比较大的安全漏洞。更加准确的说法应该是文件描述符实现了共享,数据依然要通过拷贝。

2. 数据处理

现在让我们再往底层走走,看看底层收发包的流程是怎样的?

网卡的收包流程从整体上看就是将通信媒介中的脉冲信号转换到网卡 FIFO 存储再 copy 到系统主内存(DDR3/4)的过程,其中涉及到网卡控制器、CPU、DMA和驱动程序等,在 OSI(开放式系统互联模型)参考模型中属于物理层和数据链路层,如下图所示:

关于网络优化,你需要了解什么?_第9张图片

网络 I/O 也需要通过中断来通知 CPU 有数据到达,但这个处理会非常轻量,耗时的操作移到软中断处理函数里面来慢慢处理。

关于网卡收发包这块内容比较复杂,网上的参考资料也不多,感兴趣的朋友可以参考下面几篇文章继续深入学习。

  • Linux 网络 - 数据包接收过程
  • Linux 网络 - 数据包发送过程
  • 腾讯大数据 网卡收包流程

网络性能

我们常说的网络性能优化,通常都优化哪些方面呢?有的朋友可能会关注网络的带宽和服务器的成本,特别是直播、视频类的企业,这部分的成本非常高昂。虽然有的时候会做一些取舍,但是用户的访问速度与体验是所有应用的一致追求。

1. 延迟与带宽

如果说速度是关键,那对所有网络通信都有决定性影响的主要有以下两个方面:

  • 延迟:数据从信息源发送到目的地所需的时间。
  • 带宽:逻辑或物理通信路径最大的吞吐量。
关于网络优化,你需要了解什么?_第10张图片
延迟是性能瓶颈

更多带宽其实不(太)重要,先别急,带宽当然重要。尤其是在需要更流畅得观看高清视频,下载大型文件以及在线听音乐等场景,都提醒着我们高带宽所带来的好处。

但是,日常上网浏览需要的是从数台服务主机获取较小的资源,这时候往返时间就成了瓶颈:

  • 在视频主页上看视频受限于带宽
  • 加载和渲染视频主页受限于延迟

SPDY 协议开发者之一的 Mike Belshe 曾经对互联网上最热门的一些站点做过一项研究:不同带宽和延迟时间对页面加载时间分别有什么影响

关于网络优化,你需要了解什么?_第11张图片

在第一项测试中,连接的延迟时间固定而带宽递增,从 1Mbit/s 依次递增至 10Mbit/s。注意一开始,从 1Mbit/s 升级到 2Mbit/s,页面加载时间几乎减少了一半,这也是我们希望看到的结果。可是在此之后,带宽递增,加载时间减少得越来越不明显。当带宽超过 5Mbit/s,直到升级到 10Mbit/s,页面加载时间仅降低了 5%。

如今,国内宽带入户几乎都是从 50 或 100Mbit/s 起步了,由此可知,紧靠带宽并不会给人们浏览网页带来多大的性能提升。不过在下载大文件、观看高清视频确实会变得更加流畅,但是加载包含这些文件的页面的时间不会有明显的缩短。换句话说,“更多带宽没有那么重要”。

然而在第二项测试中,延迟以 20ms 递减的试验中,页面加载时间呈线性减少趋势。如下图所示:

关于网络优化,你需要了解什么?_第12张图片

当然这并不是说在选择 ISP(互联网服务提供商)时就应该把延迟时间放在首位而不是带宽。

要让互联网从整体上提速,就必须寻求降低 RTT(来回通信延时)的方法,把 RTT 从 150ms 降低到 100ms,结果比把用户带宽从 3.9Mbit/s 提高到 10Mbit/s 甚至 1Gbit/s 对速度的影响都大

今天,每个页面都需要客户端到服务器之间的数次往返。这些往返很大程度上是由客户端到服务器之间为建立连接(DNS、TCP、HTTP 等)而进行握手所导致的,当然有的是通信协议引发的”。

—— Mike Belshe,更多带宽其实不(太)重要

Mike Belshe 的研究是 Google 开发 SPDY 协议的依据,而 SPDY 就是后来 HTTP/2 的基础。

2. 弱网络

对于网络 I/O 来说,整个通信流程涉及的链路会非常复杂,一个数据包从手机出发要经过无线网络、核心网络以及外部网络(互联网),才能到达我们的服务器。

关于网络优化,你需要了解什么?_第13张图片

移动通信网络信号不稳定,接入类型和接入点变化频繁,而且移动互联网时代的用户对移动网络的使用特征高频繁、碎片化和非 WiFi 敏感,总结起来我们可以得出三个典型的特点:高延迟、低带宽、易抖动。

那延迟、带宽和抖动又跟什么因素有关呢?这里面涉及的因素非常之多,例如信号的强度、附近有没有基站、距离有多远等;还与使用的网络制式,正在使用 3G、4G 还是 5G 网络有关,并且网络的拥塞情况也会产生影响,例如在万人聚集的大型活动场所等。

下图展示了不同网络制式的带宽和延迟的一般参考值,可以在脑海中有一个大致的印象。

关于网络优化,你需要了解什么?_第14张图片

当出现上面说到的那些因素时,网络访问的带宽要大打折扣,延迟会加倍放大。而高延迟、低带宽的网络场景也就是我们常说的“弱网络”,它主要特点有:

关于网络优化,你需要了解什么?_第15张图片

关于“弱网络”,即便是未来 5G 普及了,但网络环境错综复杂,各种各样的因素到时也依然存在,所以网络优化是一个长期存在的价值。关于这部分我们将在后面系列文章中再重点介绍。

另外不同的应用对延迟和带宽的侧重点可能不太一样,对于直播类应用或者游戏类,它们往往对及时性要求较高,也就是延迟对它们来说更重要一些;对于一些视频类点播应用如爱奇艺、腾讯视频来说,带宽会更加重要一些。网络优化需要结合自己应用的实际情况来综合考虑


3. 性能测量

说到优化就一定少不了测量这一环节,引起网络性能下降的原因有很多,这就需要我们对网络性能指标进行提取和分析,发现网络瓶颈及网络中可能存在/潜在的瓶颈/风险。

对于网络性能来说,我们通常会比较关心下面这些指标:

  • 吞吐量:每秒网络接口接收和传输的字节数;
  • 延迟:系统调用发送 / 接收延迟、连接延迟、首包延迟、网络往返时间等;
  • 连接数:每秒的连接数量;
  • 错误:丢包计数、超时等。

Linux 提供了大量的网络性能分析工具,我们还可以结合相关图形化网络数据检查进行分析,关于它们的使用请参考相关文档,这里不再赘述。

关于网络优化,你需要了解什么?_第16张图片
  • Fidder 官网,定制 Fidder

如果你对 Linux 网络底层更加熟悉,可以直接查看 /proc/net,它里面包含了许多网络统计信息的文件。例如 Android 的 TrafficStats 接口利用 /proc/net/xt_qtaguid/stats 和 /proc/net/xt_qtaguid/iface_stat_fmt 文件来统计应用的流量信息。


最后

面对复杂多变的移动网络我们该如何去优化呢?可能有的朋友会说,我只要用好 AFNetworking/OkHttp 这些成熟的网络库就可以了,并不需要额外去做什么优化。那你能够确定真的能用好这些网络库吗?它们内部是怎样实现的、有哪些差异点、哪个网络库更好呢?关于该部分将会在后面的系列文章中详细分析。

总结

网络通信事业的迅速发展,从 2G 到 4G 经历了十几年的时间,这背后离不开一位位坚守在一线通信事业的开拓者,各种各样专利技术支持。虽然网络标准不停地演进,不过受限于基建,它的速度看起来很快,但是又很慢

另外应用于万维网基石的 HTTP 网络技术协议也一直在向前演进。HTTP/2、HTTP/3 都是对网络速度“快”的思考,我们需要坚持不懈地学习,思考它们对我们可以产生哪些影响。

最后推荐一本必读的网络书籍:《Web 性能权威指南》,从中你可以得到很多关于网络优化的深度思考。


网络涉及了方方面面太多的知识,尤其是网络的基础知识对我们来说还是非常重要的,关于这部分大家又有什么要分享的?欢迎你的留言或指正。


扩展阅读
  • 关于 5G,你应该知道的发展史
  • HTTP 发展的前世今生
  • 弱网优化深度专文

UI 优化系列

  • 关于 UI 渲染,你需要了解什么?
  • 深入 Activity 三部曲(1)View 绘制流程之 setContentView() 到底做了什么 ?
  • Android 之你真的了解 View.post() 原理吗?
  • Android 之如何优化 UI 渲染(上)
  • Android 之如何优化 UI 渲染(下)
  • LayoutAnimation 炫酷的布局动画及原理分析

存储优化系列

  • Android 存储优化系列专题
  • Android 之不要滥用 SharedPreferences(上)
  • Android 对象序列化之你不知道的 Serializable
  • Android 权限管理 — 只防君子不防小人
  • Android 存储选项之 SQLite 优化那些事儿
  • Android 对象序列化之 Parcelable 取代 Serializable ?

你可能感兴趣的:(关于网络优化,你需要了解什么?)