百度应用移动网络深度优化实践分享(3):移动弱网络优化

 一、导言

 

 网络优化解决了三个核心问题。首先是安全性,我们在百度应用共享深度网络优化实践(一):域名系统优化中详细解释了这一点。第二个是速度问题。我们还在百度应用移动网络深度优化实践分享(二):网络连接优化中做了详细的介绍。三是弱网络问题,这是网络优化中最复杂的问题,需要反复验证和分析。我们的“百度APP移动网络深度优化实践分享(三):移动弱网络优化(本文*)”就是要深入探讨这个问题。

 

 该系列文章的目录如下:

 

 “百度应用移动网络深度优化实践分享(一):域名系统优化”

 “百度应用移动网络深度优化实践分享(二):网络连接优化”

 “百度APP移动网络深度优化实践分享(3):移动弱网络优化”(*本文)

 

 二、相关文章

 

 TCP/IP的详细说明-第11章UDP:用户数据报协议

 安卓程序员必须知道的网络通信传输层协议——UDP和TCP

 网络编程中的懒人介绍(4):快速理解TCP和UDP的区别

 网络编程中的懒人入门(5):快速理解为什么UDP有时优于TCP

 技术素养:新一代基于UDP的低延迟网络传输层协议

 让互联网更快:分享腾讯新一代QUIC协议的技术实践

 现代移动网络短连接优化方法综述:请求速度、弱网络适应和安全保障

 “移动即时消息开发人员必须阅读(1):易于理解,理解移动网络的“弱”和“慢”

 移动即时消息开发者必须阅读(2):历史上最全面的移动弱网络优化方法总结

 全面了解移动域名系统域名劫持和其他各种疾病:技术原理、问题根源、解决方案等。

 “米托应用的移动域名系统优化实践:HTTPS请求时间减少了近一半”

 “爱奇艺移动网络优化实践分享:网络请求成功率优化”

 "美团点评移动网络优化实践:大大提高连接成功率和速度等."

 

 三。技术背景

 

 弱网络优化需要解决两个核心问题:

 

 1)移动网络环境如此复杂,我们如何确定现在是一个弱网络环境;

 2)如何在弱网络下提高成功率,减少时延,进而改善用户的网络体验。

 

 百度应用的流量高达数十亿,弱网络比率为0.95%,这并不小。这个比率是怎么来的?我们应该从什么是判断弱网络的指标开始。

 第四,判断弱网络的指标

 

 首先,我们将讨论哪些指标会影响网络质量,包括httprtt、tcprtt、吞吐量、信号强度、带宽延迟积。

 

 百度应用移动网络深度优化实践分享(3):移动弱网络优化

 ▲影响网络质量的指标

 

 1)httprt:

 http往返时间,也称为TTFB(到第一个字节的时间),是指从客户端请求的第一个字节到http头接收的第一个字节之间的时间差。如果httprtt的时间太长,一方面是客户端访问网络的质量问题,另一方面是服务延迟相对较大。

 

 2)tcprtt:

 tcp往返时间是指发送客户端TCP通道的第一个字节和接收第一个字节之间的时间差。由于HTTP协议的底层是基于tcp的,所以在重用同一个TCP连接的前提下,HTTP传输时间包括TCP传输时间。在大多数情况下,httprtt已经可以解释问题的原因。

 

 3)吞吐量:

 吞吐量,中文名称为吞吐量,用于衡量单位时间内成功传输的数据量,是衡量网络质量的一个客观指标。吞吐量=(位结束大小-位开始大小)/(位结束时间-位开始时间)。这里有一个细节需要注意。posix套接字读取函数的返回值是字节,因此需要乘以8才能得到位。通常,当httprtt相对较小时,网络仍然很慢,因此吞吐量可以用来确定网络质量。

 

 4)信号强度:

 信号强度,这里指的是无线信号强度。在安卓系统上,信号强度可以通过PhoneStateListener的onSignalStrengthsChanged方法获得,但需要注意的是,它只能在M以上的安卓版本上生效,目前在iOS上还没有可靠的实现。

 

 5)带宽延迟积:

 带宽延迟积,中文名称为带宽延迟的乘积,是指数据链路吞吐量和实时传输的乘积。带宽延迟积的结果是该位不是位,并且该位值反映了当前网络管道的最大容量。TCP中有一个窗口大小的概念,它限制了发送和接收数据的大小,因此TCP窗口大小的调整直接受到带宽延迟积的影响。根据带宽延迟乘积的值,设置套接字的设置方法,设置选项为接收缓冲区大小和发送缓冲区大小。

 

 通过以上内容,我们对影响网络质量的指标有了一定的了解。对于不同的产品,影响网络质量的指标可以理解为相同的,但是每个指标的阈值肯定是不同的,因为它包含了业务场景,比如颤音是视频网络传输,微信是长连接数据传输,百度是文字和图片数据传输。它还包括服务器配置。不同产品线的服务集群能力肯定是不同的。例如,返回客户机服务器的时间消耗肯定是不同的。因此,不同产品的弱净指标基本相同,但指标值肯定不同。

 5.如何建立薄弱的网络标准

 

 建立薄弱的网络标准是一个渐进的过程。当我们贫穷时,我们应该如何建立这个标准?答案分为三个阶段。

 

 百度应用移动网络深度优化实践分享(3):移动弱网络优化_1.jpg

 ▲建立薄弱网络标准的步骤

 

 1)在第一阶段,离线测试:获得一些满足我们期望的阈值。此时,我们需要使用一些网络测试工具,如苹果的网络链接调节器和脸书的ATC(增强流量控制),来获得不同离线网络条件的阈值。通常,我们将测试app的冷启动场景。网络交换场景、域名系统故障场景和弱网络场景(通常,配置上行链路和下行链路带宽、丢包率、延迟和域名系统延迟参数,或者更简单地说,默认使用工具配置一些弱网络配置)。

 

 2)第二阶段,在线验证:通过离线全测试得到的阈值,可以在线获得弱网络的比例。在这里,百度应用是针对特定的场景,如刷新Feed和打开搜索的登陆页面等。即使是在移动时代被公认为拥有良好网络体验的微信,也只是在信令传输(发送和接收消息)方面进行了优化,因此收集场景中的弱网络数据非常重要。

 

 3)第三阶段,在线试错:为了达到理想的弱网络效果,需要反复调整在线阈值。通过调整阈值,我们可以比较场景中网络请求的成功率、时间消耗和连接重用率,从而得到一个合理的阈值,该阈值往往是针对场景的。

 

 谈了这么多,如何发现薄弱的网络?

 六、网络检测的总体架构和实现

 

 网络检测是弱网络检测的基础。能否及时准确地检测网络质量是我们首先要解决的问题。我们将网络检测分为主动网络检测和被动网络获取两部分。

 

 6.1主动网络检测

 

 所谓主动检测是指在触发一定条件后,主动检测网络,并根据一定条件检查网络是否处于弱网络状态。百度应用开发了自己的主动检测组件,如下图所示。

 

 百度应用移动网络深度优化实践分享(3):移动弱网络优化_2.jpg

 ▲主动网络检测

 

 (6.1.1)策略层:

 

 检测策略层通过多种策略的结合,大大提高了主动检测的即时性和准确性。我们结合上面的策略层图来解释检测维度的重要性。

 

 当网络请求成功和失败时,我们分别触发弱网络检测逻辑。

 

 主要分为以下三种逻辑:

 

 1)当成功时,如何判断弱网络状态?检查weakhttprtt的阈值。该值取决于服务设置(对于特殊场景的请求,该值通常为95位或更多位)。如果大于该值,将进入弱网络检测。为了防止频繁的触发检测,增加了时间间隔维度,当前定义为10分钟。从离线模拟测试来看,只要大于这个阈值,检测结果一定是弱网络状态。

 2)当成功时,如何判断退出弱网络?检查goodhttprtt的阈值,该值取决于服务设置(通常,该值将取整个网络的第95个百分点或更大的值),如果小于该值,则证明有必要切换回正常网络状态。为了防止频繁的触发检测,增加了时间间隔维度,当前定义为30秒。从离线模拟测试来看,只要小于这个阈值,测试结果就一定是正常的。如果大于或等于该阈值,则不能证明它不是正常网络,因此有必要启动网络检测。但是,因为这是一次成功的回调,频率会非常高,所以我们增加了30秒的时间间隔限制,同时也增加了一个时间限制。持续成功的%次(4次)的阈值等于0。然而,似乎频率仍然有点高,所以我们引入了一个逐步增加的机制,它随着时间的增加以60秒的几何倍数增加。

 3)当失败时,如何判断网络的弱状态?首先,将判断连续失败的次数。连续失败次数/次数阈值(2次)等于1,连续失败次数%次数阈值(2次)等于0。与成功相比,失败次数更严格,主要考虑多触发网络检测的损失性能。

 

 进入弱网络状态后,将触发基本能力层ping和dns查询检测。

 

 (6.1.2)基本能力层:

 

 检测基础能力层主要提供弱网络检测手段,一个是dns查询,另一个是ping,百度应用使用C++实现这两种能力。

 

 为什么选择这两种方法?正如我们在系列2中介绍的,网络请求分为四个阶段:域名解析->顶级域名解析->TCP->数据传输。判断网络连通性主要是在dns和TCP阶段,DNS查询和ping被用来检测这两个阶段的连通性。域名系统查询发起对百度核心域名mbd.baidu.com的域名系统查询,查询到的域名系统服务器为系统配置的域名系统服务器(iOS通过res_ninit函数建立一个_res_state结构,安卓通过systemproperty获取net.dns1和net.dns2的值,即可获得系统配置的域名系统服务器),域名系统查询超时时间为3s。ping的目标地址为百度核心域名mbd.baidu.com,ping次数为两次,默认超时时间为1秒。

 

 在判断弱网络状态后,结果将被提供给接口层。

 

 (6.1.3)界面层:

 

 接口层主要提供主动检测的网络状态,包括良好、不良、未知和离线。

 

 1)良好:DNS查询成功,ping成功,即标记为良好;

 2)坏:一旦ping失败,它就被标记为坏;

 3)未知:初始状态或未识别状态未知;

 4)脱机:dns服务器错误(未获得要发送的dns服务器地址)、网关错误(读取/proc/net/route文件失败)、发送dns错误(发送dns数据错误)、ping读取和写入错误(ping期间读取和写入错误)、接收dns错误(接收dns数据错误)、错误ping地址(空ping地址)、未知DNS域名(DNS找不到域名错误)、icmp初始化错误(初始化icmp失败)和dns udp错误(创建udp套接字失败),这些错误标记为脱机。

 

 6.2被动网络获取

 

 被动获取是指记录每个网络请求的所有细节,并根据一定的条件上报原始信息,上层根据条件判断是否处于弱网络状态。百度应用是基于cronet的NQE(网络质量评估器)定制开发的。

 

 首先,我们解释要收集的数据,包括tcprtt、httprtt和吞吐量,如下图所示。

 

 百度应用移动网络深度优化实践分享(3):移动弱网络优化_3.jpg

 ▲被动数据收集

 

 1)tcprtt,它是基于posix和windows socket编程接口获得的。获取机会是当连接完成、读取完成和写入完成时;

 2)HTTP TT是基于HTTP协议栈实现的,它是通过计算接收响应数据开始和发送响应数据开始之间的时间差得到的。获取机会是在读取第一个数据包完成时;

 3)吞吐量:字节和时间需要通过上述计算公式获得,字节可以通过posix和windows socket编程接口获得。当读取完成时,有机会记录接收的字节,当写入完成时,记录发送的字节。时间获取在吞吐量管理模块中完成,这将在下面描述。获取机会是在请求完成并销毁时。

 

 以下是被动网络采集的总体架构图。

 

 百度应用移动网络深度优化实践分享(3):移动弱网络优化_4.jpg

 ▲被动网络获取

 

 (6.2.1)能力层:

 

 如上所述,能力层主要从三个维度收集数据:tcprtt、httprtt和吞吐量。

 

 (6.2.2)策略层:

 

 被动采集策略层通过各种策略的组合,减少了各种采集数据的报告机会,降低了对性能的影响。

 

 1)套接字管理模块首先负责获取tcprtt的值。如何获得tcprtt?通过getsockopt函数获取tcp_info结构中的tcpi_rtt值。其次,由于tcprtt的频繁报告频率,制定了1秒间隔报告限制。

 

 2)吞吐量管理模块负责吞吐量的计算。计算公式如上所述。字节是从网络活动监视器模块获得的,但是吞吐量的计算单位是位,因此字节乘以8。统计计算中将只包括GET请求,并且在开始统计计算之前,将至少累积5个请求。排除准确性的干扰,如本地主机、专用子网主机和专用子网主机,请参考RFC1918。

 

 3)网络质量管理模块从套接字管理模块获取tcprtt,从吞吐量管理模块获取吞吐量,并在HTTP协议栈读取第一个数据包时获取httprtt。在获得这三个值之后,需要通过一些策略来限制报告的频率和10秒间隔的限制;网络类型不能是未知的(下面将详细解释);网络不能频繁切换;Rtt和总吞吐量各为300。

 

 (6.2.3)界面层:

 

 接口层主要提供被动收集的网络状态,包括好、坏、未知和离线。

 

 1)良好:广义上的3g和4G,任何条件都标记为良好。用阈值来标记广义上的3G和4G,httprtt大于或等于273毫秒,tcprtt大于或等于204毫秒,即标记3G状态。少于这两个值的被标记为广义4G,包括4G、WiFi和各种质量更好的接入网络。

 

 2)坏:慢速2G、2G和httprtt大于1.31秒,任何情况都标记为坏。将2G和2G标记为慢阈值,httprt≥2.01秒,TCP rt≥1.87秒,并将2G标记为慢。Httprtt大于或等于1.42秒,tcprtt大于或等于1.28秒,标记为2G。Httprtt大于1.31秒,这刷新了百度应用订阅源的服务阈值。

 

 注:上述时间值是nqe的内在机制,具有普遍性。

 

 3)UNKNOWN:非法的httprtt、tcprtt、吞吐量和任何条件都被标记为UNKNOWN。什么是非法的?值-1是非法的,那么什么条件被标记为-1?首先,初始化时它将被标记为-1。其次,当httprtt、tcprtt和吞吐量的值从未被获得时,将使用本地默认值作为判断标准,这是一种容错处理。

 

 4)离线:安卓平台依靠平台的能力获取网络信息,并通过网络信息的断开来获取是否连接。如果未连接,则判断为离线;如果网络信息为空,则判断为离线。

 7.百度应用如何在弱网络状态下改善用户体验

 

 百度应用移动网络深度优化实践分享(3):移动弱网络优化_5.jpg

 ▲弱网络下百度应用的手段

 

 7.1百度应用弱网络下Quic的最佳实践

 

 快速UDP互联网连接是新一代互联网传输协议,最早起源于谷歌。有关其详细内容,请参考https://www.wolfcstech.com/2019/03/27/quic_2019_03_27/(或阅读文章“技术素养:新一代基于UDP的低延迟网络传输层协议——Quic详细说明”)。在这一章中,我们将不介绍Quic。

 

 百度应用的一般网络请求将在弱网络状态下切换到QUIC。本章重点介绍百度应用在弱势网络中开通QUIC后遇到的问题。首先,一旦遇到问题,是否可以回滚?第二,如何让流量在弱网络下尽可能的去QUIC?为了解决这两个问题,我们的解决方案是QUIC提升阶段和QUIC预连接的原则。

 

 (7 . 1 . 1)quic提升阶段的原则:

 

 百度应用移动网络深度优化实践分享(3):移动弱网络优化

 ▲ QUIC提升原理

 

 如上图的QUIC部分所示,QUIC的升级依赖于HTTP替代服务,这是一个与HTTP相关的协议。它不是专门为QUIC设计的,主要负责替换HTTP协议上的新服务。对于HTTP1.1协议,它是通过HTTP响应头传输回来的,所以它只能在第二个请求上生效,如下面的格式所示。

 alt-Svc:quic = " alt . example . com:443 ",quic = ":443 ";ma=2592000

 

 

 上述信息指示切换到quic协议,指定域名服务和端口,并指定有效时间(秒)。

 Alt-Svc:清除

 

 

 以上信息表明更改后的配置将被清空

 

 网络图书馆中的变更连接和原始连接之间存在竞争机制。如果更改信息已经存在,将首先发送更改连接,但原始连接将被延迟。默认延迟时间为300毫秒。谁先成功,谁就使用这个连接。如果更改连接在QUIC握手中失败,将记录该更改信息的失败次数,并根据失败次数计算到期时间。失效时间随着失效次数指数的增加而增加,最长为2天。当过期时间到期时,更改信息将被清除,当更改连接在QUIC中成功握手时,更改信息将被清除。

 

 (7.1.2)QUIC预连接:

 

 所谓QUIC预连接是指在进入弱网络状态之前,预先建立QUIC连接。每个人都知道QUIC为0RTT感到骄傲,但是第一次建立连接需要1RTT。客户端将首先向服务器发送客户端问候消息,服务器将回复服务器拒绝消息,其中包括服务器配置。使用服务器配置,客户端可以直接计算密钥。完成后,请参考[网址= https://www.wolfcstech.com/2017/...% E5% 8d% 8f% E8% AE% AE/]数据[4][/网址]了解详细信息。

 

 根据上述原理,客户端拉服务器配置的成功概率将直接影响到弱网络下QUIC的流量,因此我们将在启动应用程序的过程中进行QUIC预连接,并拉下服务器配置,这样在进入弱网络后,变更后的连接将很有可能与原来的连接竞争,然后遵循QUIC协议。

 

 7.2百度应用弱网络下复合连接的最佳实践

 

 关于复合连接的具体原理,请参考百度APP移动网络深度优化实践分享(二):网络连接优化中的具体介绍。目前,百度应用只对弱网络下的图片网络请求开放复合连接,因为无论是HTTPDNS结果还是本地域名结果,图片请求都是多个IPs,这是满足复合连接的前提。多IP在弱网络中的尝试优于单IP。此外,弱网络的比例相对较小,服务器上复合连接的负载也会较小。

 八、百度应用网络整体架构

 

 百度应用移动网络深度优化实践分享(3):移动弱网络优化_6.jpg

 ▲百度应用网络整体架构

 

 百度应用网络整体架构,以网络外观为中间层,将上层的最佳实践和底层的基础网络库分离开来。

 

 1)最佳实践:

 

 客户端网络库的部分工作负载是如何使最佳实践更好。在音频和视频领域,iOS的AVPlayer和两端的ijkPlayer都使用HTTPDNS组件来接管域名系统模块,但不是所有的网络模块。react national的网络模块RCTNetworking、安卓的图像库Fresco和iOS的SDWebImage、安卓的WebView组件Chromium和iOS的WKWebView以及百度应用的自有业务都是通过网络门面的接口层直接接管的。对于第三方业务,考虑到与主机的耦合关系,直接使用安卓HttpURLConnection和iOS URLSession系统的标准接口。

 

 2)网络外观:

 

 网络门面主要包括:

 

 A.拦截器模块(为服务定制网络外观提供的机制);

 B.并发队列模块(提供高、中、低网络请求优先级);

 C.网络检测组件(弱网络主动检测能力)和网络诊断模块(包括https、ping和dns验证);

 D.HTTPDNS组件(在百度应用移动网络深度优化实践分享(一):域名系统优化中详细解释);

 E.网络监控模块(客户端打点机制、服务器例行和紧急监控);

 F.HttpURLConnection封装层;

 G.URLSession封装层。

 

 3)基础网络库:

 

 基本网络库由两部分组成:

 

 一部分是基于cronet二次订阅的统一网络库;

 部分是网络套接字基本库(安卓的JavaWebSocket,操作系统的SocketRocket)。

 

 统一网络库包含连接优化的内容(在百度应用深度网络优化实践分享(二):网络连接优化中详细解释)和弱网络优化的内容(上述被动获取)。底层协议栈由AOP注入到HttpURLConnection(使用URLStreamHandlerFactory)和URLSession(使用URLSessionConfiguration的protocolClasses属性),两者都是由系统提供的URL加载机制。

 九.实际收入

 

 弱网络优化的好处主要体现在进入弱网络状态后的上述手段上,包括打开QUIC、QUIC预连接和打开复合连接。

 

 1)在弱网络中启动QUIC后,网络连接成功率提高0.01%,平均时间消耗降低23.5%;

 2)在弱网络下启动QUIC预连接后,QUIC协议的pv从37万增加到90万;

 3)在弱网络中打开复合连接后,坏状态下的时间消耗减少了2.5%,离线状态下的时间消耗减少了7.7%。

 

 


----------------------------------------------------------------------------------

哇谷im_im即时通讯_私有云_公有云-哇谷云科技官网-JM沟通

IM下载体验 - 哇谷IM-企业云办公IM即时聊天社交系统-JM 沟通下载

IM功能与价格 - 哇谷IM-提供即时通讯IM开发-APP搭建私有化-公有云-私有化云-海外云搭建

新闻动态 - 哇谷IM-即时通讯热门动态博客聊天JM沟通APP

哇谷IM-JM沟通热门动态博客短视频娱乐生活

关于哇谷-哇谷IM-提供企业即时通讯IM开发-语音通话-APP搭建私有化-公有云-私有化云-海外云搭建

联系我们 - 哇谷IM-即时通讯IM私有化搭建提供接口与SDK及哇谷云服务

即时通讯IM融云世界

IM即时通讯钉钉技术:企业IM钉钉在后端架构上的优越之处

新的市场叫板环信、融云、腾讯云!开源版IM即使聊天工具

企业IM即时通讯聊天办公APP钉钉技术分析交流

哇谷云-怎么样正确认识海外云服务器

公有云和私有云之间有什么区别?类似融云、环信云、网易云、哇谷云?