DNS 灵魂三问:why,when,how

本文将讨论三个问题:html

  • 为何要有 DNS
  • 何时进行 DNS 查询
  • DNS 如何工做

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

为何要有 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 地址的查询app

真相就是操做系统进行的 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…

若是想与我有更密切的交流也能够加入个人小密圈:程序员生存指南

相关文章
相关标签/搜索