记忆IP地址对于普通人来说是一个非常痛苦的事情。因此互联网提供了通过Host Name来访问对应host的方法。 把Host Name对应到IP的行为称作Name Resolution。互联网上提供Name Resoulution的使用最广泛的服务就是Domain Name System(下称DNS)。DNS服务是互联网中最为常见的服务之一,主要提供了IP地址和域名的映射能力。 DNS可以被视作一个分布式的数据库,由遍布在世界的各个角落的DNS服务器通过DNS协议提供服务。

DNS中使用的所有名字的集合叫做DNS Name Space。DNS Name Space目前是一个树状的结构,根部是一个未命名的root, 各个节点由Domain组成。Root节点下面的节点叫做Top Level Domain(TLD)。TLD包括generic TLDs(gTLDs), country code TLDs(ccTLDs), Internationalized country code TLDs(IDN ccTLDs),以及有特殊用处的infrastracture TLDs(ARPA)。

DNS Name Space中的每个管理单元,称为一个Zone。Zone也就是DNS Name Space的一个子树。Zone的管理是层层递进的,叫做代理(Delegation)。 比如xing.ruib.in这个域名,不考虑Root,由三个Zone组成,in.,ruib.和xing.,这几个Zone的管理可以是独立的。 Zone的管理者应该为对应的Zone指定至少两台域名服务器(Name Servers或DNS服务),以记录该Zone下包含的信息,为用户服务。 一般来讲,DNS服务器中,一台叫做Primary,负责记录Zone database,剩下的叫做Secondary, 从Primary中不断的同步Zone的信息(Zone Transfer)。这些服务器叫做该Zone的Authoritive Server,存储的信息是Authoritive的。

对应的,DNS服务器也是一个树状的层级架构。最上层由管理Root zone的13组Root Servers组成,下面是TLDs Name Servers等等。通过层层递进的查询,可以找到DNS Name Space中的所有Name对应的信息。 为了查询的效率,避免每次查询都要穿透到上层DNS Server,缓存是必不可少的。每条缓存记录都有存活时间(TTL)。缓存中的信息是Non-authoritive的。DNS服务器不仅会缓存正确查询的结果,也会缓存错误查询的结果, 以避免错误的应用程序不断查询错误的域名信息,造成不必要的损耗。

客户端和DNS服务器、DNS服务器之前主要利用DNS协议通信。DNS协议主要包含了两大协议。一个是查询/响应(Query/Response)协议,主要用于查询某个特定的域名。一个用于DNS服务之间交换数据的Zone Transfer协议。

DNS协议有一个通用的消息格式。消息本身是一个固定12 Bytes的消息头 + 一个变长的消息体。

消息头的组成为:

2 Bytes的Transaction Id, 用于客户端匹配请求和响应。

2 Bytes的Flags,包括: 1 bit的QR,标志该消息是Query(0)或者Response(1)。4 bits的OpCode,标志当前消息的操作,有Query(1),Notify(4),Update(5)。 1 bit的AA,标志当前消息是否是Authoritive Answer。1 bit的TC,标志当前消息是否被Truncated。1 bit的RD(Recursion Desired),标志是否要求递归查询。 1 bit的RA(Recursion Available),当前服务器是否支持递归查询。1 bit的Z(Zero),保留标志位。2 bit的AD(Authentic Data)和CD(Checking Disabled),用于安全性校验。4 bits的Rcode,错误码。

还有8 Bytes的Query Count/Zone Count, Answer Count/Prerequisite Count, Authority Record Count/Update Count和Additional Information Count,记录消息体的RR数量。

DNS消息的可变长度部分包含了Questions和Resource Records(RR)。每一个Question和RR开始都是一个Name,即域名。Name本身由一个个label组成。 为了减少体积,Label又分为Data Label和Compression Label。Data Label是Name中的一段数据,Compression Label是指向Data Label的指针。

对于Query消息,DNS通常使用UDP协议,消息超过512 Bytes时便会将消息头的TC设为1,并将消息截断。对于需要大块传输信息的场合,如Zone Transfer,DNS使用TCP协议。

流行的DNS协议的RR类型有如下几种:

A
IPV4 Address Record
NS
Authoritive Name Server
CNAME
canonical name, to name aliasing
SOA
start of autority,包含当前Zone的权威信息(如name servers, 管理者的邮箱地址等等)
PTR
IP地址到name的映射。
MX
Mail Exchanger
TXT
Text,文本信息
AAAA
IPV6 Address Record
SRV
Server Selection
NAPTR
Name Authoriy Pointer, 以支持可选的Name Space。
OPT
伪RR,用于扩展DNS协议,参见EDNS0。
IXFR
incremental zone transfer
AXFR
Full zone transfer
ANY
Request all records

更新DNS记录,可以向对应Zone的Authoritive Server发送DNS UPDATE消息。DNS UPDATE需要指定prerequites,其中的条件如果不满足,DNS Server不会更新消息。DNS Server会根据消息来增加/删除自己存储的RR(更改需要删除RR并增加新的RR)。

为了保证服务之前数据的同步,DNS Server之前需要进行Zone Transfer。最开始,Zone Transfer通过轮询进行。为了解决不必要的消耗(可能很长时间,Zone的信息不会被更改),异步的方法被提出。 当Zone的信息被更改后,主DNS Server会发送DNS Notify的消息到监听更改的服务器,重新进行Zone Transfer。Zone Transter又分为全量和增量。

TODO 没有记的问题:

  1. PTR
  2. SRV PTR
  3. NAPTR + TXT