记忆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 没有记的问题:
- PTR
- SRV PTR
- NAPTR + TXT