1、前言
网络优化是客户端几大技术方向中公认的一个深度行业,因此百度App给大众带来网络深度优化系列文案,其中包括系列《一》DNS优化,系列《二》连接优化,系列《三》弱网优化,期盼对大众在网络方向的学习和实践有所帮忙。
百度起家于搜索,全部机构的网络架构和安排都是基于标准的internet协议,日前已然是全栈HTTPS,来到移动互联网时代后,总的基本架构不变,但在客户端上需要做非常多优化工作。
DNS(Domain Name System),它的功效是按照域名查出IP位置,它是HTTP协议的前提,仅有将域名正确的解析成IP位置后,后面的HTTP流程才可进行,因此通常做网络优化会首选优化DNS。
版权说明:原创: 蔡锐 百度App技术 2018-12-26,如有侵权联系删除,仅作学习记录之用
2、背景
DNS优化核心需要处理的问题有两点:
【1】因为DNS劫持或故障导致的服务不可用,从而影响用户体验,影响机构的收入。
【2】因为DNS调度不准确引起的性能退化,从而影响用户体验。
百度App承载着亿级流量,每年都会遇到运营商DNS劫持或运营商DNS故障,整体影响非常欠好,因此DNS优化刻不容缓,经过下图会更直观的认识运营商劫持或故障的原理。
运营商劫持或故障的原理
3、HTTPDNS
既然咱们面临这么严峻的问题,那样咱们怎样优化DNS呢?答案便是HTTPDNS。
大部分标准DNS都是基于UDP与DNS服务器交互的,HTTPDNS则是利用HTTP协议与DNS服务器交互,绕开了运营商的Local DNS服务,有效防止了域名劫持,加强域名解析效率,下图是HTTPDNS的原理。
HTTPDNS原理
百度App HTTPDNS端上的实现是基于百度SYS团队的HTTPDNS服务,下图介绍了HTTPDNS的服务端安排结构。
HTTPDNS安排结构
HTTPDNS服务是基于BGP接入的,BGP英文Border Gateway Protocol,即边界网关协议,是一种在自治系统之间动态的交换路由信息的路由协议,BGP能够按照当前用户的运营商路由到百度服务点的对应集群上,针对第三方域名,服务点会经过百度安排在运营商的CDN节点向其他域名权威DNS发起查找,查找这个运营商下域名的最优IP。
百度App独立实现了端的HTTPDNS SDK,下图介绍了端HTTPDNS的整体架构。
端HTTPDNS的整体架构
DNS接口层:
DNS接口层处理的问题是屏蔽底层的细节,对外供给简单整洁的API,降低运用者的上手成本,加强研发效率。
DNS策略层:
DNS策略层经过多种策略的组合,使HTTPDNS服务在性能,稳定性,可用性上均保持较高的水准,下面讲解下每一个策略设计的初衷和详细实现。
1.容灾策略
这是一个非常关键的策略,重点处理HTTPDNS服务可用性的问题,实践证明,这个策略帮忙百度App在反常状况下挽救回非常多流量。
【1】当HTTPDNS服务不可用并且本地亦无缓存或缓存失效的时候,会触发降级策略,降级成运营商的localDNS方法,虽然存在运营商事故或劫持的危害,但保证了DNS服务的可用性。
【2】当HTTPDNS服务和localDNS服务双双不可用的状况下,会触发backup策略,运用端上的backup IP。
什么是backup IP?backup IP是多组按照域名归类的IP列表,可云端动态更新,方便后续运维朋友调节服务端的节点IP,不是所有域名都有对应的backup IP列表,日前百度App只能保准核心域名的可用性。
既然是一组IP,便有选择问题,backup IP选择机制是怎么样的呢?咱们的中心思想便是要在端上利用最小的代价,并且思虑服务端的负载平衡,得到相对正确或恰当的选择结果。经过运营商和地理信息,能够选取一个相对较优的IP,但获取地理信息需要很大耗时,外加频次很高,代价很大,因此咱们选取了RR算法来代替上面的办法(RR算法是Round-Robin,轮询调度),这般客户端的代价降低到最小,服务端亦实现了负载平衡。
2.安全策略
【1】HTTPDNS处理的核心问题便是安全,标准的DNS查找大部分是基于UDP的,但亦有基于TCP的,倘若UDP被封禁,就需要运用TCP。不管是UDP还是TCP,安全性都是无保证的,HTTPDNS查找是基于标准的HTTP协议,为了保准安全咱们会在HTTP上加一层TLS(安全传输层协议),这便是HTTPS。
【2】处理了传输层协议的安全性后,咱们要处理下域名解析的问题,上面咱们说到HTTPDNS服务是基于BGP接入的,在端上采用VIP方式请求HTTPDNS数据(VIP即Virtual IP,VIP并无与某设备存在必定的绑定关系,会跟随主备切换之类的状况出现而变换,VIP供给的服务是对应到某一台或若干台服务器的),既然请求原始数据需要运用IP直连的方式,那样就摆脱了运营商localDNS的解析限制,这般即使运营商显现了故障或被劫持,都不会影响百度App的可用性。
3.任务调度策略
HTTPDNS服务供给了两类HTTP接口,用于请求最优域名结果。第1种是多域名接口,针对区别的制品线,下发制品线配置的域名,第二种是单域名接口,只返回你要查找的那个域名结果,这般的设计和标准的DNS查找基本是同样的,只不外是从UDP协议变成为了HTTP协议。
【1】多域名接口会在App冷起步和网络切换的时候请求一次,目的是在App的网络环境初始化或变化的时候预先获取域名结果,这般亦会减少单域名接口的请求次数。
【2】单域名接口会在本地cache过期后,由用户的操作触发网络请求,从而做一次单域名请求,用户这次操作的DNS结果会降级成localDNS的结果,但在无过期的状况下,下次会返回HTTPDNS的结果。
4.IP选择策略
IP选择策略处理的核心问题是最优IP的选择,避免由于接入点的选择错误导致的跨运营商耗时。HTTPDNS服务会将最优IP根据次序下发,客户端默认选择第1个,这儿无做客户端的连通性校验的原由,重点还是担心端上的性能问题,不外有容灾策略兜底,综合评定还是能够接受的。
5.缓存策略
大众针对DNS缓存并不陌生,它重点是为了提高拜访效率,操作系统,网络库等都会做DNS缓存。
DNS缓存中一个重要的概念便是TTL(Time-To-Live),在localDNS中针对区别的域名,TTL的时间是不同样的,在HTTPDNS中这个值由服务端动态下发,百度App日前所有的域名TTL的配置是5分钟,过期后倘若无新的IP将继续沿用老的IP,当然亦能够选取不沿用老的IP,而降级成localDNS的IP,那样这就取决于localDNS针对过期IP的处理。
6.命中率策略
倘若HTTPDNS的命中率是100%,在保准HTTPDNS服务稳定有效的前提下,咱们就能够做到防劫持,提高精细调度的能力。
【1】为了提高HTTPDNS的命中率,咱们选取运用多域名接口,在冷起步和网络切换的时候,批量拉取域名结果并缓存在本地,便于接下来的请求运用。
【2】为了再一次提高HTTPDNS的命中率,当用户操作触发网络请求,获取域名对应的IP时,会提前进行本地过期时间判断,时间是60s,倘若过期,会发起单域名的请求并缓存起来,这般会连续延长域名结果的过期时间。本地过期时间与上面说到的TTL是客户端和服务端的双重过期时间,目的是在反常状况下能够双重保准过期时间的准确性。
基本能力层:
基本能力层重点供给给DNS策略层所需要的基本能力,包含IPv4/IPv6协议栈探测的能力,数据传输的能力,缓存实现的能力,下面将讲解每种能力的详细实现
1.IPv4/IPv6协议栈探测:
百度App的IPv6改造正在如火如荼的进行中,端上在HTTPDNS的IP选择上怎样晓得日前属于哪个协议栈作为关键性问题,并且这种判断需求性能极高,由于IP选择的频次实在是太高了。
咱们选择的方法是UDP Connect,那样何为UDP Connect?大众都晓得TCP是面向连接的,传输数据前客户端都要调用connect办法经过三次握手创立连接,UDP是面向无连接的,无需创立连接便能收发数据,然则倘若咱们调用了UDP的connect办法会出现什么呢?当咱们调用UDP的connect办法时,系统会检测其端口是不是可用,位置是不是正确,而后记录对端的IP位置和端口号,返回给调用者,因此UDP Connect不会像TCP Connect发起三次握手,出现网络真实损耗,UDP客户端仅有调用send或sendto办法后才会真正发起真实网络损耗。
UDP Connect原理
有了UDP Connect的基本保证,咱们在上层做了缓存机制,用来减少系统调用的损耗,机会上日前仅在冷起步和网络切换会触发探测,在同一种网络制式下探测一次基本能够保证当前网络是IPv4栈还是IPv6栈。
日前百度App客户端针对IPv4/IPv6双栈的策略是保守的,仅在IPv6-only的状况下运用v6的IP,其余运用的都是v4的IP,双栈下的方法后续需要优化,业内日前标准的做法是happy eyeball算法,什么叫happy eyeball呢?便是不会由于IPv4或IPv6的故障问题,引起用户的眼球始终在等待加载或出错,这便是happy eyeball名字的由来。happy eyeball有v1版本RFC6555和v2版本RFC8305,前者是Cisco提出来的,后者是苹果提出来的。happy eyeball处理的核心问题是,繁杂环境下v4和v6 IP选择的问题,它是一套整体处理方法,针对域名查找的处理,位置的排序,连接的尝试等方面均做出了规定,感兴趣的朋友能够查看参考资料里的【5】和【6】。
2.数据传输:
数据传输重点供给网络请求的能力和数据解析的能力。
【1】网络请求失败重试的机制,获取HTTPDNS结果的成功率会大大影响HTTPDNS的命中率,因此客户端会有一个三次重试的机制,保证成功率。
【2】数据解析反常的机制,倘若获取的HTTPDNS的结果存在反常,将不会覆盖端上的缓存。
3.缓存实现:
缓存的实现基本能够分为磁盘缓存和内存缓存,针对HTTPDNS的缓存场景,咱们是选其一还是都选取呢?百度App选取的是内存缓存,目的是防止咱们自己的服务显现问题,运维朋友在紧急情况下切换流量,倘若做了磁盘缓存,会引起百度App在重启后亦可能不可用,但这种问题会引起APP在冷起步时期,HTTPDNS结果未返回前,还是存在故障或劫持的危害,综合评定来看能够接受,倘若显现这种极端状况,影响的是冷起步周期的有些请求,但只要HTTPDNS结果返回后便会恢复正常。
4、HTTPDNS的最佳实践
百度App日前客户端网络架构因为历史原由还未统一,不外咱们正朝着这个目的奋斗,下面着重介绍下HTTPDNS在Android和iOS网络架构中的位置及实践。
HTTPDNS在Android网络架构的位置及实践
百度App的Android网络流量都在okhttp之上,上层进行了网络门面的封装,封装内部的实现细节和对外友好的API,供各个业务和基本模块运用,在okhttp上咱们扩展了DNS模块,运用HTTPDNS替换了原有的系统DNS。
HTTPDNS在Android网络架构的位置
HTTPDNS在iOS网络架构的位置及实践
百度App的iOS网络流量都在cronet(chromium的net模块)之上,上层咱们运用AOP的方式将cronet stack注入进URLSession里,这般咱们就能够直接运用URLSession的API进行网络的操作况且更易于系统守护,在上层封装了网络门面,供各个业务和基本模块运用,在cronet内部咱们修改了DNS模块,除了原有的系统DNS规律外,还添加了HTTPDNS的规律。iOS上还有一部分流量是在原生URLSession上,重点是有些第三方业务无运用cronet但还想单独运用HTTPDNS的能力,因此就有了下面的HTTPDNS封装层,办法是在上层直接将域名替换成IP,域名针对底层非常多机制是至关重要的,例如https校验,cookie,重定向,SNI(Server Name Indication)等,因此将域名修改成为了IP直连后,咱们又处理了以上三种状况,保准请求的可用性。
HTTPDNS在iOS网络架构的位置
5、收益
DNS优化的收益重点有两点,一是防止DNS的劫持(在出问题时显出尤为重要),降低网络时延(在调度不准确的状况下,会增大网络的时延,降低用户的体验),这两点收益需要结合业务来讲,以百度App Feed业务为例,第1点上咱们取得了比很强的效果,iOS劫持率由0.12%降低到0.0002%,Android劫持率由0.25%降低到0.05%,第二点的收益不显著,原由在于Feed业务重点目的群体在国内,百度在国内节点布局相对丰富,服务整体质量亦较高,即使显现调度不准确的状况,差值亦不会太大,但倘若在国外状况可能会差非常多。
6、结语
DNS优化是个连续性的专题,上面介绍的百度App的有些经验和做法并不见得完美,但咱们会连续深入的优化下去,为百度App的DNS能力保驾护航。最后感谢大众的辛苦阅读,期盼对你有所帮忙,后面会继续推出-百度App网络深度优化系列《二》连接优化,敬请期待。
7、个人心得
做为一个工程师,怎样才可做好网络优化这件事情,是个值得咱们交流探讨的专题,个人认为应该从以下五方面入手。
【1】基本知识要认识学习,要夯实,网络关联的内容非常多,很杂,很难学习,啃过IETF发布的RFC的朋友应该深有感触。
【2】学会将看不见的网络变成看得见的,非常多自认为针对网络很认识的朋友,动不动就背诵tcp协议原理,拥塞掌控算法,滑动窗口体积等,但真正遇到线上问题,无从下手。针对客户端朋友,咱们在PC上要学会运用tcpdump和Wireshark等工具,适当运用Fiddler和Charles等工具,非常多时候电脑和手机的网络环境不见得一致,因此要在手机上运用iNetTools,Ping&DNS或终端工具。学会运用工具后,要学着创造区别的网络环境,有非常多工具能帮忙你完成这点,例如苹果的Network Link Conditioner,FaceBook的ATC(Augmented Traffic Control)等。具备以上两个场景后,你的第一条贮存就发挥了功效,你要能看懂握手过程,传输过程,反常断开过程等。
【3】有了以上两点的准备,接下来需要一个会显现各样网络问题的平台,给你累积经验,让一个个高压下的线上问题锤炼你,熬煎你。
【4】网络优化是需要数据支撑的,但数据的采集和分析是需要经验的,有些数据一眼看下去便是不可靠的,有些数据怎么分析都是负向收益的,通常来讲是有三重奏来对数据进行分析的,一,线下数据的采集和分析,得出正向收益,二,灰度数据的采集和分析,得出正向收益,三,线上数据的采集和分析,得出正向收益。
【5】数据的正向收益,不可完全证明提高了用户的体验,因此非常多时候需要针对特定场景,特定case来分析和优化,就算是大众公认做的很好的微X,亦不是在所有场景下都能保准体验上的最佳。
8、参考资料
https://chromium.googlesource.com/chromium/src/+/HEAD/docs/android_build_instructions.mdhttps://chromium.googlesource.com/chromium/src/+/HEAD/docs/ios/build_instructions.mdhttps://github.com/Tencent/marshttps://tools.ietf.org/html/rfc7858https://tools.ietf.org/html/rfc6555https://tools.ietf.org/html/rfc8305
版权再次声明:原创: 蔡锐 百度App技术 2018-12-26
热爱百度,热爱百度技术,博主爱好这篇文案,因此转载了,更想和广大研发者一块分享。文案来自于微X公众号:百度App技术。如有侵权,联系删除,无任何商场目的。
大众爱好的话后面还会分享更加多系列,请大众关注