Windows操作系统上的一些名字解析

时间:2022-07-03 14:51:23

介绍

当您打开计算机开始访问网络资源时,就涉及到一个问题:名字解析,名字解析就是把需要访问的计算机名字解析成 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 域控制器会有一个后缀为 0x 1C 的 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 客户端缓存里的纪录。

下面是 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%system32 drivers etc 目录下。如果您知道一个主机名字所对应的 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 文件里,这样可以避免不少问题。

查询 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 后缀搜索列表,如下图:

Windows操作系统上的一些名字解析

如果查询 DNS 服务器还是失败,那么主机名字解析就失败了。


NetBIOS 名字解析

下面我们来讲讲 NetBIOS 名字解析。 Windows 解析 NetBIOS 名字时按照以下顺序的。

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 <00> UNIQUE 10.54.91.123 -1

SH-FILESERVER <20> UNIQUE 10.54.91.123 -1

使用 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

查询 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 文件,查询失败

最终名字解析失败