名称解析

从主机名获取因特网地址的过程称为名称解析,由 gethostbyname 子例程完成。

将因特网地址转换为主机名的过程称为反向名称解析,由 gethostbyaddr 子例程完成。

当进程接收到符号主机名并需要将其解析为地址时,它将调用解析器例程。

运行 TCP/IP 的主机上的解析器例程尝试使用以下源解析名称:
  • BIND/DNS (域名服务器,已命名)
  • 网络信息服务 (NIS)
  • 本地 /etc/hosts 文件

为了解析域网络中的名称,解析器例程首先查询域名服务器数据库,如果主机是域名服务器,那么该数据库可能是本地的,或者可能位于外部主机上。 名称服务器将域名转换成为因特网地址。 名称服务器负责的名称组是它的权限区域。 如果解析例程正在使用一个远程名称服务器,那么例程使用域名协议 (DOMAIN) 来查询映射。 要在平面网络中解析名称,那么解析器例程检查 /etc/hosts 文件中的条目。 使用 NIS 时,将检查主服务器上的 /etc/hosts 文件。

缺省情况下,解析器例程使用以上的资源试图解析名称。 将首先尝试 BIND/DNS。 如果 /etc/resolv.conf 文件不存在或如果 BIND/DNS 无法找到此名称,那么查询 NIS(如果它正在运行)。 如果 NIS 没有运行,那么搜索本地 /etc/hosts 文件。 如果这些服务都找不到名称,那么解析器例程将返回HOST_NOT_FOUND。如果所有服务都不可用,那么解析器例程将返回SERVICE_UNAVAILABLE.

可以通过创建配置文件 /etc/netsvc.conf 并指定期望的顺序来覆盖缺省顺序。 可以使用环境变量 NSORDER覆盖缺省值和 /etc/netsvc.conf 。 如果定义了 /etc/netsvc.conf 文件或环境变量 NSORDER ,那么必须随选项一起至少指定一个值。

要使用 /etc/netsvc.conf 文件指定主机排序:

hosts = value,value,value 

其中value是列出的源之一。

NSORDER 环境变量指定主机顺序:

NSORDER=value,value,value

在以逗号分隔的值的一行上指定顺序。 在冒号和等号之间可以有空格。 指定的值及其排序取决于网络配置。 例如,如果本地网络组织为平面网络,那么只有 /etc/hosts 文件是必需的。

etc/netsvc.conf 文件将包含以下行:

hosts=local
NSORDER 环境变量将设置为:

NSORDER=local

如果本地网络是使用名称服务器做名称解析的域网络并有 /etc/hosts 文件做备份,那么应该同时指定两种服务。

etc/netsvc.conf 文件将包含以下行:

hosts=bind,local
NSORDER 环境变量将设置为:

NSORDER=bind,local
注: 列出的值必须为小写。
将尝试列表中的第一个源。 如果以下情况,算法将尝试另一个指定的服务:
  • 当前服务未在运行,因此不可用
  • 当前服务找不到名称且没有授权。

如果 /etc/resolv.conf 文件不存在,那么会将 BIND/DNS 视为未设置或正在运行,因此不可用。 如果子例程 getdomainnameyp_bind 失败,那么假定 NIS 服务未设置或正在运行,因此不可用。 如果无法打开 /etc/hosts 文件,那么本地搜索是不可能的,因此文件和服务不可用。

列示为 权威 的服务意味着它是其后继者的专家,并且应该具有所请求的信息。 (其他服务可能仅包含权威服务中的一部分信息。) 即使未找到名称,在尝试列出为权威的服务之后,名称解析也将结束。 如果权威服务不可用,那么将查询指定的下一个服务,否则解析器例程将返回HOST_NOT_FOUND.

使用字符串指定了授权服务=auth直接跟在一个值后面。 整个词authoritative可以输入,但只能输入 auth将使用。 例如, /etc/netsvc.conf 文件可以包含以下行:

hosts = nis=auth,bind,local

如果 NIS 正在运行,那么无论是否找到该名称,都将在 NIS 查询后结束搜索。 如果 NIS 未在运行,那么将查询下一个源,即 BIND。

TCP/IP 名称服务器使用高速缓存来降低在远程网络上搜索主机名的成本。 名称服务器不会在每次发出请求时重新搜索主机名,而是会查看其高速缓存以查看最近是否解析了主机名。 由于域和主机名会发生更改,因此每个项在高速缓存中保留有限的时间长度 (由记录的生存时间 (TTL) 指定)。 用这种方法,权限能指定它们希望名称解析在多长时间里是精确的。

在 DOMAIN 名称服务器环境中,从命令行或 rc.net 文件格式使用 hostname 命令设置的主机名必须是名称服务器返回的主机的正式名称。 通常该名称是主机的完整域名,按以下格式:

host.subdomain.subdomain.rootdomain

如果主机名不是设置成全限定域名,并且如果系统设置为与 sendmail 程序联合使用域名称服务器,那么必须编辑 sendmail 配置文件(/etc/sendmail.cf)以反映此正式的主机名。 另外,必须为 sendmail 程序设置该配置文件中的域名宏,以便正确运行。

注: /etc/sendmail.cf 文件中指定的域优先于 hostname 命令为所有 sendmail 函数设置的域。

对于处在 DOMAIN 网络中但不是名称服务器的主机,本地域名和域名称服务器在 /etc/resolv.conf 文件中指定。 在域名服务器主机中,本地域和其他名称服务器是在指定守护程序启动时读取的文件中定义的。