​什么是DNS

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

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

Local DNS有什么缺陷

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

•Local DNS劫持

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

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解析请求。

上面的代码,已经开源在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

android studio dns问题_Android网络优化篇-从DNS开始相关推荐

  1. android studio的安装(补充篇gradle失败的问题更新于 2021-03-10)

    本来没有打算写这篇文章的 但是很多人看完我的上篇文章之后有所需求 特此写下此文 (加我好友问最下面出现的问题,一律不再回答) 附上上篇android studio的安装,史上最详细(超多图)!! 先说 ...

  2. android 开发工具篇之android studio(二)使用篇

    android studio的使用 上一篇文章讲解了android studio的基本安装.( 说明,由于现在市面上的各种安装,使用等等很多.大部分也比较详细,但同时也显得过于啰嗦,我的博客基本都是偏 ...

  3. android 滑动取值_Android View篇之调整字体大小滑杆的实现

    小伙伴们大家好呀,这次介绍一个稍微有点意思的View,在很多阅读类.新闻类的APP上都标配的字体大小调整功能.100多行代码就可以实现,来看看效果吧! 思路分析 1.刻度线代表着每个字体的大小取值,是 ...

  4. Android Studio 之 NDK篇

    由于工作内容的关系,对于NDK的工作涉及比较广(保密性,安全性),所以本章内容讲述一下NDK的基本使用过程. 网上也有很多这样的教程或者描述,但描述的并不完全 开发工具:Android Studio ...

  5. 【Android Studio】Android Studio 搭建开发环境(Linux Ubuntu篇)

    Windows篇:[Android Studio]Android Studio 搭建开发环境(Windows篇)_dandelionela的博客-CSDN博客 Ubuntu篇参考: Ubuntu 18 ...

  6. The powerful Android Studio

    英文来源: The powerful Android Studio 作者: Saúl Molinero(@saulmm),感谢作者对本篇文章的翻译授权. 译者: D_clock爱吃葱花 校对: 汤涛( ...

  7. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库到 Android Studio 工程 | 配置 build.gradle 构建脚本 )

    文章目录 一.拷贝 lib7zr.so 动态库到 Android Studio 工程 二.配置 Module 下的 build.gradle 构建脚本 三.参考资料 一.拷贝 lib7zr.so 动态 ...

  8. 拥抱 Android Studio 之五:Gradle 插件开发

    实践出真知 笔者有位朋友.每次新学一门语言,都会用来写一个贪吃蛇游戏,以此来检验自己学习的成果.笔者也有相似体会.所谓纸上得来终觉浅,绝知此事要躬行.这一章.笔者将以开发和公布一个 Gradle 插件 ...

  9. linux下tools.jar,Linux android studio :'tools.jar' seems to be not in Android Studio classpath.

    问题: 'tools.jar' seems to be not in Android Studio classpath. Please ensure JAVA_HOME points to JDK r ...

最新文章

  1. python装饰器原理-深入理解 Python 装饰器
  2. Python的zip
  3. java环境用openoffice转pdf
  4. (赞助5本)谷歌官方推荐的 TensorFlow 2 “豹书”来了!
  5. 组件切换方式(Vue.js)
  6. java实验文法报告_西安邮电大学编译原理LL文法分析器实验(java).doc
  7. 深入浅出SharePoint2010——附录:常用术语对照
  8. c语言cis,c语言小白学习历程第五篇
  9. Spring从入门到入土——Bean的作用域与生命周期
  10. 52 - 算法 - LeetCode 20 数据结构类 stack
  11. 常用的字符串分割方法
  12. 从零基础入门Tensorflow2.0 ----六、31 kaggle 10 monkeys模型微调
  13. 我与Bootstrap
  14. 电脑硬件知识大扫盲:主板知识大全
  15. 移动端车牌识别,小功能大作用
  16. JAVA垃圾回收机制
  17. 模拟器安装 xposed
  18. An Attention-based Graph Neural Network for Heterogeneous Structural Learning
  19. 【Inpho精品教程】任务二:Inpho创建工程(创建项目、新建相机参数、导入照片、导入POS、生成航条、保存项目)
  20. gRPC-proto文件写法

热门文章

  1. Linux修改本地时间
  2. 【Java每日一题】20161019
  3. 以写代学:python shutil模块
  4. linux 卸载、安装mysql
  5. 数据解析1:XML解析(1)
  6. 让ubuntu使用root帐号并让winscp以root身份登录
  7. android关于window
  8. SQL2005学习(十六),SQL小知识点
  9. 16、document的_source元数据以及定制返回结果解析
  10. linux redis 数据迁移,redis cluster 迁移数据