您当前的位置:首页 > 电脑百科 > 程序开发 > 移动端 > Android

Android网络优化篇-从DNS开始

时间:2019-07-31 16:37:40  来源:  作者:

什么是DNS

DNS是域名系统(DomainNameSystem)的缩写,该系统用于命名组织到域层次结构中的计算机和网络服务。域名是由圆点分开一串单词或缩写组成的,每一个域名都对应一个惟一的IP地址,在Internet上域名与IP地址之间是一一对应的,DNS就是进行域名解析的服务器。DNS命名用于Internet等TCP/IP网络中,通过用户友好的名称查找计算机和服务。DNS是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库。

当我们发起一个网络请求,首先要经过DNS服务,将域名转化为IP地址,然后通过IP地址建立连接。DNS的工作流程如下图所示。

Android网络优化篇-从DNS开始

 

Local DNS有什么缺陷

那么,传统的Local DNS有什么缺陷呢。就目前端上而言,主要有几个问题:

•Local DNS劫持

域名劫持是互联网攻击的一种方式,通过攻击域名解析服务器(DNS),或伪造域名解析服务器(DNS)的方法,把目标网站域名解析到错误的地址从而实现用户无法访问目标网站的目的。

DNS劫持示例图如下:

Android网络优化篇-从DNS开始

 

DNS劫持会导致端上网络连接失败或者DNS解析失败,严重影响用户使用,在之前,端上采用备用域名的机制去解决这个问题,但是效果并不是很好。

•DNS解析过慢

DNS解析分为递归查询和迭代查询两种。

递归查询:如果主机所询问的本地域名服务器不知道被查询域名的 IP 地址,那么本地域名服务器就以 DNS 客户的身份,向其他根域名服务器继续发出查询请求报文,而不是让该主机自己进行下一步的查询。

迭代查询:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的 IP 地址,要么告诉本地域名服务器:你下一步应当向哪一个域名服务器进行查询。然后让本地域名服务器进行后续的查询,而不是替本地域名服务器进行后续的查询。

由于递归模式会导致DNS服务器流量很大,所以现在大多数采用迭代模式。

由于端上网络环境的复杂性已经DNS解析的流程也较为复杂,有些场景下DNS解析时间高达几百毫秒,对于一次网络请求来说,是相当缓慢的。

什么是HttpDns

HTTPDNS 是面向移动开发者推出的一款域名解析产品,具有域名防劫持、精准调度等特性。

目前来说,腾讯和阿里都有自己的HTTPDNS解决方案。HTTPDNS有以下特性:

1.安全,由于httpdns使用http或者https协议通过ip直连的方式进行解析,绕过了运营商的Local DNS,避免了域名劫持

2.快速,通过预解析机制,将热点域名提前解析,网络连接时直接缓存获取

Android端HttpDns接入指南

在阿里云HTTPDNS文档中,有所谓的“最佳方案”,包含SNI场景、OkHttp场景等等,但是,这对于我们来说,接入量还是偏大,且覆盖的场景依然有限。如果我们想很简单的接入,且覆盖全量JAVA场景,如何做呢。首先,我们看一下Android侧DNS解析的调用流程,以API 28为例。

InetAddress#getAllByName()
 ->Inet6AddressImpl#lookupHostByName()
 ->Libcore.os.android_getaddrinfo()

而Libcore代码如下Libcore源码[1]:

public final class Libcore {
 private Libcore() { }
 /**
 * Direct access to syscalls. Code should strongly prefer using {@link #os}
 * unless it has a strong reason to bypass the helpful checks/guards that it
 * provides.
 */
 public static Os rawOs = new linux();
 /**
 * Access to syscalls with helpful checks/guards.
 */
 public static Os os = new BlockGuardOs(rawOs);
}

通过简单的代码跟踪可以发现,他们实现Os这个接口[2] ,接口?对哦,动态代理。是的,我们可以通过动态代理的方式,去hook掉Java层发起的DNS解析请求。

Android网络优化篇-从DNS开始

 


Android网络优化篇-从DNS开始

 

上面的代码,已经开源在KIDDNS-Android[3]

下期预告

Android P hide API的问题相信困扰了不少同学,那么下期,咱们一起了解下如何在Android P上使用hide API!

