专栏名称: 没故事的卓同学
iOS
目录
相关文章推荐
今天看啥  ›  专栏  ›  没故事的卓同学

DNS 灵魂三问:why,when,how

没故事的卓同学  · 掘金  · ios  · 2018-01-15 06:21

本文将讨论三个问题:

  • 为什么要有 DNS
  • 什么时候进行 DNS 查询
  • DNS 如何工作

DNS 是 Domain Name System 的缩写,作用很简单,根据域名查询对应的 IP 地址。

为什么要有 DNS

TCP/IP 约定每个网络请求包根据 IP 地址确认接收方。这和你打电话需要知道对方电话号码一样。

因为 IP 地址不好记忆,所以有了一层域名映射。

为什么不设计成直接根据域名确认接收方呢?

在 iPv4 里,IP 地址是 4 个 0-255 的数,2 的 8 次方,8 bit,1 byte。只要 4 个字节的大小。 如果是支持字符串,就算用最简单的 ASCII 编码,一个字符就要 1 个字节。一个常见的域名通常十几个字符,最长可以支持 255 个字符,比用 IP 表示大了很多倍。

有的人可能觉得虽然大了很多倍,但是如果只是一个请求大了几个字节性能影响也不大。这里面还有一个误区,TCP/IP 只是一个协议,网络中和通讯有关设备是多种多样的。比如我发送一个 5 KB 的字符串,中间有可能通过光纤传递传递,也有可能通过早期的铜缆。不同的连接材料的带宽区别很大。有可能一个包的 maxSize 只能是 1 KB(IP 层的 MTU)。应用层的数据在通讯过程中会根据通讯设备的带宽分成很多个包。一个 http 请求并不是只发了一个包,可能一次请求被拆成了很多个包。所以如果用域名,网络请求的数据量会增加很多。

什么时候进行 DNS 查询

现在我们知道最后通讯的时候我们通过 DNS 获得了一个 IP 地址。当我们在浏览器输入一个 URL 后,是在什么时候、谁进行的查询?

浏览器获得这个请求后,甩给了操作系统,操作系统甩给了网卡,网卡作为真正干活的人把包按照链路层协议送了出去。

DNS 发生在 TCP/IP 之前。前面已经提过,到 TCP/IP 协议栈的时候已经是有 IP 地址了。为什么不把 DNS 定义在 TCP/IP 里呢?反正网络请求都是 TCP/IP 负责,如果发现是域名就顺便解析一下呗。 这就是架构设计的美妙。联想一下我们实际生活的场景,你要寄一个礼物给远方的朋友,收件员来了,他会关心收件人的地址你是怎么查到的吗?他有提供根据收件人姓名提供地址的服务吗?他顺便做了也很好啊。没做是因为这不是他们的核心业务。同样,TCP/IP 只负责通讯,不负责 IP 地址的查询

真相就是操作系统进行的 DNS 查询。所以在操作系统的网络设置中,可以进行 DNS 服务器的配置。操作系统也同时管理了 DNS 的缓存。《iOS网络请求优化之DNS映射》中提到:

像 iOS 系统一般是 24 小时之后会过期,还有进入飞行模式再切回来,开关机,重置网络设置等也会导致 DNS cache 的清除。所以一般情况下用户在第二天打开你的 app 都会经历一次完整的 DNS 解析请求。

DNS 如何工作

一个简单的版本,在世界的中心有一台服务器,服务器里有一个数据库,数据库里有一张表,这张表里存着域名和 IP 地址的记录。你想要查什么服务器都给你。

如果产品经理描述应该就是这样的,接着会说这是一个小需求,什么时候可以上线。

DNS 不仅只是查询 IP

除了域名解析的 A 记录。还包括了 MX(Mail eXchange)邮件服务器地址,还有别名 CNAME 记录。 实际上还有很多其他功能,比如根据 IP 地址反查域名(PTR),查询域名 DNS 服务器 IP 地址(NS)。

不是一台服务器,是分布式服务器

互联网中有那么多的域名,全部都存在一台服务器中显然是不可能的。全世界每天有那么多的域名新增、修改,如果全往一台服务器做 IO ,性能多强也扛不住。

DNS 是分层的数据库结构。

比如一个域名 live.apple.com, 分成了4层:根域名、com、apple、live。根域名是用.表示,因为域名的最后的.可以被忽略,所有常常被人遗忘,完整的域名表示是live.apple.com.

假设我们要解析这个域名的 IP ,会去系统配置的 DNS 服务器查,如果 DNS 服务器没有这个域名的缓存,则会去根域名的服务器查出负责 com 域名的服务器,接着再从 com 找到 apple 的域名。

如果我们就持有 apple 域名,apple 下的子域名我们可以自己控制。有两种控制方式,一种是直接把子域名一起注册到 apple 域名里,记录在 com 域名服务器下。一种是自建 name server,就是前面提到的 NS 记录。此时向 com 域名查询 apple,会返回你自己配置的 name server 服务器地址,解析就由你自己控制了。

自建 name server 通常是对域名商的 ns 性能不满意。《DNS 基础知识》里提到:

虽然顶级域名注册商都有自己的 nameserver, 但注册商提供的 nameserver 并不专业,在性能和稳定性上无法满足企业需求,这时就需要企业搭建自己的高性能 nameserver ,比如增加智能解析功能,让不同地域的用户访问最近的 IP,以此来提高服务质量。

根域名服务器

为什么 DNS 服务器知道根域名服务器的地址呢?根域名服务器的地址是固定的,目前全球有 13 个根域名解析服务器,这 13 条记录持久化在每台 DNS 服务器中。

为什么是 13 条?因为 DNS 使用 UDP 查询,UDP 在 IPv4 内的最大有效大小为 512 字节。要让所有的根域名包含在一个报文里,只能把数量限制在 13 个。根域名服务器用单个字母表示,中国大陆境内共有 F、I、J、L 这 4 个根域的 6 台DNS镜像(L 有三台镜像)在提供服务。

幸运的是,采用 anyCast 技术架设镜像服务器可解决该问题,并使得实际运行的根域名服务器数量大大增加。截至 2017 年 11 月,全球共有 800 台根域名服务器在运行。

智能解析

智能解析,就是当一个域名对应多个 IP 时,当你查询这个域名的 IP,会返回离你最近的 IP。 由于国内不同运营商之间的带宽很低,所以电信用户访问联通的 IP 就是一个灾难,而智能 DNS 解析就能解决这个问题。

智能解析依赖 EDNS 协议,这是 google 起草的 DNS 扩展协议, 修改比较简单,就是在 DNS 包里面添加 origin client IP, 这样 nameserver 就能根据 client IP 返回距离client 比较近的 server IP 了。

国内最新支持 EDNS 的就是 DNSPod 了,DNSPod 是国内比较流行的域名解析厂商,很多公司会把域名利用DNSPod 加速, 它已经被鹅厂收购。

负载均衡、CDN 的实现也利用了 DNS 智能解析。


参考:


欢迎关注我的微博:@没故事的卓同学

掘金博客地址:juejin.im/user/5624c8…

如果想与我有更密切的交流也可以加入我的小密圈:程序员生存指南




原文地址:访问原文地址
快照地址: 访问文章快照