Date Tags 网络

本文为学习笔记,并非原创。原文链接,原文发表于2019-11-05

背景

移动场景下DNS解析开销是整个网络请求中不可忽略的一部分。在弱网环境下,基于UDP的LocalDNS解析非常容易出现解析超时的问题,并且即使解析成功会消耗数百毫秒乃至更甚。

DNS

iOS 10之后,apple提供的原生HTTP请求方法能返回HTTP请求各个阶段的时间指标,其中就包含DNS解析时间。

iOS-10-HTTP-phases

DNS相关概念

DNS是一种分层结构,在整个互联网中组成一个树状系统,顶层是系统的根域名,下层为TLD以及二级域名,叶子就构成了所谓的FQDN(Fully Qualified Domain Names),根域名通常使用"."来表示,其实际上也是由域名组成,全世界目前有13组域名根节点,由少数几个国家进行管理,而国内仅有几台根节点镜像。

DNS-level

权威DNS:权威DNS是经过上一级授权对域名进行解析的服务器,同时它可以把解析授权转授给其他人,如COM顶级服务器可以授权xxorg.com这个域名的的权威服务器为NS.ABC.COM,同时NS.ABC.COM还可以把授权转授给NS.DDD.COM,这样NS.DDD.COM就成了ABC.COM实际上的权威服务器了。平时我们解析域名的结果都源自权威DNS。

递归DNS:又称为Local DNS,它没有域名解析结果的决定权,但代理了用户向权威DNS获取域名解析结果的过程。递归DNS上有缓存模块,当目标域名存在缓存解析结果并且TTL未过期时(每个域名都有TTL时间,即有效生存时间,若域名解析结果缓存的时间超过TTL,需要重新向权威DNS获取解析结果),递归DNS会返回缓存结果,否则,递归DNS会一级一级地查询各个层级域名的权威DNS直至获取最终完整域名的解析结果。eg: 我们自己的电脑,运营商提供的dns服务器等等。

公共DNS:是递归DNS的一种特例,它是一种全网开放的递归DNS服务,而传统的递归DNS信息一般由运营商分发给用户。一些公共DNS:

运营商 anycast 官网 DNS
南京信风公共DNS 南京、济南、芝加哥 www.114dns.com 114.114.114..114
114.114.115.115
阿里云公共DNS 成都、深圳、杭州 http://www.alidns.com 233.5.5.5 233.6.6.6

转发DNS:可以理解为递归DNS和用户之间的一个中转站,它不提供直接解析域名的服务,它将请求转发给递归DNS,然后将递归DNS的结果转发一下,也提供缓存作用。比如,日常家用的路由器,它的DNS服务器一般都是192.168.1.1,只是转发给递归DNS。

域名解析记录方式

  • A记录:A代表Address,用来指定域名对应的IP,例如将www.hello.com指定到113.112.3.xxx, A记录可以将多个域名解析到一个IP地址,但是不能讲一个域名解析到多个IP地址。
  • MIX记录:Mail Exchange,就是可以将某个域名下的邮件服务器直线给自己的Mail Server。
  • CNAME记录:Canonical Name,即别名解析。所谓别名解析就是可以为一个域名设置一个或者多个别名,如将aaa.com解析到bbb.net、将ccc.com也解析到bbb.net,其中bbb.net分别是aaa.com和ccc.com的别名。
  • NS记录:为某个域名指定DNS解析服务器,也就是这个域名由指定的IP地址的DNS服务器解析。
  • TXT记录:为某个主机名或域名设置说明,如可以为ucloud.cn是指TXT记录为“中立安全科信赖”这样的说明。

域名解析过程

domain-name-resolve-process

全局负载均衡GSLB

GSLB是Global Server load Blance的缩写,即全局负载均衡。目的是实现互联网上不同地域的服务器间的流量调配,保证使用户的请求能被离用户最近或者服务质量更好的服务器来处理。从而确保服务质量。

能通过判断服务器的负载,包括CPU占用、带宽占用等数据,决定服务器的可用性,同时能判断用户(访问者)与服务器间的链路状况,选择链路状况最好的服务器。因此GSLB是对服务器和链路进行综合判断来决定由哪个地点的服务器来提供服务,实现异地服务器群服务质量的保证

GSLB

DNS解析存在的问题

运营商劫持

DNS劫持 就是通过劫持了 DNS 服务器,通过某些手段取得某域名的解析记录控制权,进而修改此域名的解析结果,导致对该域名的访问由原 IP 地址转入到修改后的指定 IP,其结果就是对特定的网址不能访问或访问的是假网址,从而实现窃取资料或者破坏原有正常服务的目的。

DNS解析域名时缓存解析结果

LocalDNS没有及时更新,这样导致用户访问不到服务器。

转发解析

你用手机访问baidu.com时,会到当前运营商的DNS服务器查,然后运营商的DNS服务再去百度权威服务器去查,最终把权威服务器中的正确IP返回。

上面是正常的情况,但是如果当前运营商(比如联通)的LocalDNS不访问百度权威DNS服务器,而是直接访问了其它运营商(比如电信)的LocalDNS服务器,有些小的运营商就是通过这样做来降低成本。如果电信的LocalDNS对非自家ip的访问限了速那么很明显会影响你的DNS解析时间。

HTTPDNS

HTTPDNS使用HTTP与DNS服务器交互,代替传统的基于UDP的DNS协议,域名解析请求直接发送到HTTPDNS服务端,从而绕过运营商的Local DNS

HTTPDNS的特性

防止域名劫持

由于 HTTPDNS 是通过 IP 直接请求 HTTP 获取服务器 A 记录地址,不存在向本地运营商询问 domain 解析过程,所以从根本避免了劫持问题。

精准调度

HTTPDNS能够直接获取到用户的IP地址,从而实现精确定位与导流。

用户连接失败率下降

通过算法降低以往失败率过高的服务器排序,通过时间近期访问过的数据提高服务器排序,通过历史访问成功记录提高服务器排序。

HTTPS IP Content

发送HTTPS请求首先要进行SSL/TLS握手,握手过程大致如下:

  1. 客户端发起握手请求,携带随机数、支持算法列表等参数。
  2. 服务端收到请求,选择合适的算法,下发证书和随机数。
  3. 客户端对服务端证书进行校验,并发送随机数信息,该信息使用公钥加密。
  4. 服务端通过私钥获取随机数信息。
  5. 双方根据以上交互的信息生成session ticket,用作该连接后续数据传输的加密密钥。

上述过程中,和HTTPDNS有关的是第3步,客户端需要验证服务端下发的证书,验证过程有以下两个要点:

  1. 客户端用本地保存的根证书解开证书链,确认服务端下发的证书是由可信任的机构颁发的。
  2. 客户端需要检查证书的domain域和扩展域,看是否包含本次请求的host。

一些问题

主机是如何知道DNS服务器地的IP地址的?

通过DHCP动态获得,或者手工配置的。

为什么DNS采用UDP协议 ?

TCP通信过程太复杂并且开销大,一次TCP交换需要9个包: 三个连接包,四个断开包,一个request包,一个响应包。


Comments

comments powered by Disqus