域名系统

域名系统(Domain Name System, DNS)是一个能将主机名映射成 IP 地址的互联网服务。

DNS 提供:

  • 主机别名(host aliasing):DNS 将助记(mnemonic)的主机别名映射到规范主机名(canonical hostname)与其 IP 地址上。
  • 邮件服务器别名(mail server aliasing):DNS 将助记的邮件服务器别名({xyz}@qq.com)映射到规范主机名({xyz}@relay1-west-coast.qq.com)与其 IP 地址上。
  • 负载分配(load distribution):访问量很大的站点会部署在多台服务器上,因此有一组 IP 地址与同一个主机别名相关联。DNS 轮转(rotation) 响应查询,以平衡各个冗余服务器间的负载。

DNS 服务器

DNS 使用大量的名称服务器(name servers),它们以层次化(hierarchical)的方式组织起来分布在全球各地。

  • 根域名服务器(DNS root servers):负责将 DNS 请求转发至相应的顶级域名服务器
  • 顶级域名服务器(Top-level domain servers, TLD):负责将 DNS 请求转发至至相应的权威域名服务器。顶级域名分为通用顶级域名(generic TLD, gTLD).com, .edu地区代码顶级域名(country code TLD, ccTLD).cn, .hk
  • 权威域名服务器(authoritative DNS servers):负责提供某域下主机名与其 IP 地址等记录的最终权威来源。任何在互联网中拥有可公开访问主机的组织都需要提供相应的权威域名服务器。

本地 DNS 服务器(local DNS servers):本地 DNS 服务器严格说来不属于任意 DNS 层次结构。它通常在网络拓扑上离主机更近,充当代理服务器,将主机的 DNS 查询转发至 DNS 层次结构中。

  • DNS caching:既然是代理服务器,那么它当然能够充当缓存!
  • ISP 向主机提供一个或多个本地 DNS 服务器

考虑一个完整的 DNS 查询:

  • 请求主机【A】cse.nyu.edu 发送查询 gaia.cs.umass.edu
  • 转发至本地 DNS 服务器【B】dns.nyu.edu
  • 【B】将查询转发至根域名服务器,获得 .edu 顶级域名服务器【C】的地址
  • 【B】将查询转发至【C】,获得马赛诸塞大学权威域名服务器【D】dns.umass.edu 的地址
  • 【B】将查询转发至【D】,获得 gaia.cs.umass.edu 的地址
  • 【B】响应【A】的查询,并缓存

【A】的查询是递归(recursive) 的,因为它委托本地 DNS 服务器【B】作为代理;【B】的查询是迭代(iterative) 的,因为它自己走完了整条解析链。

DNS 记录

DNS 资源记录(resource records, RR)。本地服务器能够缓存 RR。

RR 是一个四元组 (Name, Value, Type, TTL)

  • Name:域名
  • Value:值(IP 地址,域名)
  • Type:类型
  • TTL(time to live):缓存的 RR 在 TTL 过后被清理。

RR 的类型:

  • Type=A:RR 是 Name 主机名到 Value IP 地址的映射
  • Type=CNAME:RR 是 Name 主机别名到 Value 规范主机名的映射
  • Type=NS:RR 是 Name 域名到 Value 对应的权威域名服务器的主机名
  • Type=MX:RR 是 Name 邮件服务器主机别名到 Value 规范主机名的映射

向 DNS 数据库中插入 RR:经过域名注册商(registrar)

本站就通过 NameSilo 添加了别名映射 RR (thisisxxz.com, thisisxxz.github.io, CNAME)

DNS 消息

DNS 查询(query)与回复(reply)消息的格式是一致的。

可以介绍一些 flag fields:

  • 1 位 query/reply flag,标记是查询还是回复消息
  • 1 位 authoritative flag,标记此回复消息是否来自被查询域名的权威服务器
  • 1 位 recursion-desired flag,标记询问主机是否允许 DNS 服务器作为代理执行递归查询
  • 1 位 recursion-available flag,标记 DNS 服务器是否支持递归查询

nslookup 程序。