(转载)百度App网络深度优化系列

一、百度App网络深度优化系列《一》DNS优化
https://baijiahao.baidu.com/s?id=1621552582705610161
DNS优化核心需要解决的问题有两点:

【1】由于DNS劫持或故障造成的服务不可用,进而影响用户体验,影响公司的收入。
【2】由于DNS调度不准确导致的性能退化,进而影响用户体验。
在这里插入图片描述
解决方案:
HTTPDNS:原理如图
在这里插入图片描述
HTTPDNS部署结构:
在这里插入图片描述
端HTTPDNS的整体架构:
在这里插入图片描述

收益
DNS优化的收益主要有两点,一是防止DNS的劫持(在出问题时显得尤为重要),降低网络时延(在调度不准确的情况下,会增大网络的时延,降低用户的体验),这两点收益需要结合业务来说,以百度App Feed业务为例,第一点上我们取得了比较大的效果,iOS劫持率由0.12%降低到0.0002%,Android劫持率由0.25%降低到0.05%,第二点的收益不明显,原因在于Feed业务主要目标群体在国内,百度在国内节点布局相对丰富,服务整体质量也较高,即使出现调度不准确的情况,差值也不会太大,但如果在国外情况可能会差很多。

二、百度App网络深度优化系列《二》连接优化
https://baijiahao.baidu.com/s?id=1625511944699576834&wfr=spider&for=pc

参考学习:TLS 握手优化详解

在这里插入图片描述

连接优化需要解决两个核心问题
1.连接建立耗时较长,导致请求的总时长变长,进而影响用户体验。
2.在多变的网络环境下,连接建立的过程可能会失败,导致成功率下降,进而影响用户体验。

百度App的优化目标分为两类
一类是TLS的连接优化:Session Resumption(一种是Sesssion Identifier,一种是Session Ticket)和False Start(应用数据的发送实际上并未等到握手全部完成,所以称之为抢跑)
在这里插入图片描述
一类是TCP的连接优化:包括预连接( 它解决的场景是在App使用阶段可以无耗时的获取连接,针对核心业务),连接重建(针对连接池里的所有连接,连接重建的连接个数限制是100个),备用连接(它解决的场景是正常发送一个请求当group内无连接可用的时候,针对所有请求),复合连接(它解决的场景是为了多个IP地址的连接选取问题)。
连接池在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

连接优化在Android网络架构的位置及实践
在这里插入图片描述
连接优化在iOS网络架构的位置及实践
在这里插入图片描述

收益
连接优化的收益主要体现在网络时延和网络成功率上,这两点收益需要结合业务来说,以百度App Feed刷新这个典型业务场景为例。Feed刷新文本请求网络时延降低16%,Feed刷新图片请求网络时延降低12%,可谓收益相当明显。成功率方面,Feed刷新文本请求成功率提升0.29%,Feed刷新图片请求成功率提升0.23%,也是非常不错的收益。

三、百度App网络深度优化系列《三》弱网优化
https://baijiahao.baidu.com/s?id=1639735090535694510

指标
1.httprtt
httprtt(http Round-Trip Time)又名TTFB(Time to first byte),指从客户端请求的第一个字节开始发送到接收到http header的第一个字节的时间差。httprtt的时间如果过长,一方面是客户端本身接入网络质量的问题,另一方面是服务的延时比较大。

2.tcprtt
tcprtt(tcp Round-Trip Time)指客户端tcp信道第一个字节发送到接收第一个字节的时间差。因为HTTP协议底层是基于TCP的,所以在复用同一条tcp连接的前提下,httprtt的时间是包含tcprtt的时间的。大部分情况下httprtt已经可以说明问题的原因。

3.throughput
throughput,中文名字吞吐量,它是用来衡量单位时间内成功传送数据的数量,是可以比较客观的衡量网络质量的指标。吞吐量 =(获bits结束大小 - 获bits开始大小)/(获bits结束时间 - 获bits开始时间),这里有个细节需要注意,posix socket的read函数返回值是bytes,所以要乘以8得到bits。通常在httprtt比较小的情况下,网络依然很慢,这个时候就可以使用吞吐量来确定网络的质量。

4.signal strength
signal strength,这里指的是无线信号强度,在Android上可以通过PhoneStateListener的onSignalStrengthsChanged方法获取到信号强弱,但要注意只能在Android M以上的版本才生效。iOS上暂时没有靠谱的实现。

5.bandwidth-delay product
bandwidth-delay product,中文名带宽时延乘积,指的是一个数据链路的能力(throughput)与来回通信延迟(rtt)的乘积。带宽时延乘积的结果是比特不是位,这个比特值反应出当前网络管道的最大容量。TCP中有一个窗口大小的概念,会限制发送和接收数据的大小,所以TCP窗口大小的调节是直接受带宽时延乘积的影响,根据带宽时延乘积的值去设置套接字的setsockopt方法,设置的option是SO_RCVBUF(接收缓冲区大小)和SO_SNDBUF(发送缓冲区大小)。

网络探测的整体架构和实现
1.主动网络探测

所谓主动探测,就是在触发了某些条件后,主动的进行网络探测(基础能力层的ping和dns query的探测,百度App使用C++实现了这两个能力。为什么要选用这两种手段呢?我们在系列二中介绍过,一个网络请求,分为DNS-》TLS-》TCP-》数据传输 四个阶段。想判定网络连通性主要在DNS和TCP阶段,所以dns query和ping就是用来检测这两个阶段的连通性手段。dns query向百度核心域名mbd.baidu.com发起dns查询,查询的DNS服务器为系统配置的DNS服务器(iOS通过res_ninit函数构建一个__res_state的结构体,Android通过systemproperty获取net.dns1和net.dns2的值,便可获取系统配置的DNS服务器),DNS查询的超时时间为3s。ping的目标地址为百度核心域名mbd.baidu.com,ping的次数为两次,每次超时时间是默认的1s。),并按照一定的条件检查出是否是弱网状态。百度App自研了主动探测组件,如下图所示。
接口层主要提供主动探测出来的网络状态,目前包括GOOD,BAD,UNKNOWN,OFFLINE。
在这里插入图片描述
2.被动网络采集
所谓被动采集,就是每一次网络请求的所有细节都进行记录,并按照一定的条件将原始信息进行上报,上层再根据条件判断是否是弱网状态。百度App基于cronet的NQE(Network Quality Estimator)进行了二次订制开发。
能力层内容上面我们已经讲过,主要采集tcprtt、httprtt、throughput三个维度的数据。

在这里插入图片描述
被动网络采集的整体架构图。
在这里插入图片描述
弱网状态下百度App如何改善用户体验
在这里插入图片描述

收益
弱网优化的收益我们主要从上面讲到的进入弱网状态后的手段来看,包括开启QUIC,QUIC预连接,开启复合连接。
1)弱网下开启QUIC后,网络连接成功率提升0.01%,平均耗时降低23.5%。
2)弱网下开启QUIC预连接后,QUIC协议的pv从37万涨到90万。
3)弱网下开启复合连接后,bad状态下耗时降低2.5%,offline状态下耗时降低7.7%。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值