DNS&&HTTPDNS

域名

域名是全球唯一的,需要通过专门的域名注册商才可以申请注册。为了组织全球互联网中的众多计算机,域名同样用点来分开,形成一个分层的结构。而每个被点分割开的字符串,就构成了域名中的一个层级,并且位置越靠后,层级越高。

以time.geekbang.org 为例,来理解域名的含义。
这个字符串中,最后面的 org 是顶级域名,中间的 geekbang 是二级域名,而最左边的 time 则是三级域名。
所有域名都以点作为后缀,也可以理解为,在域名解析的过程中,所有域名都以点结束。



DNS解析

几种DNS服务器:

  1. 本地 DNS服务器:
    如果是通过 DHCP 配置,本地 DNS 由你的网络服务商(ISP),如电信、移动等自动分配,它通常就在你网络服务商的某个机房
  2. 根 DNS 服务器 :
    持有所有顶级域(.cn/.com/.org.....)DNS服务器地址,并返回对应服务器
  3. 顶级域 DNS 服务器:
    持有所有下属权威域(dex.org/geekbang.org.....)DNS服务器地址,并返回对应服务器
  4. 权威 DNS 服务器:
    持有所属域名(www.geekbang.org/time.geekbang.org....)主机ip,并返回对应ip地址

以查询time.geekbang.org对应ip地址为例:


dig +trace +nodnssec

也可以用更加详细的命令,查看整个流程:

dig +trace +nodnssec 域名

本地host解析

可以把主机名和 IP 地址的映射关系,写入本机的 /etc/hosts 文件中

$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain
::1         localhost6 localhost6.localdomain6
192.168.0.100 domain.com

内网DNS解析

搭建自定义的 DNS 服务器,专门用来解析内网中的域名。而内网 DNS 服务器,一般还会设置一个或多个上游 DNS 服务器,用来解析外网的域名


DNS的传输

DNS 协议在 TCP/IP 栈中属于应用层,不过实际传输还是基于 UDP 或者 TCP 协议(UDP 居多) ,并且域名服务器一般监听在端口 53 上。

为什么DNS使用UDP而不是TCP?

由于TCP三次握手的规则限制,采用UDP传输,DNS域名解析时间更小。
再加上多级域服务器的递归查询,三次握手的耗时会被更加放大。


传统 DNS 存在的问题

  1. 域名缓存问题
    不是每一个请求,它都会去访问权威 DNS 服务器,而是访问过一次就把结果缓存到自己本地用于之后的查询。
    一旦想要访问的ip地址发生变化(负载均衡,页面更新),可能就无法返回最新、最高效的ip地址了

  2. 域名转发问题
    比如NAT,会影响权威服务器对于请求源的地址判断,可能返回一个跨运营商的ip地址。

  3. 域名更新
    本地 DNS 服务器是由不同地区、不同运营商独立部署的。对域名解析缓存的处理上,实现策略也有区别,有快有慢。
    在负载均衡和触发容灾时,权威 DNS更新速度决定有多少用户会出现访问异常。

  4. 解析延迟问题
    DNS 的查询过程需要递归遍历多个 DNS 服务器,才能获得最终的解析结果。


HttpDNS

HttpDNS不走传统的 DNS 解析,而是自己搭建基于 HTTP 协议的 DNS 服务器集群,分布在多个地点和多个运营商。当客户端需要 DNS 解析的时候,直接通过 HTTP 协议进行请求这个服务器集群。
使用 HttpDNS 的,往往是手机应用,需要在手机端嵌入支持 HttpDNS 的客户端 SDK。

工作流程

在客户端的 SDK 里动态请求服务端,获取 HttpDNS 服务器的 IP 列表,缓存到本地。随着不断地解析域名,SDK 也会在本地缓存 DNS 域名解析的结果。
当手机应用要访问一个地址的时候,首先看是否有本地的缓存,如果有就直接返回。这个缓存和本地 DNS 的缓存不一样的是,这个是手机应用自己做的,而非整个运营商统一做的。如何更新、何时更新,手机应用的客户端可以和服务器协调来做这件事情。
如果本地没有,就需要请求 HttpDNS 的服务器,在本地 HttpDNS 服务器的 IP 列表中,选择一个发出 HTTP 的请求,会返回一个要访问的网站的 IP 列表。

HttpDNS即使使用Http,也比使用UDP的传统DNS要快

HttpDNS服务端不会使用递归的方式依次通过根域名、顶级域名、权威域名去递归查询,而是直接返回目标IP。

鸡生蛋还是蛋生鸡

HttpDNS服务器的地址一般不变 可以使用DNS的方式获取HttpDNS服务器的ip地址 也可以直接把HttpDNS服务器的ip地址写死在客户端中。


HTTP与DNS的关系

以发送一个HTTP请求为例:

  1. 生成HTTP请求消息
  2. 根据域名,通过DNS查询解析出ip地址
  3. 找到IP地址对应的服务器通过三次握手建立TCP连接,向服务器发送HTTP Request请求,并得到服务器的Response响应

参考资料

趣谈网络协议

Linux性能优化实战

为什么DNS使用UDP而不是TCP?

HTTP请求过程(一)——DNS解析过程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章