DNS 是一种用于 TCP/IP 应用程序的分布式数据库,它提供主机名字和 IP 地址之间的转换及有关电子邮件的选路信息。DNS 提供了允许服务器和客户端程序相互通信的协议。
从应用的角度上看,对 DNS 的访问是通过一个地址解析器来完成的,在 Unix 主机中,该解析器主要通过两个库函数 gethostbyname(3) 和 gethostbyaddr(3) 来完成的,前者接收主机名字返回 IP 地址,后者接收 IP 地址寻找主机名字。
DNS 基础
DNS 的名字空间具有层次结构,每个结点有一个至多63个字符长的标识。树根是没有任何标识的特殊结点,命名标识中一律不区分大写和小写。命名树上任何一个结点的域名就是将从该结点到最高层的域名串联起来,中间使用 “.” 分隔这些域名。
以 “.” 结尾的域名称为绝对域名或完全合格域名,如果不完整的域名由两个或两个以上的标号组成,则认为他是完整的,或者在该域名的右边加入一个局部后缀。
顶级域名被分为三个部分:
(1)arpa 是一个用作地址到名字转换的特殊域。
(2)7个3字符长的普通域,有些书也将这些称为组织域。
(3)所有2字符长的域是基于 ISO3166 中定义的国家代码,这些域被称为国家域,或者地理域。
普通域的划分:
域 | 描述 |
---|---|
com | 商业组织 |
edu | 教育机构 |
gov | 其他美国政府部门 |
int | 国际组织 |
mil | 美国军事网点 |
net | 网络 |
org | 其他组织 |
DNS 的一个基本特性是使用高速缓存。即当一个名字服务器收到有关映射的信息时,他就会将该信息存放在高速缓存中。这样若以后遇到相同的映射请求,就能直接使用缓存中的结果而无需通过其他服务器查询。
DNS 的报文格式
DNS 定义了一个用于查询和响应的报文格式,由12字节长的首部和四个长度可变的字段组成。首部由标识、标志、问题数、资源记录数、授权资源记录数、额外资源记录数组成;可变字段包括查询问题、回答、授权、额外信息。
DNS查询报文中的问题部分
问题部分包括查询名、查询类型、查询类。查询名是要查找的名字,他是一个或多个标识符的序列,最后以0结束;每个问题有一个查询类型,最常用的查询类型是 A 类型,表示期望获得查询名的 IP 地址;查询类通常是1,指互联网地址。DNS 响应报文中的资源记录部分
DNS 报文中最后的三个字段,回答字段、授权字段和附加信息字段,均采用一种称为资源记录RR的相同格式。包含域名、类型、类、生存时间、资源数据长度、资源数据。
资源记录包含如下内容:
域名:记录中资源数据对应的名字;类型:说明 RR 的类型码;类;生存时间:客户端保留该资源记录的秒数;资源数据长度:资源数据的数量。
指针查询
即给定一个 IP 地址,返回与该地址对应的域名。
资源记录
A:一个 A 记录定义了一个 IP 地址,它存储32 bit 的二进制数。
PTR:指针记录用于指针查询。IP 地址被看作是 in-addr.arpa 域下的一个域名(标识符串)。
CNAME:这表示 “规范名字”。某些 FTP 服务器使用它向其他系统提供的别名。
HINFO:表示主机信息,包括说明主机 CPU 和操作系统的两个字符串。并非所有的站点均提供他们系统的 HINFO 记录,并且提供的信息也可能不是最新的。
MX:邮件交换记录。
NS:名字服务器记录。它说明一个域的授权名字服务器。