我很好奇 /etc/hosts 条目在 Linux 和其他 *nix 平台上的匹配方式如何(如果有任何区别)。
我特别有兴趣了解“比赛时间”是否与条目数量成正比。
找到第一个匹配后,“匹配”就停止了吗?或者即使已经找到匹配项它也会使用所有条目?
非常感谢
答案1
在Linux下,/etc/hosts是解析直到匹配解决条目。这也是是如何处理的1983 年发布的 4.3 BSD 是现代 Unix IP 堆栈的第一个通用版本。
重要的是要记住,在 4.3 BSD 时,连接互联网的主机的整个列表都保存在一个集中的网络信息中心并编号仅约325。连接的主机将从 NIC 检索互联网上每个主机的列表,并且通过几百行的线性搜索就足够了。大约在这个时候,IETF 意识到这无法很好地扩展,因此提出域名系统。此后,如果 /etc/hosts 中有超过几百行,那么您就“做错了”。
还要注意 /etc/hosts 由 libc(一个用户空间库)处理。内核不知道任何东西存在,除了sockaddr
。因此,这个答案仅适用于 /etc/hosts 的处理,并且特别忽略了总体名称解析器系统,这些系统的缓存行为和时间复杂度差异很大。
答案2
/etc/hosts 匹配如何工作?
它取决于/etc/nsswitch.conf
并/etc/host.conf
决定是否读取信息/etc/hosts
正如@msw所说,由libc(一个用户空间库)处理,它读取nsswitch.conf并读取Tag“主机:文件 dns“ , 然后文件意味着阅读/etc/hosts
和域名服务器方法/etc/resolve.conf
现在假设你点击了http://www.google.com在火狐浏览器中,
- 然后 Firefox 首先在本地解析器( libresolve.so )的帮助下解析 google.com,然后
- 首先检查优先级文件和域名服务器,
- 默认情况下,它将在文件中搜索“/etc/hosts”,
- 如果 google.com 不匹配,那么它将引用“/etc/resolv.conf”,在此文件中,它会检查标签(
nameserver
如果未配置),然后解析器将 dns 查询发送到端口 53 上的本地主机, - 如果名称服务器定义假设
nameserver 8.8.8.8
,那么它将发送查询到例如。dig google.com @8.8.8.8
。当然,现在我们可以从公共 dns 获取查询的 ans。
编辑 1 用户还可以使用“HOSTALIASES”变量维护自己的主机文件,因此在读取 /etc/hosts 之前它将首先检查此文件。
前任。
echo "fb www.fb.com" >> ~/my_hosts
echo "export HOSTALIASES=~/my_hosts" >> ~/.bashrc
source ~/.bashrc
答案3
您需要的 2 个函数是gethostbyname()
和gethostbyaddr()
,描述于http://linux.die.net/man/3/gethostbyname如果您仍然有nslookup
可用的,请尝试在例如 上使用它nslookup www.google.com
。您会发现一个名称可能会导致不同的 IP 地址。另一种方式也正常,同一个IP地址可能指向不同的主机名。要验证这一点,只需将 IP 地址和主机名添加到 /etc/hosts 并使用上述功能进行检查。