查看: 573|回复: 0

浅谈APP手游服务端网络深度优化实践分享,手游服务端弱网...

[复制链接]

4783

主题

5079

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
18913

最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

发表于 2020-2-26 14:29:36 | 显示全部楼层 |阅读模式
浅谈APP手游服务端网络深度优化实践分享,手游服务端弱网优化篇  

一.导言
网络优化有三个核心问题需要解决。第一个是安全问题,我们在《APP手游服务端网络深度优化实践分享(一):DNS优化篇》已经详细解释过了。第二个是速度问题,我们在《APP手游服务端网络深度优化实践分享(二):网络连接优化篇》也详细介绍过。第三是弱网络问题,这是网络优化中最复杂、需要反复验证和分析的问题。我们的《APP手游服务端网络深度优化实践分享(三):手游服务端弱网优化篇(本文 *)》就是要深入讨论这个问题。
本系列文章的内容如下:《APP手游服务端网络深度优化实践分享(一):DNS优化篇》 《APP手游服务端网络深度优化实践分享(二):网络连接优化篇》 《APP
手游服务端网络深度优化实践分享(三):手游服务端弱网优化篇》 (*本文)
二.相关条款《TCP/IP详解 - 第11章·UDP:用户数据报协议》 《Android程序员必知必会的网络通信传输层协议——UDP和TCP》 《网络编程懒人入门(四):快速理解TCP和UDP的差异》 《网络编程懒人入门(五):快速理解为什么说UDP有时比TCP更有优势》 《技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解》 《让互联网更快:新一代QUIC协议在腾讯的技术实践分享》 《现代手游服务端网络短连接的优化手段总结:请求速度、弱网适应、安全保障》 《手游服务端IM开发者必读(一):通俗易懂,理解移动网络的“弱”和“慢”》 《手游服务端IM开发者必读(二):史上最全移动弱网络优化方法总结》 0103010 0103010
三.技术背景
弱网络优化需要解决两个核心问题:
1)移动网络环境如此复杂,我们如何确定现在是一个弱网络环境;
2)确定如何提高弱网络环境下的成功率,减少弱网络下的延迟,进一步提高用户的网络体验。
百度应用承载着十亿级流量,净比率为0.95%,这个数字并不小。这个比率是如何产生的?还是要从判断弱网指数开始。
四.判断弱网络的指标
首先,让我们讨论一下哪些指标会影响网络质量,包括httprtt、tcprtt、吞吐量、信号强度、带宽延迟积。
1)httprt:
http往返时间,也称为TTFB(到第一个字节的时间),是指从客户端请求的第一个字节到http头接收的第一个字节之间的时间差。如果httprtt时间太长,一方面,客户端访问网络的质量有问题,另一方面,服务延迟相对较大。
2)tcprtt:
Tcptt (tcpround-triptime)是指正在发送的客户端tcp通道的第一个字节和正在接收的第一个字节之间的时间差。由于HTTP协议的底层是基于tcp的,所以在重用同一个TCP连接的前提下,HTTP传输时间包括TCP传输时间。在大多数情况下,httprtt已经可以解释问题的原因。
3)吞吐量:
吞吐量,中文名称为吞吐量,用于衡量单位时间内成功传输的数据量,是网络质量的客观指标。吞吐量=(获得的位结束大小-获得的位开始大小)/(获得的位结束时间-获得的位开始时间),这里有一个要注意的细节,posix套接字的读取函数返回字节,因此乘以8获得位。通常当httprtt相对较小时,网络仍然很慢,此时吞吐量可以用来确定网络的质量。
4)信号强度:
信号强度是指无线信号强度。在安卓系统上,信号强度可以通过PhoneStateListener的onSignalStrengthsChanged方法获得,但是应该注意的是,它只能在安卓M以上的版本中生效。
5)带宽延迟积:
带宽延迟积,即中文名称带宽延迟的乘积,是指数据链路吞吐量和往返通信延迟的乘积。带宽延迟积的结果是该位不是位,并且该位值反映了当前网络管道的最大容量。TCP有一个窗口大小的概念,它限制了发送和接收数据的大小。因此,传输控制协议窗口大小的调整直接受到带宽延迟积的影响。socket的setsockopt方法是根据带宽延迟乘积的值来设置的。选项设置为“接收缓冲区大小”和“发送缓冲区大小”。
通过以上内容,我们对影响网络质量的指标有了一定的了解。对于不同的产品,影响网络质量的指标可以理解为相同的,但是每个指标的阈值肯定是不同的,因为它包含了业务场景,如抖音视频网络传输、微信长连接数据传输和百度文字图片数据传输。它还包括服务器端设备。不同产品线的服务集群能力肯定是不同的。例如,返回客户端服务器所需的时间肯定是不同的。因此,不同产品的弱净指数基本相同,但指数值肯定不同。
五、如何建立薄弱的网络标准
弱网标准的建立是一个渐进的过程。当我们越来越穷的时候,我们应该如何建立这个标准?答案分为三个阶段。
APP移动网络深度优化实践分享(3):移动弱网络优化
▲建立弱网络标准的步骤
1)在第一阶段,线下测试:为了获得一些满足我们期望的阈值,我们需要使用一些网络测试工具,如苹果的网络链接调节器和脸书的ATC(增强流量控制)来获得不同网络条件的线下阈值。一般来说,我们将测试应用程序冷启动场景、网络交换场景、域名系统故障场景和弱网络场景(通常配置上行链路和下行链路带宽、丢包率、延迟、域名系统延迟参数,或者更简单地说,使用工具的默认弱网络配置)。
2)第二阶段,在线验证:通过线下对获得的阈值进行全面测试,可以在线获得弱网络的比例。在这里,百度应用是针对特定的场景,如提要刷新,搜索登陆页面打开等。即使是被广泛认为是移动时代良好网络体验的微信,也只是在信令传输(发送和接收消息)方面进行了优化,因此收集场景中的弱网络数据非常重要。
3)第三阶段,在线试错:为了达到理想的弱网效果,需要在线反复调整阈值。通过调整阈值来比较场景中网络请求的成功率、时间消耗和连接重用率等指标,可以得到一个合理的阈值,该阈值倾向于目标场景。
在所有这些谈话之后,如何实现对弱网络的检测?
六.网络检测的总体架构及实现
网络检测是弱网络检测的基础。网络质量能否被及时准确地检测出来是我们首先需要解决的问题。我们将网络检测分为主动网络检测和被动网络获取两部分▲主动网络检测
(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阶段,域名系统查询和ping用于检测这两个阶段的连通性。域名系统查询发起对百度核心域名mbd.baidu.com的域名系统查询。查询的域名服务器是系统配置的域名服务器(iOS通过RES _ NININIT函数构造一个_res_state结构,安卓通过系统属性获取网络域名1和网络域名2的值,就可以得到系统配置的域名服务器)。域名系统查询的超时时间为3秒。ping的目标地址是百度的核心域名mbd.baidu.com。ping的次数是两次,每次的超时时间默认为1。
在判断弱网络状态后,结果将被提供给接口层。
(6.1.3)接口层:
接口层主要提供主动检测的网络状态,包括好、坏、未知、离线。
1)良好:域名系统查询成功,ping也成功,即标记为良好状态;
2)坏ing失败被标记为坏状态一次;
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和吞吐量,如下图所示。
APP移动网络深度优化实践分享(3):移动弱网络优化
▲被动数据采集
1)tcprtt,基于posix和windows socket编程接口获取tcprtt。采集时间是在连接、读取和写入完成时。
2)基于HTTP协议栈实现的httprtt,通过计算接收响应数据开始和发送开始之间的时间差获得。获取定时是在读取第一个包完成时;
3)吞吐量、字节和时间需要通过上述计算公式获得,字节是基于posix和windows socket编程接口获得的。采集时序记录读取完成时接收的字节和写入完成时发送的字节。时间的获取在吞吐量管理模块中完成,这将在下面描述。采集时间是请求完成和请求销毁的时间。
以下是被动网络采集的总体架构图。
APP移动网络深度优化实践分享(3):移动弱网络优化
▲被动网络获取
(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,httprtt大于或等于2.01秒,tcprtt大于或等于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)离线:根据平台能力进行判断。雄甾酮快速UDP互联网连接(QUIC)是新一代互联网传传输协议,最早起源于谷歌。详细内容请参考https://www.wolfcstech.com/2019/03/27/quic_2019_03_27/(或阅读本网站文章:《技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解》)。在这一章里,我们不会把QUIC介绍给大众科学。
百度应用的普通网络请求将在弱网络状态下切换到QUIC。本章重点介绍百度应用在弱势网络中开通QUIC后遇到的问题。一个是QUIC一旦打开是否可以回滚。第二,流量如何在弱网下尽可能多的走QUIC?为了解决这两个问题,我们的解决方案是QUIC提升阶段原则和QUIC预连接。
(7.1.1)QUIC提升原则:
如上图的QUIC部分所示,QUIC的高度和高度取决于HTTP替代服务,这是一个与HTTP相关的协议。它不是专门为QUIC设计的,主要负责替换基于HTTP协议的新服务。对于HTTP1.1协议,它是通过HTTP响应头传输回来的,因此它只能在第二次请求时生效,如以下格式所示。
alt-Svc : quic=' alt . example . com :443 ',quic=' :443ma=2592000
上述信息表明,切换到quic协议指定了域名服务和端口,并指定了有效时间(秒)。
Alt-Svc:清除
上述信息表明更改配置将被清除
网络图书馆中的变更连接和原始连接之间存在竞争机制。如果更改信息已经存在,将首先发送更改连接,而原始连接将被延迟。延迟时间默认为300毫秒。谁先成功,谁就使用该连接。如果在QUIC握手期间alter connection失败,将记录该更改信息的失败次数,并根据失败次数计算到期时间。失效时间将随着失效时间指数的增加而增加,最长为2天。当过期时间到期时,此更改消息将被清除。当此变更连接成功与QUIC握手时,此变更消息将被清除。
(7.1.2)QUIC预连接:
QUIC的所谓预连接是在进入弱网络状态之前预先建立QUIC连接。每个人都知道QUIC为0RTT感到骄傲,但是当第一次建立连接时,它需要1RTT。客户端将首先向服务器发送一条客户端问候消息,服务器将回复一条服务器拒绝消息,其中包括服务器配置。通过服务器配置,客户端可以直接计算密钥。完成0RTT。详情请参考[网址=https://www.wolfcstech.com/2017/.协议/]数据[4][/网址]。
根据上述原则,客户端拉服务器配置的成功概率将直接影响弱网络下的QUIC流量,所以我们将在应用启动和拉服务器配置的过程中进行QUIC预连接,这样在自媒体9)弱网络后,改变连接将与原来的连接以高概率竞争,然后通过QUIC协议。
7.2百度应用弱网络下复合连接的最佳实践
复合连接的具体原理见《APP手游服务端网络深度优化实践分享(二):网络连接优化篇》的详细介绍。百度应用目前只对弱网络下的图片网络请求开放复合连接,因为图片请求无论是HTTPDNS结果还是本地域名结果都是多个IP,这是满足复合连接的前提。弱网络下多IP的结果优于单IP。此外,弱网络的比例相对较小,服务器上复合连接的负载也较小。
八、百度应用网络整体架构APP移动网络深度优化实践分享(3):移动弱网络优化
▲百度应用网络的总体结构
百度应用网络的整体架构以网络外观为中间层,将上层的最佳实践与下层的基本网络库隔离开来。
1)最佳实践:
客户端网络库的部分工作负载是如何使最佳实践更好。在音频和视频领域,无论是iOS AVPlayer还是ijkPlayer,都使用HTTPDNS组件来接管域名系统模块,但不是所有的网络模块。网络模块:回答者的网络,图片库中安卓的Fresco和iOS的SDWebImage,网络视图组件中安卓的Chromium和iOS的WKWebView,以及百度应用自己的业务,都是通过网络门面的接口层直接接管的。对于第三方服务,考虑到与主机的耦合关系,直接使用安卓的HttpURLConnection和iOS的URLSession系统标准接口。
2)网络外观:
网络门面主要包括:
拦截器模块(为业务订阅网络外观提供的机制);
并发队列模块(提供高、高、低和非常高的网络请求优先级);
C.网络检测组件(弱网络主动检测能力)、网络诊断模块(包括https、ping、dns检查);
D.HTTPDNS组件(在《APP手游服务端网络深度优化实践分享(一):DNS优化篇》中详细解释);
E.网络监控模块(客户端的管理机制,服务器的日常和突发监控);
F.HttpURLConnection封装层;
G.URLSession封装层。
3)基础网络库:
基本网络库由两部分组成:
一部分是基于cronet二次订阅的统一网络库。
其中一部分是网络套接字的基本库(针对安卓的JavaWebSocket和针对iOS的SocketRocket)。
统一网络库包含连接优化(详见《APP手游服务端网络深度优化实践分享(二):网络连接优化篇》)和弱网络优化(如上所述被动获取)的内容。底层协议栈通过AOP注入到HttpURLConnection(使用URLStreamHandlerFactory)和URLSession(使用URLSessionConfiguration的protocolClasses属性),两者都是系统提供的网址加载机制。
九.实际收益
弱网络优化收益我们主要考察上述进入手段后的弱网络状态,包括开放QUIC、QUIC预连接和开放复合连接。
QUIC在弱网络下开通后,网络连接成功率提高了0.01%,平均时间消耗减少了23.5%;
2)在弱网络下开通QUIC预连接后,QUIC协议的pv从370,000增加到900,000;
3)在弱网络下打开复合连接后,不良状态下的时间消耗减少了2.5%,离线状态下的时间消耗减少了7.7%。
X.本文的结论
系列一到系列三的内容到今天已经完成了。我希望这对你的工作和学习有所帮助。我感谢你的持续关注和鼓励。生活在继续,优化在继续,我们对技术很认真。


【GM论坛[www.gmbbs.net]免责声明】
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,不存在任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。 我们不承担任何技术及版权问题,且不对任何资源负法律责任。
4、论坛的所有内容都不保证其准确性,完整性,有效性。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请告之,本站将立即删除。
   提问发帖求助请点此发帖 https://www.gmbbs.net/
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表