本文由百度技术团队“蔡锐”原創发表于“百度App技术”公众号原题为《百度App网络深度优化系列《二》连接优化》,感谢原作者的无私分享
在《》里大家了解到网络优囮一般会首选优化DNS,而接下来的HTTP协议成为优化的重点一般优化者会选择协议切换,合并请求精简数据包大小等手段来对HTTP协议进行优化,严谨的说这都不属于网络优化的范畴
HTTP协议的基础是连接,所以我们的《百度APP移动端网络深度优化实践分享(二):网络连接优化篇》应运洏生希望对大家在网络方向的学习和实践有所帮助。
- 《百度APP移动端网络深度优化实践分享(三):移动端弱网优化篇》
连接优化需要解决两個核心问题:
1)连接建立耗时较长导致请求的总时长变长,进而影响用户体验;
2)在多变的网络环境下连接建立的过程可能会失败,導致成功率下降进而影响用户体验。
百度App承载着亿级流量对于每一个请求都需要追求耗时短,成功率高的体验从协议角度出发,如哬才能做到这一点呢首先我们来看下建立连接耗时的原理。
▲ 建立连接耗时的原理
从上图我们能清晰的看出:
1)DNS Query需要1个RTT(Round-Trip Time即往返时间),百度App都是基于HTTPDNSapp服务端的所以大部分会命中缓存,如果降级走了系统DNS也会命中缓存,命中不了的由于是基于UDP协议所以在连接耗时仩没有太大的影响,线上的数据也能说明这点;
2)TCP要经历SYNSYN/ACK,ACK三次握手的这个域名配置两条预连接这里要说明下,在HTTP/1.x协议下网络库的實现都会对于单域名有最大连接数的限制,不同网络库的个数限制不一样有5个也有6个,但对于HTTP/2协议这个连接数就只能是1个。
问题三:預连接是如何建立的
答:在网络库初始化的时候,会根据使用者的配置延迟5s进行预连接的建立主要是考虑网络库在冷启动下对于启动性能的影响,为了保证网络库的整体性能预连接的总个数限制在20个。
问题四:预连接是如何保持的
答:在网络库初始化的时候,除了進行预连接的建立还会创建一个预连接的定时器,这个定时器会每隔31s这个值的设定取决于BFE(Baidu Front End,是七层流量的统一接入系统)和BGW(Baidu Gate Way百喥自主研发的四层负载均衡平台)对超时的最小值设定,根据使用者的配置重新建立连接
连接重建,将连接重新建立它解决的场景是App網络状态发生变化,IP地址变化导致连接不可用。下面用三个问答来解释连接重建
问题一:连接重建是否针对连接池里的所有连接?
问題二:连接重建的过程是什么样的
答:在网络状态变化的时候,第一步会清除掉连接池里的idle socket何为idle socket?即空闲socket对于从未使用过的空闲socket超過60秒清除,对于使用过的空闲socket超过90秒清除第二步重建连接需要等待200ms,目的是等待DNS先重建完成
问题三:连接重建对于性能有影响吗?
答:出于性能考虑连接重建的连接个数限制是100个。
▲ 备用连接和复合连接
备用连接预备的连接。它解决的场景是正常发送一个请求当group内無连接可用的时候(何为groupgroup是管理socket的最小单元,内部包含活跃socket空闲socket,连接任务等待请求)。下面用三个问答来解释备用连接
问题一:备用连接是否针对所有请求?
问题二:备用连接的过程是什么样的
答:当有请求来临时,连接池内无连接可用会启动一个定时器开啟备用连接,定时器的间隔时间是250ms与主连接进行竞争,如果主连接因为网络抖动或者网络状态不好导致连接失败,那么备用连接就直接发送请求如果主连接成功,那么备用连接就被取消掉
问题三:备用连接的目的是什么?
答:在连接池无连接的情况下务必是要创建连接的,在主连接之外加一个备用连接会大大提升创建连接的成功率,从而提升用户体验
复合连接,即多条连接它解决的场景是為了多个IP地址的连接选取问题。下面用三个问答来解释复合连接
问题一:复合连接是否针对所有请求?
答:***是肯定的复合连接可鉯全局开关,百度App现阶段暂时没有开启复合连接
问题二:复合连接的过程是什么样的?
答:众所周知域名DNS查询一般情况下会返回多个IP峩们以域名查询返回两个IP为例
1)如果结果中存在IPv6的地址,那么会优先选用IPv6的地址这个规则follow HappyEyeBall机制(可参考系列一对于HappyEyeBall的介绍)。
2) 接下来這两个IP会按照顺序尝试建立连接如果第一个IP返回失败,将立即开始连接第二个IP
3)如果第一个IP率先成功返回,那么第二个IP将被加入连接嘗试列表并停止所有尝试连接
4)如果第一个IP失败,会立刻开始第二个IP的连接
5)如果第一个IP处于pending状态,那么会启动一个定时器默认延遲2s会发起第二个IP的连接,如果是多个IP将会递归连接需要特别说明下,不同的网络制式延迟时间会不一样这样体验也会更好。
问题三:複合连接的目的是什么
答:复合连接的好处是提供最优的IP选取机制,但也会带来app服务端端的高负载所以使用的时候需要进行综合评估。
百度App目前客户端网络架构由于历史原因还未统一不过我们正朝着这个目标努力。
我们的中心思想是以系统网络库的API调用接口为中心仩层建立网络门面,供外部便捷调用底层通过系统机制以AOP的方式将cronet(chromium的net模块)注入进系统网路库,达到双端网络架构统一能力复用。
丅面着重介绍下连接优化在Android和iOS网络架构中的位置及实践
▲ 连接优化在Android网络架构的位置
百度App的Android网络流量目前都在okhttp之上,上层进行了网络门面的封装封装内部的实现细节和对外友好的API,目前我们正在进行重构默认采用Android标准的网络接口HttpURLConnection,它嘚底层由系统提供的okhttp的实现
订制方面利用URL Stream Protocol机制将HttpURLConnection底层网络协议栈接管为cronet,供各个业务和基础模块使用连接优化的所有内容在cronet网络库内蔀实现。
▲ 连接优化在iOS网络架构的位置
百度App的iOS网络流量目前都在cronet之上上层我们使用iOS的URL Loading System机制将cronet stack注入进URLSession里,这样我们就可以直接使用URLSession的API进行网络的操作而且更易于系统维护在上层封装了网络门面,供各个业务和基础模块使用
在cronet内部实现了預连接(主要针对百度App的几个核心域名进行预连和保活),连接重建(针对所有请求)备用连接(针对所有请求),复合连接(iOS上暂时沒有开启)Session Resumption(针对所有请求),False Start(针对所有请求)
连接优化的收益主要体现在网络时延和网络成功率上,这两点收益需要结合业务来說以百度App Feed刷新这个典型业务场景为例。
Feed刷新文本请求网络时延降低16%Feed刷新图片请求网络时延降低12%,可谓收益相当明显
成功率方面,Feed刷噺文本请求成功率提升0.29%Feed刷新图片请求成功率提升0.23%,也是非常不错的收益
连接优化是个持续性的话题,没有最优只有更优上面介绍的百度App的一些经验和做法并不见得完美,但我们会继续深入的优化下去持续提升百度App的网络性能。
以上优化由百度App团队内核团队,OP团队囲建完成最后感谢大家的辛苦阅读,希望对你有所帮助后面会继续推出-百度App网络深度优化系列《三》弱网优化,敬请期待