References

[1] Libcore源码: https://android.googlesource.com/platform/libcore/+/refs/tags/android-9.0.0_r35/luni/src/main/java/libcore/io/Libcore.java

[2] Os这个接口: https://android.googlesource.com/platform/libcore/+/refs/tags/android-9.0.0_r35/luni/src/main/java/libcore/io/Os.java

[3] KIDDNS-Android: https://github.com/VIPKID-OpenSource/KIDDNS-Android



Tags:Android 网络优化   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
什么是DNSDNS是域名系统(DomainNameSystem)的缩写,该系统用于命名组织到域层次结构中的计算机和网络服务。域名是由圆点分开一串单词或缩写组成的,每一个域名都对应一个惟一的...【详细内容】
2019-07-31  Tags: Android 网络优化  点击:(498)  评论:(0)  加入收藏
▌简易百科推荐
今天面试遇到同学说做过内存优化,于是我一般都会问那 Bitmap 的像素内存存在哪?大多数同学都回答在 java heap 里面,就比较尴尬,理论上你做内存优化,如果连图片这个内存大户内存...【详细内容】
2021-12-23  像程序那样思考    Tags:Android开发   点击:(8)  评论:(0)  加入收藏
Android logcat日志封装logcat痛点在Android开发中使用logcat非常频繁,logcat能帮我们定位问题,但是在日常使用中发现每次使用都需要传递tag,并且会遇到输出频率很高的log,在多...【详细内容】
2021-12-22  YuCoding    Tags:Android   点击:(8)  评论:(0)  加入收藏
对项目的基本介绍 1.整个框架主要是给MVVM框架使用的,自己写完interface接口后,通过自定义的注解就能自动生成接口方法 2.用Kotlin的Flow去代替Rxjava,因为我发现RxJava功能很...【详细内容】
2021-12-08  网易Leo    Tags:Android开发   点击:(17)  评论:(0)  加入收藏
前言在Android开发过程中,有些时候会根据需要引用别的项目到当前项目里面,而且以Module形式引用。所以本篇博文就来分享一下怎么以Module形式引用别的项目到当前项目中,方便开...【详细内容】
2021-12-07  网易Leo    Tags:Android开发   点击:(22)  评论:(0)  加入收藏
作者:fundroid这篇文章偏阅读一些,大家可以了解下 Android 的一些最新动向。每年9/10月份 Google 都会举行约为期2天的 Android Dev Summit,在活动上 Google 的技术专家们会分...【详细内容】
2021-11-30  像程序那样思考    Tags:Android开发   点击:(15)  评论:(0)  加入收藏
一、 准备工作1、安装JDK,下载地址(可能需要一个oracle账号,大家百度一下或者自行注册一个就行。尽可能选择8或者11,这两个是长期版本)Java SE | Oracle Technology Network | Or...【详细内容】
2021-11-23  永沧    Tags:Android   点击:(28)  评论:(0)  加入收藏
使用Maven Publish Plugin插件。(官方支持)一、在Library的build.gradle中配置plugins { id 'com.android.library' id 'kotlin-android' id 'k...【详细内容】
2021-11-05  羊城小阳    Tags:Android   点击:(37)  评论:(0)  加入收藏
谷歌离推出Play Store应用程序的新数据隐私部分又近了一步。应用程序开发人员现在可以通过谷歌在Play控制台的新 "数据安全表 "填写相关细节。该公司表示,所需信息将从2022年...【详细内容】
2021-10-20    中关村在线  Tags:安卓   点击:(58)  评论:(0)  加入收藏
架构究竟是什么?如何更好的理解架构?我们知道一个APP通常是由class组成,而这些class之间如何组合,相互之间又如何产生作用,就是影响这个APP的关键点。细分的话我们可以将其分为类...【详细内容】
2021-09-17  像程序那样思考    Tags:Android架构   点击:(52)  评论:(0)  加入收藏
概述当Android应用程序需要访问设备上的敏感资源时,应用程序开发人员会使用权限模型。虽然该模型使用起来非常简单,但开发人员在使用权限时容易出错,从而导致安全漏洞。本文中,...【详细内容】
2021-09-07  SecTr安全团队    Tags:Android开发   点击:(66)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条