Hosts文件与DNS
每当有映射需求的时候,电脑会优先在本地的hosts中查找,如果能完成名字地址解析则结束,不能的话则再向DNS发送请求。
当网络规模较小的时候,可以直接使用计算机自身的hosts文件进行映射。但是在网络规模较大,特别的在现有的互联网中,需要的映射信息量较为巨大,如果将其放于单独一台计算机上很容易造成通信瓶颈。DNS采用的解决方法是将这些信息进行划分,然后将划分出来的小块信息存放在不同的计算机上,这样每次有查询的需要,就将查询请求发送到最近的一台持有映射信息的计算机上。分级的层次结构
分层的名字空间
每一个名字都有几个部分构成,分别定义机构的性质、名字和部门等等。这样就可以把不同部分的定义和控制给划分为不同计算机进行管理,实现了责任的分散化。如http://blog.csdn.net,机构性质是net(网络支持中心),名字是csdn,部门模块为blog(博客)。
分层的服务器
对应于分层的名字空间,可以让多个服务器分别管理名字空间不同的部分(即不同的域),
每个服务器负则一个域。还可以把这个域再继续划分,划分之后的部分就称为区。
DNS还可以描绘成一个分级的树结构,最多有128级。树上的每一个节点都有一个域名。根服务器的区就是整个DNS树。
DNS还定义了两种服务器:主服务器和次服务器。主服务器负责创建、维护和更新关于自己管辖区的信息,次服务器负责从主服务器获得信息(自己不进行信息创建和更新)。解析
解析可以将名字映射为地址,也可以将地址映射为名字。当DNS服务器无法解析请求的时候,会出现两种情况。
递归解析
若是DNS服务器无法解析某个请求,则会将请求发送给父服务器并等待响应;若父服务器能够解析,则返回回答,否则继续将查询发送给上一级的父服务器。最终回答的传送也按照请求的层次依次下发到达发出请求的客户。
迭代解析
若是DNS服务器无法解析客户请求,则会返回一个认为可以解析这个请求的服务器的IP地址,客户将向该IP地址发送查询请求;若新的服务器能够解析,则给客户返回答案,否则将返回一个新的服务器的IP地址。即是,在客户得到回答之前,它可以向多个服务器发送请求。
高速缓存
若服务器向另一个服务器发送查询请求并得到回答时,服务器会在把回答发送给客户之前先将回答信息存储到自己的缓存中。以后若有客户有同样的请求到来的时候,服务器就不用再去向另一个服务器发送查询请求,而是先通过检查高速缓存来进行解析。
高速缓存加速了整个解析过程,同时也会存在安全隐患。如可以通过利用网民ISP端的DNS缓存服务器的漏洞进行攻击或控制,实现缓存投毒,将错误的域名纪录存入缓存中,从而使所有使用该缓存服务器的用户得到错误的DNS解析结果,把原本准备访问某网站的用户在不知不觉中带到黑客指向的其他网站上。协议报文
DNS有两种类型的报文,分别是查询和响应。查询报文包含了首部和问题部分;响应报文包含首部、问题部分、回答部分、授权部分和附加部分。
DNS有两种类型的记录,即问题记录和资源记录。在查询报文和回答报文中都包含了问题记录,用来从服务器得到的信息。资源记录被包含在相应报文中,用来向客户返回信息。协议封装
DNS使用UDP和TCP两种协议进行封装,采用的端口都是53,对于小于512字节的报文使用UDP服务,否则使用TCP服务。
若客户一开始使用UDP端口,但是服务器检测到响应报文超过512字节,则会截断该报文(将报文TC标志字段设置为1)。客户需要重新打开TCP连接,重复查询请求,从而正确得到服务器的相应。