网络基础知识(七) DNS 和 Name Resolution

系列回顾

什么是DNS

DNS是 Domain Name Service 的缩写, 中文译作计算机域名系统. 它主要应用于域名的IP地址查询. 举个简单的例子来说, 如果你要访问google.com, 系列之前的文章提到过, 进行网络通信一定需要IP地址, 所以当敲下回车那一下, 首先就是需要通过DNS查找到google.com的IP地址, 然后才是建立TCP连接.

为什么需要DNS

对于人脑来说, 记住你要访问的网站的IP地址并不是一个好主意. 人类对数字的敏感程度远没有对单词的敏感程度高, 为了方便记忆, 域名通常是由英语单词说组成, 那么就需要一个东西来记住跟域名对应的IP地址.

DNS 服务器

DNS的查询过程被称作 Name Resolution. 首先需要明确的是, name server是配置在网络节点上的服务器, 对于现代计算机网络来说, 有几个东西是需要被配置在网络节点上的: 除了之前提到的IP地址, 子网掩码, 网关, 最后一个就是DNS服务器. 不过, 没有DNS服务器也不是不行, 只要能记住IP地址就可以了.

对于DNS服务器来说, 有5大基本类型:

  1. Caching Name Server
  2. Recursive Name Server
  3. Root Name Server
  4. TLD Name Server
  5. Authoritative Name Server

通常来说, caching name server是由ISP或者局域网提供的, 主要用来在一段时间内储存查询过的域名和IP对. 大部分的caching name server 也是recursive name server . Recursive name server是用来做DNS完整查询的.

举个例子:
电脑A和电脑B都连接在同一个网络内, 电脑A请求访问www.google.com. 为了能成功连接google的服务器, 服务器的IP地址是必须被知道的. 所以电脑A向本地DNS服务器请求www.google.com的IP地址, 很不幸缓存里没有. 那么就需要做一个完整的DNS查询了. 得到正确的IP之后, 这个IP地址会被发送到电脑A, 同时也将储存在缓存DNS服务器里面. 过了不久, 电脑B也请求访问www.google.com, 查询的步骤还是一样, 不过, 由于电脑A早些时候已经访问过www.google.com, 所以查询记录已经存在于缓存DNS服务器, 所以这次电脑B不需要做一个完整的DNS查询, 它可以直接在缓存DNS服务器中获取www.google.com的IP地址.

所有存在于DNS服务器的域名都有TTL(Time To Live), 这是值是一个以秒问单位的值. 域名的拥有者将设定这个值. 比如说, 600. 那么, 这个域名在缓存DNS服务器中存活的时间就是10分钟. 10分钟后将会被从缓存DNS服务器中删除.

DNS查询过程

第一步, 电脑需要连接本地的DNS服务器.

第二步, 本地DNS服务器需要访问root name server. Root name server在全世界一共有13个. 他们负责将查询的query发送给TLD name server. TLD是Top-Level Domain的缩写.

第三步, TLD name server将返回一个跳转, 告诉本地DNS服务器去跟一个authoritative name server联系, 去查询IP地址.

第四步, authoritative name server返回所查询域名的IP地址.

DNS和UDP

系列之前的文章在Transport层主要描述了TCP协议, 对于UDP协议一句带过. 所以这篇文章, 需要介绍一下UDP. 在DNS查询中, Transport层的通信协议是UDP而不是TCP.

为什么DNS查询是UDP的?

UDP和TCP最大的区别是UDP是无连接的, 意味着不需要像TCP一样进行三次握手来建立连接和四次挥手来断开连接, 也就意味着, 不需要发送大量的数据包. 通常来说, 一个DNS的查询请求和响应能被封装在一个UDP datagram里面, 还有一点是, DNS会产生极大的trassfic, 如果使用TCP的话, 会使得网络负荷加大. 虽然使用缓存DNS服务器能帮助减少一些查询请求, 但是总体来说, DNS查询的流量是极大的.

TCP协议下的DNS查询

首先电脑A需要和本地DNS服务器进行连接, 3次握手 (3个数据包). 然后电脑A需要发送真正的DNS查询请求 (1个数据包). 然后DNS服务器需要返回一个确认收到请求的响应 (1个数据包).

本地DNS服务器将和root name server进行连接 (3个数据包), 发送请求(1个数据包), 接受请求的确认(1个数据包), 接受响应(1个数据包), 发送响应确认(1个数据包), 然后断开连接(4个数据包).

然后是本地DNS服务器和TLD name server打交道 (11个数据包).

然后本地DNS服务器和authoritative name server打交道 (11个数据包).

然后本地DNS服务器发送响应给电脑A (1个数据包), 电脑A确认响应 (1个数据包), 然后断开连接(4个数据包)

使用TCP协议完成一个完整的DNS查询, 最少需要发送$5 + 11 + 11 + 11 + 6 = 44$个数据包.

UDP协议下的DNS查询

对于UDP协议来说, 发送请求到本地DNS服务器需要1个数据包; 本地DNS服务器和root name server打交道, 请求+响应需要2个数据包; 本地DNS服务器和TLD name server打交道, 请求+响应需要2个数据包; 本地DNS服务器和authoritative name server打交道, 需要2个数据包; 本地DNS服务器响应DNS查询请求需要1个数据包.

使用UDP协议完成一个完整的DNS查询, 只需要$1 + 2 + 2 + 2 + 1 = 8$个数据包, 高下立判.

无响应怎么办?

我们都知道, UDP是不保证数据能传输到发起请求的电脑上的, 所有有些人会好奇, 如果本地DNS收不到响应或者电脑收不到响应怎么办? 办法很简单, 那就是再发一遍.

Resource Record

A记录

A记录用于讲一个域名指向一个IPV4地址. 一个A记录对应一个域名, 但是一个域名可以对应多个A记录. 这个技术被称为DNS Round Robin, 用于分流流量到多个IP上.

对于域名 www.google.com来说, 每天访问这个域名的流量是巨大的. 为了减轻服务器的负担, 管理员可以为在authorative name server为这个域名配置4个A记录. 假设这4个ip地址是

  • 10.1.1.1
  • 10.1.1.2
  • 10.1.1.3
  • 10.1.1.4

当电脑A进行DNS查询的, name server将按照上面的顺序返回4个IP地址. 电脑A会尝试去连接10.1.1.1, 如果失败的话再按顺序尝试.

然后电脑B进行DNS查询的时候, name server依然会返回4个IP地址, 但是顺序会变. 10.1.1.1被放到了末尾, 10.1.1.2则被顶到了第一个.

每进行一次DNS查询的时候, 返回的顺序都会进行一次改变.

Quad A Record

与A记录不同的是, Quad A Record指向的是一个IPV6的地址.

CNAME

CNAME 用于将流量从一个域名重定向到另外一个域名. 还是以www.google.com为例子, 为了保证用户在浏览器输入google.com的时候, 能够访问正确的服务器, 需要在google.com的CNAME中配置www.google.com, 这样每当用户访问google.com的时候, 流量能被重定向到www.google.com.

MX 记录

MX 是mail exchange的简称, 这个记录用于将邮件服务器指向一个IP地址.