据我了解,DNS 服务器“只是”在某种表中查找并找到与您尝试访问的域相关联的 IP 地址。然后,IP 地址将返回到您的浏览器,浏览器将向该 IP 地址发出一些 http 请求,然后您将获得返回的 http 响应(网页)。
当我查找或跟踪 wikipedia.org 的 IP 地址时,我得到的结果是:91.198.174.192
但是当我尝试直接访问该 IP 地址时,我无法获得正常的 wikipedia.org 首页,而是访问了维基媒体基金会中的某个“母”服务器。
因此,显然除了原始 IP 地址之外,还必须映射一些额外信息。有人能解释一下服务器如何知道区别吗?
答案1
这里有多件事在起作用。
对于网站来说,DNS 会将域名转换为 IP 地址,这样客户端就知道要与哪个服务器进行通信。由于 IP 空间不足,多个网站可以托管在一个服务器上,因此浏览器需要额外告诉服务器它想要哪个网站(这是 http 1.1 规范的一部分,它扩展了不执行此操作的古老 1.0 规范)。客户端发送给服务器的特定字段(第一个字段之一)是 Host: 标头。事实上,如果您通过 telnet 连接到给定的 IP 地址,然后键入“GET /path/to/resource.file”host:domain.name,如果请求成功,http 网站将返回 HTML 结果。
然而,DNS 比仅仅将域名映射到 IP 地址要复杂得多,包括多种查找以方便任意文本字段(方便垃圾邮件管理、站点验证和其他事情)、邮件交换优先级、支持它的服务的服务器/端口分配、重定向和委派。
答案2
您的浏览器在 HTTP 请求中包含了它想要从服务器获取的域和文档。例如,www.wikipedia.com/index.html。服务器可以运行多个网站,并且需要这些信息来了解您想要查看哪个网站和哪个页面。如果您输入'http://91.198.174.192/',您的请求不会发送任何域名或页面。如果服务器没有默认域名,那么您将看到错误。在这种情况下,默认域名是一个小错误网站。
答案3
您的问题中的示例涉及两个映射实例:
- DNS 中的映射
- 虚拟主机映射
在 DNS 方面,规范的 DNS 主机名 <-> IP 地址映射只是其中一种可能性,它被称为“A 记录”(或 IPv6 的 AAA),但还存在其他记录类型,其中最突出的是 MX 记录,它保存了如果您想向域中的地址发送电子邮件时要联系哪个邮件服务器的信息。当然还有许多其他记录,例如 SOA(授权起始)和 NS(名称服务器)记录,它们将 DNS 系统分布式数据库中的域树结构结合在一起。
虚拟主机映射是一种完全独立于 DNS 的机制,允许(自 HTTP 1.1 版起)在同一 IP 地址上托管不同的 WWW 域。它的工作原理是您的浏览器访问从 DNS 获取的 IP 地址,但另外发送主持人: 标头与请求的域一致。这就是为什么您在浏览器中直接调用 IP 地址时得到意外答案的原因:地址相同,但主持人:标头不同。