名称解析
从主机名获取因特网地址的过程称为名称解析,由 gethostbyname 子例程完成。
将因特网地址转换为主机名的过程称为反向名称解析,由 gethostbyaddr 子例程完成。
当进程接收到符号主机名并需要将其解析为地址时,它将调用解析器例程。
- 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 ,那么必须随选项一起至少指定一个值。
hosts = value,value,value
其中value是列出的源之一。
NSORDER=value,value,value
在以逗号分隔的值的一行上指定顺序。 在冒号和等号之间可以有空格。 指定的值及其排序取决于网络配置。 例如,如果本地网络组织为平面网络,那么只有 /etc/hosts 文件是必需的。
hosts=local
NSORDER=local
如果本地网络是使用名称服务器做名称解析的域网络并有 /etc/hosts 文件做备份,那么应该同时指定两种服务。
hosts=bind,local
NSORDER=bind,local
- 当前服务未在运行,因此不可用
- 当前服务找不到名称且没有授权。
如果 /etc/resolv.conf 文件不存在,那么会将 BIND/DNS 视为未设置或正在运行,因此不可用。 如果子例程 getdomainname 和 yp_bind 失败,那么假定 NIS 服务未设置或正在运行,因此不可用。 如果无法打开 /etc/hosts 文件,那么本地搜索是不可能的,因此文件和服务不可用。
列示为 权威 的服务意味着它是其后继者的专家,并且应该具有所请求的信息。 (其他服务可能仅包含权威服务中的一部分信息。) 即使未找到名称,在尝试列出为权威的服务之后,名称解析也将结束。 如果权威服务不可用,那么将查询指定的下一个服务,否则解析器例程将返回HOST_NOT_FOUND.
hosts = nis=auth,bind,local
如果 NIS 正在运行,那么无论是否找到该名称,都将在 NIS 查询后结束搜索。 如果 NIS 未在运行,那么将查询下一个源,即 BIND。
TCP/IP 名称服务器使用高速缓存来降低在远程网络上搜索主机名的成本。 名称服务器不会在每次发出请求时重新搜索主机名,而是会查看其高速缓存以查看最近是否解析了主机名。 由于域和主机名会发生更改,因此每个项在高速缓存中保留有限的时间长度 (由记录的生存时间 (TTL) 指定)。 用这种方法,权限能指定它们希望名称解析在多长时间里是精确的。
host.subdomain.subdomain.rootdomain
如果主机名不是设置成全限定域名,并且如果系统设置为与 sendmail 程序联合使用域名称服务器,那么必须编辑 sendmail 配置文件(/etc/sendmail.cf)以反映此正式的主机名。 另外,必须为 sendmail 程序设置该配置文件中的域名宏,以便正确运行。
对于处在 DOMAIN 网络中但不是名称服务器的主机,本地域名和域名称服务器在 /etc/resolv.conf 文件中指定。 在域名服务器主机中,本地域和其他名称服务器是在指定守护程序启动时读取的文件中定义的。