Windows上的名字解析(1)
介绍
当您打开计算机开始访问网络资源时,就涉及到一个问题:名字解析,名字解析就是把需要访问的计算机名字解析成IP地址的过程。为什么需要有这个过程呢?原因是TCP/IP网络上的计算机之间是通过IP地址来相互通讯的。IP地址就好像是我们的门牌号码,网络上的每台计算机或每个网站都至少有一个IP地址,IP地址是一个32比特长的数字,表示方式是每个8个比特之间加一个点,比如10.80.141.70。到这里就有一个问题了:您能够记住您经常访问的网站的IP地址吗?答案恐怕是否,因为这样一串数字并不便于普通人进行记忆。这就是为什么网络上的每台计算机至少有一个便于记忆的名字,一般人只要通过它们的名字而不是IP地址就可以访问了。如果Windows不能成功地把一个名字解析成IP地址,访问也就不可能进行了。下面我们就来讲讲Windows上有些什么类型的名字以及Windows是如何来做名字解析的。
Windows上名字的类型
Windows上有两类名字,一类是主机名字(Host Name)。主机名字最长有255个字符,可以包含数字、字母以及连字号”-“和点”.”等。您的计算机的计算机名字或者您公司的服务器的计算机名字就是一种主机名字,比如sh-fileserver。而且,互联网上的网站域名也是一种主机名字,比如www.microsoft.com。
另一类名字是NetBIOS名字,大家可能会觉得比较陌生。NetBIOS名字是Windows上特有的一类名字,长度为16个字符,由15个字符和一个不可打印的NetBIOS名字后缀字符组成。NetBIOS名字后缀表示这个NetBIOS名字所代表的服务类型。比如说,一台Windows域控制器会有一个后缀为0x1C的NetBIOS名字,网络中的其它计算机见到了这个NetBIOS名字就知道这是一台域控制器了。常见的NetBIOS后缀有0x20(文件和打印服务)、0x00(工作站服务)、0x03(报信者服务)等。您大可不必去记住这些复杂NetBIOS名字后缀,因为应用程序会根据要访问的服务类型来决定NetBIOS名字后缀的。
对应这两类名字,Windows上有两类名字解析,分别是主机名字解析和NetBIOS名字解析。不同的应用程序会使用不同的名字解析。使用WinSock(一种网络程序开发接口)开发的应用程序使用主机名字解析的,例如Internet Explorer,ftp等。有很多网络程序都是使用WinSock开发的。而大部分Windows组件会两种名字解析都用,只要有一类名字解析成功,就放弃另一类名字解析。典型的例子有访问网络上的共享文件或打印机,或者ping一台计算机。
下面我们要分别介绍两类名字解析过程。
主机名字解析
在介绍主机名字解析之前,我们先来了解一下DNS(Domain Name Service)。互联网上的域名是呈树状结构的,树状结构上的每一个节点就是一个DNS域名,例如www.microsoft.com和www.msn.com等都是DNS域名。DNS服务器负责将DNS域名解析成IP地址的网络服务。
Windows解析主机名字时是按照以下顺序进行的。
查询DNS客户端缓存和hosts文件
首先检查主机名字是否存在于DNS客户端缓存或hosts文件中。DNS客户端缓存是用于存放DNS查询结果的。例如,您访问某个网站,通过查询互联网上DNS服务器得到这个网站的IP地址,这个网站的DNS名字以及它的IP地址就会添加到Windows的DNS客户端缓存中。您再次访问这个网站时,Windows就不用再次查询互联网上DNS服务器了,会直接从DNS客户端缓存获得这个网站的IP地址,这可以很大地提高网络访问速度以及减少网络流量。但是,DNS客户端缓存里的记录是有有效期的,也就是说在一段时间之后,这条记录会被从缓存中删掉,当再次访问这个网站时,Windows就需要再次查询互联网上DNS服务器了。这样做的好处是如果这个网站的IP地址改变之后,您的计算机不会一直使用老的IP地址。在Windows上,您可以用ipconfig /displaydns命令来查询DNS客户端缓存里有什么纪录,或者使用ipconfig /flushdns来清除DNS客户端缓存里的纪录。
Windows上的名字解析(2)
下面是ipconfig /displaydns的一个例子:
localhost
----------------------------------------
Record Name . . . . . : localhost
Record Type . . . . . : 1
Time To Live . . . . : 0
Data Length . . . . . : 4
Section . . . . . . . : Answer
A (Host) Record . . . : 127.0.0.1
www.msn.com.cn
----------------------------------------
Record Name . . . . . : www.msn.com.cn
Record Type . . . . . : 5
Time To Live . . . . : 33
Data Length . . . . . : 4
Section . . . . . . . : Answer
CNAME Record . . . . : cnmsn.qihoo.com
c.live.com
----------------------------------------
Record Name . . . . . : c.live.com
Record Type . . . . . : 1
Time To Live . . . . : 339
Data Length . . . . . : 4
Section . . . . . . . : Answer
A (Host) Record . . . : 207.46.216.55
hosts文件是Windows上用来存放静态的主机名字和IP地址映射的,它放在 %SystemRoot%system32driversetc目录下。如果您知道一个主机名字所对应的IP地址,而且这个名字不能通过DNS查询获得,就可以把这个主机名字和它的IP地址加到hosts文件中,下面是一个样本hosts文件里的内容:
127.0.0.1 localhost
10.22.80.16 testserver.test.com
10.54.94.97 rhinoserver
hosts文件被修改保存之后,hosts文件里的内容就立即被装载到DNS客户端缓存。如果hosts文件里包含错误的纪录,就会导致访问错误。有一些网络加速软件会把访问过的网站域名和它们的IP地址加到hosts文件中,这样可以减少DNS名字查询的时间。但是这会导致一个问题,如果某个网站的IP地址改变了,那就再也访问不到这个网站了,因为每次访问的都是老的那个IP地址。所以不建议把能够通过DNS解析的主机名字加到hosts文件里,这样可以避免不少问题。
Windows上的名字解析(3)
查询DNS服务器
如果Windows在DNS客户端缓存和hosts文件里找不到要查询的主机名字,会查询DNS服务器。这时,Windows会根据需要查询的主机名字来决定如何提交查询问题到DNS服务器。
主机名字有三种类型。第一类主机名字含有多个部分,以点分割,而且以点结尾,例如www.contoso.com.,我们也把这种名字称为FQDN(Fully Qualified Domain Name)。所有提交到DNS服务器去查询的名字都必须是FQDN。如果一个用户直接访问一个FQDN名字,Windows直接用这个名字去查询DNS服务器。
第二类主机名字只有一个部分,不含有点,例如sh-fileserver。第三类主机名字含有多个部分,以点分割,但是不以点结尾,例如www.contoso.com。对于后两类主机名字,Windows会修改主机名字,然后再提交到DNS服务器去查询。这是不是有些超出大家的预料,我们来讲讲Windows为什么要这么做。假设您上海分公司的Windows域名是shanghai.contoso.com,您的计算机名是seal,它的全名是seal.shanghai.contoso.com,下面是在您的计算机上运行ipconfig /all命令的结果的一部分,注意DNS后缀搜索列表(DNS Suffix Search List)之后列出的两个名字shanghai.contoso.com和contoso.com。
Windows IP Configuration
Host Name . . . . . . . . . . . . : seal
Primary Dns Suffix . . . . . . . : shanghai.contoso.com
Node Type . . . . . . . . . . . . : Mixed
IP Routing Enabled. . . . . . . . : No
WINS Proxy Enabled. . . . . . . . : No
DNS Suffix Search List. . . . . . : shanghai.contoso.com
contoso.com
假设北京总部的Windows域名是contoso.com,您要访问北京总部的一台文件服务器bj-fileserver,它的全名是bj-fileserver.contoso.com。您打开文件管理器,直接输入\bj-fileserver。注意,您输入的只是服务器的计算机名,而不是用冗长的FQDN。Windows为了获得bj-fileserver的IP地址,会在bj-fileserver之后依次附加DNS后缀搜索列表中的名字来形成FQDN,并发送给DNS服务器,直到DNS服务器返回一个正确的结果。下面就是Windows依次发送给DNS服务器的FQDN:
bj-fileserver.shanghai.contoso.com.
bj-fileserver. contoso.com.
对于第一个查询,DNS服务器返回的结果是不知道,因为这个名字并不存在;对于第二个查询,DNS服务器返回bj-fileserver的IP地址,查询结束。
您可以在网卡的Internet协议TCP/IP属性-〉高级-〉DNS页面里修改DNS后缀搜索列表,如下图:
如果查询DNS服务器还是失败,那么主机名字解析就失败了。
NetBIOS名字解析
下面我们来讲讲NetBIOS名字解析。Windows解析NetBIOS名字时按照以下顺序的。
Windows上的名字解析(4)
NetBIOS名字缓存
NetBIOS名字缓存和DNS客户端缓存类似,是用于存放已经获得的NetBIOS查询结果,这可以节约多次访问同一个NetBIOS名字的名字解析次数。您可以用nbtstat –c命令来获得NetBIOS名字缓存里的纪录:
D:>nbtstat -c
Local Area Connection:
Node IpAddress: [10.22.78.16] Scope Id: []
NetBIOS Remote Cache Name Table
Name Type Host Address Life [sec]
------------------------------------------------------------
SEEPS <20> UNIQUE 10.54.94.97 600
VBDBASE <20> UNIQUE 10.53.94.97 582
NetBIOS名字缓存里的纪录也有有效期,缺省是10分钟。您可以用命令nbtstat -R来清除名字缓存。
在NetBIOS名字解析中有和hosts文件类似的文件lmhosts文件,lmhosts文件也是用来存放静态的NetBIOS名字和IP地址映射的,它的位置也是在%SystemRoot%system32driversetc目录下。缺省情况下,lmhosts文件并不存在,系统有一个lmhosts样本文件lmhosts.sam,您可以仿照lmhosts.sam文件来编写您的lmhosts。下面是一个样本lmhosts文件里的内容:
10.60.11.70 seeps
10.54.91.123 sh-fileserver #PRE
10.54.94.117 bj-fileserver #PRE
修改了lmhosts文件之后,你可以运行命令nbtstat -R来重新清除NetBIOS名字缓存以及重新装载lmhosts文件。您会注意到上面的lmhosts文件中有的记录后面有#PRE,有的没有。有#PRE表示这一条纪录在lmhosts文件被装载之后会被加到NetBIOS名字缓存中,而且不会过期。下面就是在重新装载上面这个lmhosts文件之后,NetBIOS名字缓存里的内容:
Local Area Connection:
Node IpAddress: [10.60.11.70] Scope Id: []
NetBIOS Remote Cache Name Table
Name Type Host Address Life [sec]
------------------------------------------------------------
BJ-FILESERVER <03> UNIQUE 10.54.94.117 -1
BJ-FILESERVER <00> UNIQUE 10.54.94.117 -1
BJ-FILESERVER <20> UNIQUE 10.54.94.117 -1
SH-FILESERVER <03> UNIQUE 10.54.91.123 -1
SH-FILESERVER <20> UNIQUE 10.54.91.123 -1
Windows上的名字解析(5)
使用lmhosts文件可能会遇到与hosts文件类似的问题,如果lmhosts文件有错误的记录会导致不能正确访问目的计算机。
动态查询NetBIOS名字
如果在NetBIOS名字缓存中不能找到想查询的NetBIOS名字,Windows会根据计算机的节点类型来决定接下来如何查询。我们有必要来介绍一下节点类型。你在运行了命令ipconfig /all之后会看到节点类型(Node Type):
Windows IP Configuration
Host Name . . . . . . . . . . . . : seal
Primary Dns Suffix . . . . . . . : shanghai.contoso.com
Node Type . . . . . . . . . . . . : Mixed
IP Routing Enabled. . . . . . . . : No
WINS Proxy Enabled. . . . . . . . : No
DNS Suffix Search List. . . . . . : shanghai.contoso.com
contoso.com
这个节点类型决定了Windows如何从网络上去解析一个NetBIOS名字。共有如下四种节点类型:
B节点(Broadcast):只在本地网络发广播包来查询NetBIOS名字
P节点(Point to Point):只向WINS服务器查询NetBIOS名字
M节点(Mixed):首先尝试广播查询,如果查询失败,再向WINS服务器查询
H节点(Hybrid):首先向WINS服务器查询NetBIOS名字,如果查询失败,再广播查询
这里需要介绍一下WINS服务器,它的全称是Windows Internet Name Service 。WINS服务器提供NetBIOS名字查询服务。如果您的计算机配置了WINS服务器,您的计算机就会在WINS服务器上注册它的NetBIOS名字和IP地址。其他计算机查询WINS服务器就可以知道您的计算机的IP地址了。您运行命令nbtstat -n可以看到您的计算机注册的NetBIOS名字:
Local Area Connection:
Node IpAddress: [10.60.11.70] Scope Id: []
NetBIOS Local Name Table
Name Type Status
---------------------------------------------
SEAL <00> UNIQUE Registered
CONTOSO <00> GROUP Registered
SEAL <20> UNIQUE Registered
Windows上的名字解析(6)
查询lmhosts文件
如果查询NetBIOS名字缓存和通过网络做NetBIOS名字解析都失败,Windows会读lmhosts文件来解析NetBIOS名字。我们已经知道lmhosts文件中有#PRE后缀的纪录会被装载到NetBIOS名字缓存中,现在Windows只会检查那些没有#PRE后缀的纪录。
如果前面三个步骤都解析失败,那么NetBIOS名字解析就失败了。
示例
在了解了两类名字解析之后,我们来看看在Windows上ping 的过程是如何的。我们还是假设当前计算机的DNS后缀搜索列表为shanghai.contoso.com和contoso.com,节点类型是M节点,所有的缓存以及lmhosts和hosts文件都是空的。
如果ping上海的文件服务器sh-fileserver,它的全名是sh-fileserver.shanghai.contoso.com,会有以下过程:
查询DNS客户端缓存及hosts文件,查询失败
向DNS服务器查询FQDN sh-fileserver.shanghai.contoso.com,查询成功
返回sh-fileserver的IP地址
如果ping北京总部的文件服务器bj-fileserver,它的全名是bj-fileserver. contoso.com,会有以下过程:
查询DNS客户端缓存及hosts文件,查询失败
向DNS服务器查询FQDN bj-fileserver.shanghai.contoso.com,查询失败
向DNS服务器查询FQDN bj-fileserver. contoso.com,查询成功
返回bj-fileserver的IP地址
如果ping一个不存在的名字fake-server,会有如下过程:
查询DNS客户端缓存及hosts文件,查询失败
向DNS服务器查询FQDN fake-server.shanghai.contoso.com.,查询失败
向DNS服务器查询FQDN fake-server. contoso.com. ,查询失败
查询NetBIOS名字缓存,查询失败
广播查询NetBIOS名字fake-server <00>,查询失败
向WINS服务器查询NetBIOS名字fake-server <00>,查询失败
查询lmhosts文件,查询失败
最终名字解析失败

网友评论