在 App 访问网络的时候, DNS 解析是网络请求的第一步, 默认我们使用运营商的 LocalDNS 服务. 有数据统计, 在这一块 3G 网络下, 耗时在 200~300ms,4G 网络下也需要 100ms.
本文转载自微信公众号「Android 开发编程」, 作者 Android 开发编程 . 转载本文请联系 Android 开发编程公众号.
前言小计
在 App 访问网络的时候, DNS 解析是网络请求的第一步, 默认我们使用运营商的 LocalDNS 服务. 有数据统计, 在这一块 3G 网络下, 耗时在 200~300ms,4G 网络下也需要 100ms.
解析慢, 并不是 LocalDNS 最大的问题, 它还存在一些更为严重的问题, 例如: DNS 劫持, DNS 调度不准确 (缓存, 转发, NAT) 导致性能退化等等, 这些才是网络优化最应该解决的问题.
想要优化 DNS, 现在最简单成熟的方案, 就是使用 HTTPDNS.
今天就来聊聊, DNS,HTTPDNS
一, 什么是 DNS
DNS(Domain Name System)是域名系统的英文缩写, 是一个组织的系统管理机构, 维护系统内的每一个主机的 ip 和主机名 (域名) 的对应关系;
DNS 即域名解析系统, 这个东西说对于开发者来说, 应该是没有不知道的. 说简单点, 这个系统的作用就是将域名解析成 IP 地址. 我们的每一次网络请求, 如果是使用域名, 那么就是进行域名解析;
一个优秀的域名服务应该能够满足两点要求, 一个是能够正确的返回 IP 地址, 二就是能够根据网络情况返回所请求的域名最近的服务器 IP;
二, DNS 域名结构
1,DNS 域名命名
每个域名都是一个标号序列, 用字母, 数字和连接符 (-) 组成;
标号序列总长度不能超过 255 字符, 每个标号都可以看成一个层次域名;
级别最低的域名写在左边, 级别最高的域名写在右边;
域名服务主要通过 UDP 实现, 服务器的端口为 53;
2, 域名的分级
域名可以划分为各个子域, 子域还可以继续划分为子域的子域, 这样就形成了顶级域名, 二级域名, 三级域名等;
顶级域名可以分为三大类:
国家顶级域名: cn,us,uk 等;
通用域名: 常见的有 7 个, com.NET,org,edu,int,gov,mil;
方向域名: arpa, 用于将 ip 地址转为域名;
域名服务器;
三, 域名解析过程
域名解析的重要两点:
主机向本地域名服务器查询一般都是采用递归查询. 所谓递归查询就是: 如果主机所查询的本地服务器不知道被查询的域名的 ip 地址, 那么本地域名服务器就以 DNS 客户的身份, 向其他根域名服务器继续发出查询请求报文(即代替主机继续查询), 而不是让主机自己进行下一步查询. 因此, 递归查询返回的查询结果或者是所要查询的 ip 地址, 或者是报错, 表示无法查询到所需的 ip 地址;
本地域名服务器向根域名服务器的查询是迭代查询. 所谓迭代查询就是: 当根域名服务器收到本地域名服务器发出的迭代查询请求报文时, 要么给出所查询的 ip 地址, 要么告诉本地服务器:"你下一步应当向哪一个域名服务器进行查询". 然后让本地域名服务器进行后续的查询. 根域名服务器通常是把自己知道的顶级域名服务器的 ip 地址告诉本地域名服务器, 让本地域名服务器再向顶级域名服务器查询. 顶级域名服务器在收到本地域名服务器的查询请求后, 要么给出所要查询的 ip 地址, 要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询. 最后, 知道了所要解析的 ip 地址或者报错, 然后把这个结果返回给发起查询的主机;
以上两点是域名解析的重要两步. 但是这并不是解析 ip 地址的完整过程, 如果浏览器的缓存中有该域名对应的 ip 地址, 就不需要向本地域名服务器请求了等等. 下面来看详细过程:
例如要解析: www.example.com 该域名的 ip 地址;
浏览器缓存: 当用户通过浏览器访问某域名时, 浏览器首先会在自己的缓存中查找是否有该域名对应的 ip 地址;
操作系统缓存: 当浏览器缓存中无域名对应 IP 则自动检查用户计算机系统 hosts 文件, 看是否有该域名对应的 ip 地址;
路由器缓存: 当浏览器及系统缓存中都没有域名对应 ip 地址, 则进入路由器缓存中检查. 以上三点都是客户端的 DNS 缓存;
ISP(网络服务提供商)的 LDNS(本地域名服务器): 如果上述三点都没有找到对应的地址, 就要本地域名服务器中进行查询. 比如你是电信的网, 则会进入电信的 DNS 缓存服务器进行查找;
根域名服务器: 本地域名服务器没有找到, 本地域名服务器就会到根域名进行查询. 全球仅有 13 台根域名服务器. 根域名服务器收到请求后, 会查看区域文件记录, 若无则将其管辖下的对应的顶级域名的 ip 地址, 这里返回. com 的地址;
顶级域名服务器: 根域名服务器没有, 则本地域名服务器向顶级域名服务器发送请求, 然后返回次级域名服务器的 ip 地址, 这里会返回. example 的地址;
主域名服务器: 主域名服务器接收请求后查询自己的缓存, 如果没有则进入下一级域名服务器进行查找, 并重复该步骤直至找到正确记录.
保存结果至缓存: 本地域名服务器把返回的结果保存到缓存, 以备下一次使用, 同时将该结果反馈给客户端, 客户端通过这个 ip 地址与 web 服务器建立连接;
四, DNS 安全和优化
1,dns 安全问题
DNS 反射 / 放大攻击;
DDOS 攻击可能造成域名解析瘫痪;
DNS / 域名劫持: 在劫持的网络范围内拦截域名解析的请求, 分析请求的域名, 返回假的 ip 地址或者使请求失去响应. DNS 劫持通过篡改 DNS 服务器上的数据返回给用户一个错误的查询结果来实现;
DNS 污染: DNS 污染是当用户发起域名解析请求时, 某个服务器 (非 DNS) 监控到用户访问的已经被标记的地址时, 该服务器伪装成 DNS 服务器向用户发回错误的地址;
DNS 污染与 DNS 劫持的区别: DNS 劫持修改了 dns 解析的结果, DNS 污染是不经过 DNS 服务器的, 而是直接返回了错误的地址;
DNS 信息被修改;
2,DNS 优化
DNS 解析是一个漫长的过程, 那么它的优化有哪些?
1, 网页端
用户在请求请求某个链接之前, 浏览器先尝试解析该链接的域名再将其进行缓存.
可以这样做:
(1) 在服务器中响应设置 X-DNS-Prefetch-Control 的值为 on 启动预解析
(2) 在 html 中,
来源: http://mobile.51cto.com/android-674906.htm