2.3 解析客户机请求
当客户机要和远端系统通信,如一个用户用鼠标单击对一个Web节点的链接,则在实际和远端系统开始通信前,还有一系列的步骤需要完成。第一步就是要解析远端系统名为IP地址。客户机就是解析器。为解析远端系统名,客户机向它的一个DNS服务器发出查询,至少需要在客户机配置中指定一个DNS服务器。可在DNS网络控制面板的TCP/IP属性窗口中看到一个客户机的DNS服务器搜索顺序,如图2-4所示。在第14章将给出在不同的Windows客户机间定位搜索顺序的指针。
在图2-5中,可以看到列出了一个或几个DNS服务器的IP地址,指示客户机到哪里查找未解析名字的地址。客户机将首先查询列表中的第一个域名服务器。如果解析器在指定的时间内没有收到确认,它将查询列表中的下一个服务器,直到有一个域名服务器接受了查询。
当一个域名服务器接受了客户机的查询,客户机通常等待,而域名服务器就在域区文件查找所查询的主机名的IP地址,或从其他DNS服务器得到与接收到的查询相匹配的主机名。如果第一个DNS服务器接受了查询请求但不能解析主机名,它就返回“域名错误”以表明所查的域名不存在。当这种情况出现时,客户机将不再向第二个DNS服务器发出查询。
如果主机名中还包含主机的域名,DNS服务器使用这个附加信息来加速其搜索,甚至可能将查询直接提交给另一个DNS服务器,或者告诉客户机另一个DNS服务器的地址去查询(记住全域名,见第1章)。如果没有指定域名,则DNS服务器将认为是在自己的域区文件中查询。
2.3.1 客户机请求解析的过程
下面是一个详细的例子,以帮助读者理解域名解析的过程。这个例子说明了DNS是如何工作的,读者应仔细地阅读此例子,以便领会每一步的作用。
回顾以前关于全域名和根域的讨论,一个末尾带有句点“.”的主机名应该是全域名,就是说,在名字中所有应该有的域的成分都齐全了。如果客户机要解析的主机名末尾带有“.”,则它的DNS服务器将对域的成分不做进一步的假设,而是在开始解析时就直接将主机名送到根域服务器,从那里可在DNS树中沿一条最短的路径达到所查主机的授权服务器。如果域名只是相对域名,即没有末尾的句点,则DNS服务器将为重构造主机的全域名做出一系列智能的假定。
由于解析器库函数所用的不同源代码,解析器的工作会有所不同。许多标准解析器根据从应用程序收到的输入,用几个步骤就可以完成解析。例如,要查询主机名www,则按照缺省设置,加上客户机的域名。如果查询的主机名是www.isi.edu,则解析器将直接解析www.isi.edu。如果服务器不能找到www.isi.edu,则加上客户机的域名,并再次继续查询。
不同之处在于一些解析器区分全域名和主机名是通过查看整个字符串,如果是形如www.example.net的便认为是全域名,形如www的则认为仅仅是一个本地主机名。
例如,假设客户机所在的域是cnri.reston.va.us,它要访问www.isi.edu的Web节点。如果所查找的名字不是全域名,服务器将试图构造全域名。因为这个客户机开始查询的DNS服务器是在cnri.reston.va.us域,并且没有使用全域名,则DNS服务器使用的初始搜索串就是:
www.isi.edu.cnri.reston.va.us
注意,此DNS服务器已将自己的域名cnri.reston.va.us加到了被查找主机名的后面。除非查找名后面有“.”,DNS服务器将认为这个名字不是全域名。只有尾部的句点“.”才能确认全域名。另外,可认为www.isi.edu和www都是相对域名,它们可能在当前域中得到解析,也可能在当前域不能解析。如果名字尾部没有“.”,名字的相对性就可以由解析器设定,而它通常都留给DNS服务器来设定。通过在cnri.reston.va.us域中的初次搜索,域名服务器不能解析它收到的组合主机名。这表明重构查找主机的全域名没有成功,下一次查询时,DNS服务器就必须在高一层域中查找。所以,第二次查找的名字应为:
www.isi.edu.example.net
注意,第一次查询时的“cnri”部分现在已经消失。如果这个完成客户机搜索的DNS服器对reston.va.us域来说不是主DNS服务器,则它将把查询转送给另一个服务器进行解析,但如果这个服务器就是主服务器,而第二次搜索又失败了,则它将假定在更高一层域可能解析,于是将从当前的搜索名中再删去一个部分,再进行第三次查找。
如果第三次查找还是没成功,在这种情况下的第四次查找会有些不同。因为实际上没有us域(us由根域处理),第四次查询实际就要到根域服务器以查询www.isi.edu。但DNS服务器不会从根域服务器得到对www.isi.edu的解析,而是将被指向一个isi.edu域的授权服务器。然后,DNS服务器就将对www.isi.edu的查询送到isi.edu域名服务器。
因为www.isi.edu是isi.edu域的一个有效主机,这个isi.edu域的域名服务器就会用www.isi.edu的IP地址来进行响应。本地的DNS服务器就将结果送回给客户机,以便客户机用收到的IP地址连接Web服务器并下载Web页面。在下一节还将介绍主机-IP地址查询的更详细的过程。
以上就是DNS服务器递归查询的一个实例,也可设置为叠代查询或非递归查询。实际上,叠代查询就像DNS服务器查询根域服务器。而根域服务器并不是直接为客户机进行查询,而是提供一个最佳猜测,指示从哪里可以得到更多的信息。
DNS服务器可以工作在递归查询方式或叠代查询方式。在递归方式,DNS服务器成为客户机的代理,并根据需要和其他的DNS服务器通信,以得到结果,而客户机只是等待。递归查询时,一个DNS服务器本身将变成解析器,或者说是变成其他的DNS服务器的DNS客户机。Windows2000DNS服务器的缺省方式是从客户机接收递归查询并向除了它的前向服务器(forwarders)以外的其他DNS服务器发出叠代查询。
当工作在叠代方式时,DNS服务器只是提供一个它所能授权的最佳猜测,通常这种回答只是指向另一个DNS服务器,以便解析器可以继续查询。这个解析器可以就是原来的客户机,也可以是另一个DNS服务器。这种查询的重新指向将逐步地使查询接近最后的目标。叠代查询使得DNS服务器不必一直为查询而工作,因为客户机本身将按DNS提供的线索不断进行查询。
注意解析器的工作方式可以是互不相同的,这取决于解析器的设计和在网络控制面板中的设置。这一章的例子将显示解析器工作的一般过程。有许多因素会影响解析器所用的方法,但很少会影响最后的结果。
例如,有些解析器认为如果一个域名的内部含有句点“.”,则它就是全域名,然后将它不做任何改变就送给一个DNS服务器。而有些解析器则假设如果主机名末尾没有句点,则一定不是全域名,客户机就把自己的域名加到主机名的后面,再送到一个DNS服务器。这两种假设都可能不对。幸运的是,客户解析器和DNS服务器的结合可以成功地解析大多数的域名。