据我所知,DNS 将域名与网站所在服务器的 IP 地址关联起来,这是否意味着每台服务器只能容纳一个网站?如果不是这样,如果同一台服务器上有多个网站,如何通过调用服务器的 IP 地址知道我想要哪个网站?
答案1
基本上:浏览器在 HTTP 请求中包含域名,因此 Web 服务器知道请求了哪个域并可以做出相应的响应。
HTTP 请求
典型的 HTTP 请求的发生方式如下:
用户提供一个 URL,格式为
http://host:port/path
。浏览器会提取 URL 的主机(域)部分,并在必要时将其转换为 IP 地址,这个过程称为名称解析。此转换可以通过 DNS 进行,但不一定如此(例如,
hosts
常见操作系统上的本地文件会绕过 DNS)。浏览器在该 IP 地址上打开到指定端口(或默认为端口 80)的 TCP 连接。
浏览器发送 HTTP 请求。对于 HTTP/1.1,它看起来像这样:
GET /path HTTP/1.1 Host: example.com
(该
Host
标头是标准的,并且在 HTTP/1.1 中是必需的。它未在 HTTP/1.0 规范中指定,但某些服务器仍然支持它。)
从这里开始,网络服务器可以使用多条信息来决定响应内容。请注意,单个网络服务器可以绑定到多个 IP 地址。
- 来自 TCP 套接字的请求的 IP 地址
- 客户端的 IP 地址也可用,但很少使用 - 有时用于阻止/过滤
- 来自 TCP 套接字的请求端口
- 请求的主机名,如
Host
浏览器在 HTTP 请求的标头中指定的。 - 请求的路径
- 任何其他标头(cookie 等)
您似乎已经注意到,目前最常见的共享主机设置将多个网站放在单个 IP 地址:端口组合上,只是Host
为了区分网站。
这被称为基于名称的虚拟主机在 Apache 领域,而 Nginx 则称它们为服务器块中的服务器名称并且 IIS 更喜欢虚拟服务器。
那么 HTTPS 呢?
HTTPS 略有不同。在建立 TCP 连接之前,一切都相同,但此后必须建立加密的 TLS 隧道。目标是不泄露有关请求的任何信息。
为了验证服务器确实拥有该域名,服务器必须发送由受信任的第三方签名的证书。然后浏览器会将此证书与其请求的域名进行比较。
这就带来了一个问题,如果服务器需要在收到 HTTP 请求之前发送证书,那么服务器如何知道要发送哪个主机(网站)的证书呢?
传统上,这个问题的解决方法是为每个需要 HTTPS 的网站提供专用的 IP 地址(或端口)。显然,随着 IPv4 地址开始用尽,这将成为问题。
进入信噪比(服务器名称指示)。浏览器现在在 TLS 协商期间传递主机名,因此服务器可以提前获得此信息以发送正确的证书。在服务器端,配置与 HTTP 虚拟主机的配置方式非常相似。
缺点是主机名在加密之前以纯文本形式传递,本质上是泄露的信息。考虑到主机名通常会在 DNS 查询中暴露,这通常被认为是可以接受的权衡。
如果您仅通过 IP 地址请求站点会怎样?
当服务器不知道您请求哪个特定主机时,它会做什么取决于服务器的实现和配置。通常,会指定一个“默认”、“通用”或“后备”站点,它将为所有未明确指定主机的请求提供响应。
该默认站点可以是它自己的独立站点(通常显示错误消息),也可以是服务器上的任何其他站点,具体取决于服务器管理员的偏好。
答案2
对于非技术人员,我有这样的解释。
杰克、吉尔和乔住在宿舍,他们没有手机。
在电话簿中,它们都以相同的号码列出。(A 记录)
您拨打电话号码,然后有人接电话;您说“我想和吉尔通话”,然后她就接通了电话。
电话簿中可能只显示“X 宿舍”,而不是 A 记录(电话号码/IP 地址),那么您必须进一步查找 X 宿舍的号码。这是一条 CNAME 记录。
如果 Jill 不在,你可能会得到
- 404 Jill 不在
- 410 吉尔死了。
- 301 Jill 搬去和 Peter 同住
302 Jill 正在拜访 Peter,请给他打电话
400 我不明白你的意思。
- 401 你是谁?密码是什么?或晚上 10 点后我们不允许男性来电
- 402 需要付款(你确定 Jill 是她的真名吗 ;-))
- 403 不,这不是正确的密码。
- 418 吉尔是一把茶壶:-)
- 429 吉尔无法再接听任何电话。
451 您正在违反您的限制令。
500 我们的电话系统坏了。
答案3
据我了解,DNS 将域名与存储网站的服务器的 IP 地址链接起来,这是否意味着每个服务器只能容纳一个网站?
首先,您需要了解这里有许多不同的概念。
- 网站,一组构成连贯整体的网页。
- IP 地址,互联网协议用作流量源或目的地的数字地址(IPv4 为 32 位,IPv6 为 128 位)。
- 服务器,其职责是响应客户端的请求。
- 主机名,用于在 DNS 中标识机器的名称(例如“www.example.com”或“en.wikipedia.org”)
这些之间不存在一对一的关系。一台服务器可以有多个 IP 地址;多个主机名可以指向一个 IP 地址;一个主机名可以指向多个 IP 地址。多个网站可以位于同一个主机名下。一个网站可以分布在多个主机名上。
如果没有的话,如果同一台服务器上有多个网站,那么如何通过调用服务器的 IP 地址知道我想要哪个网站?
在过去(HTTP 1.0 及之前),服务器需要以不同方式处理的每个主机名都必须有自己的 IP 地址。这相当浪费。
HTTP 1.1Host
在 HTTP 请求中添加了“标头”作为必填字段(IIRC 一些供应商以前曾将其作为扩展支持)。这告诉服务器请求了哪个主机名,从而允许它为同一 IP 地址上的不同主机名提供不同的内容。客户端对 HTTP 1.1 的支持现在无处不在。
不幸的是,SSL(后来的 TLS)增加了一个问题。建立 SSL/TLS 会话需要服务器向客户端提供涵盖所请求主机名的证书,但 HTTP 请求直到 SSL/TLS 会话建立后才会到达。
SubjectAltName
通过使用字段或字段中的通配符,可以让一个证书涵盖多个主机名CommonName
。然而,这会带来管理挑战,尤其是当所涉及的主机名属于不同所有权的域时。
因此 TLS 引入了“服务器名称指示”(SNI) 扩展。使用此扩展,客户端在 TLS 握手过程中将请求的主机名发送给服务器。然后服务器可以提供适当的证书。不幸的是,虽然所有主要 SSL/TLS 实现的当前版本都支持 SNI,但旧版本已经过时了。
答案4
使用 DNS,您可以根据需要为单个 IP 地址分配任意多个名称(在您的hosts 文件例如,您可以简单地用空格分隔每个名称。使用 DNS 服务器,您还可以为单个名称分配多个 IP 地址.它不局限于一对一的关系。
Web 服务器知道要为哪个网站提供服务检查请求的 URL。它会查看请求了哪个域、请求了哪个端口以及使用了哪种协议。这与 DNS 无关,由 HTTP 协议处理。