域名系统(DNS)是一种用于TCP/IP应用程序的分布式数据库,它提供主机名字和IP地址之间的转换及有关电子邮件的选路信息。
这里提到的分布式是指在Internet上的单个站点不能拥有所有的信息。每个站点(如大学中的系、校园、公司或公司中的部门)保留它自己的信息数据库,并运行一个服务器程序供Internet上的其他系统(客户程序)查询。
从应用的角度上看,对DNS的访问是通过一个地址解析器(resolver)来完成的。
Unix主机中,该解析器主要是通过两个库函数gethostbyname和gethostbyaddr来访问的,前者接收主机名字返回IP地址,也就是正向解析,后者接收IP地址来寻找主机名字,也就是反向解析。
解析器通常是应用程序的一部分, 并不是什么操作系统的内核。
在一个应用程序请求TCP打开一个连接或使用UDP发送一个数据报之前,必须将一个主机名转换为一个IP地址。操作系统内核中的TCP/IP协议族对于DNS一点都不知道。
DNS的层次结构
DNS也有层次结构
每个结点(下图的圆圈)有一个至多63个字符长的标识。不区分大小写。以“.”结尾的域名称为绝对域名或完全合格的域名FQDN(Full Qualified Domain Name),例如sun.tuc.noao.edu.。如果一个域名不以点结尾,则认为该域名是不完全的。
顶级域名被分为三个部分:
1、arpa是一个用作地址到名字转换的特殊域
2、7个3字符长的普通域。有些书也称之为组织域
3、所有2字符长的域均是基于ISO3166中定义的国家代码,这些域被称为国家域或地理域 例如:cn、jp
常见的普通域:
DNS的一个重要特征是DNS种域名的授权。只有一个机构 即网络信息中心NIC负责分配顶级域和委派其他指定地区域的授权机构。
一个独立管理的DNS子树称为一个区域,一个常见的区域是一个二级域,如noao.edu。许多二级域将它们的区域划分成更小的区域。
一个区域的管理者必须为该区域提供一个主服务器和至少一个从属服务器。主服务器和从属服务器必须是独立冗余的。
主服务器:从磁盘文件中调入该区域的所有信息
从属服务器:从主服务器调入所有信息。
将从属服务器从主服务器调入信息成为区域传送。
对于新主机加入后的处理:
DNS的一个基本特性是使用超高速缓存。即当一个名字服务器收到有关映射的信息(主机名字到IP地址)时,它会将该信息存放在高速缓存中。这样若以后遇到相同的映射请求,就能直接使用缓存中的结果而无需通过其他服务器查询。
DNS的报文格式
这个报文由12字节长的首部和4个长度可变的字段组成。
标识字段由客户程序设置并由服务器返回结果。客户程序通过它来确定响应与查询是否匹配。
标志字段:16bit 被划分为若干子字段
- QR :1bit字段 ,0表示查询报文,1表示响应报文
- opcode :4bit 字段,通常值为0(标准查询),其他值为1(反向查询)和2(服务器状态请求)
- AA:1bit标志,表示“授权回答(authoritative answer)”。该名字服务器是授权于该域的。
- TC :1bit字段,表示 “可截断的(truncated)” 使用UDP时,它表示当应答的总长度超过512字节时,只返回前512个字节。
- RD :1bit字段,表示“期望递归(recursion desired)” ,该比特能在一个查询中设置,并在相应中返回。这个标志告诉名字服务器必须处理这个查询,也称为一个递归查询。如果该位为0,且被请求的名字服务器没有一个授权回答,它就返回一个能解答该查询的其他名字服务器列表,这称为迭代查询。
- RA :1bit字段,表示“可用递归”,如果名字服务器支持递归查询,则在响应中将该比特设置为1.
- 随后的3bit字段必须为0
- rcode :4bit的返回码字段。通常的值为0(没有差错)和3(名字差错)。名字差错只有从一个授权名字服务器上返回,它表示在查询中制定的域名不存在。
随后的4个16bit字段说明最后4个变长字段中包含的条目数,对于查询报文,问题(question)数通常是1,而其他3项则均为0.类似地,对于应答报文,回答数至少是1,剩下两项可以是0或非0.。
DNS查询报文中的问题部分
每个问题有一个查询类型,而每个响应(也称为一个资源记录)也有一个类型,查询类型是类型的一个超集(superset),如图:
A 期望获得查询名的IP地址(正向解析)
PTR 指针记录(反向解析)
查询类通常是1,指互联网地址
DNS响应报文中的资源记录部分
DNS报文中最后的三个字段,回答字段、授权字段和附加信息字段,均采用一种称为资源记录RR(Resource Record)的相同格式
域名是记录中资源数据对应的名字。它的格式和前面介绍的查询名字段格式相同。
类型说明RR的类型码,它的值和前面介绍的查询类型值是一样的,类通常为1,指Internet数据
生存时间是客户程序保留该资源记录的秒数,资源记录通常的生存时间值为2天,
资源数据长度说明资源数据的流量。该数据的格式依赖于类型字段的值。对于类型1(A记录)资源数据是4字节的IP地址。
指针查询
指针查询方式:即给定一个IP地址,返回与该地址对应的域名
我们可以从图中看出,当一个组织加入Internet,并获得DNS域名空间的授权,如noao.edu 则它们也获得了对应IP地址的in-addr.arpa域名空间的授权。在noao.edu这个例子中,它是网络号为140.252的B类网络。在DNS树中结点in-addr.arpa的下一级必须是该IP地址的第一字节(例中为140),再下一级为该IP地址的下一个字节(252),依此类推。但应牢记的是DNS名字是由DNS树的底部逐步向上书写的,这意味着对于IP地址为140.252.13.33的sun主机,它的DNS名字为33.13.252.140.in-addr.arpa。
必须写出4字节的IP地址,因为授权的代表是基于网络号:A类地址是第一字节,B类地址是第一、二字节,C类地址则是第一、二、三字节。IP地址的第一字节一定位于in-addr的下一级,但FQDN却是自树底往上书写的。如果FQDN由顶往下书写,则这个IP地址的DNS名字将是arpa.in-addr.140.252.13.33 而它对应的域名将是edu.noao.tuc.sun
如果DNS树中没有独立的分支来处理这种地址—名字的转换,将无法进行这种反向转换,除非从树根开始依次尝试每个顶级域。
资源记录
A 一个A记录定义了一个IP地址,它存储32bit的二进制数
PTR 指针记录用于指针查询,IP地址被看作是in-addr.arpa域下的一个域名(标识符串)
CNMAE 这表示“规范名字(canonical name)”。它用来标识一个域名(标识符串),而有规范名字的域名通常被称为别名(alias)。
HINFO 表示主机信息:包括说明主机CPU和操作系统的两个字符串。并非所有的站点均提供它们系统的HINFO记录,并且提供的信息也可能不是最新的。
MX 邮件交换记录
高速缓存
为了减少Internet上DNS的通信量,所有的名字服务器均使用高速缓存。
在标准的Unix实现中,高速缓存是由名字服务器而不是由名字解析器维护的。
因为名字解析器作为每个应用的一部分,应用不可能总处于工作状态,所以将高速缓存放在只要系统处于工作状态就能起作用的程序中。
用UDP还是TCP
1、需要分片时 当名字解析器发出一个查询请求,并且返回响应中的TC(删减标志)比特被设置为1时,它就意味着响应的长度超过了512个字节,而仅返回前512个字节。
2、当从属服务器启动时,需要进行区域传送