据我了解,DNS将域名与存储网站的服务器的IP地址联系起来,这是否意味着每个服务器只能容纳一个网站?如果他们没有,如果同一台服务器上有很多网站,调用服务器的IP地址如何知道我想要哪个网站?
Bob*_*Bob 149
基本上:浏览器在 HTTP 请求中包含域名,因此网络服务器知道请求的是哪个域并可以相应地响应。
以下是您的典型 HTTP 请求是如何发生的:
用户以 形式提供一个 URL http://host:port/path
。
浏览器提取 URL 的主机(域)部分,并在必要时将其转换为 IP 地址,这个过程称为名称解析。这种转换可以通过 DNS 进行,但不是必须的(例如,hosts
常见操作系统上的本地文件绕过 DNS)。
浏览器打开到指定端口的 TCP 连接,或默认为该 IP 地址上的端口 80。
浏览器发送 HTTP 请求。对于 HTTP/1.1,它看起来像这样:
GET /path HTTP/1.1
Host: example.com
Run Code Online (Sandbox Code Playgroud)
(Host
标头是标准的,在 HTTP/1.1 中是必需的。它没有在 HTTP/1.0 规范中指定,但一些服务器无论如何都支持它。)
从这里开始,网络服务器有几条信息可以用来决定响应应该是什么。请注意,单个 Web 服务器可以绑定到多个 IP 地址。
Host
由浏览器在 HTTP 请求的标头中指定。您似乎已经注意到,如今最常见的共享主机设置将多个网站放在一个 IP 地址:端口组合上,仅Host
用于区分网站。
这在 Apache 领域被称为基于名称的虚拟主机,而 Nginx在服务器块中将它们称为服务器名称,而 IIS 更喜欢Virtual Server。
HTTPS 有点不同。在建立 TCP 连接之前,一切都相同,但之后必须建立加密的 TLS 隧道。目标是不泄露有关请求的任何信息。
为了验证服务器是否实际拥有此域,服务器必须发送由受信任的第三方签署的证书。然后浏览器会将此证书与其请求的域进行比较。
这提出了一个问题。如果在收到 HTTP 请求之前需要这样做,服务器如何知道要发送哪个主机(网站)的证书?
传统上,这是通过为每个需要 HTTPS 的网站使用专用 IP 地址(或端口)来解决的。显然,当我们开始耗尽 IPv4 地址时,这会成为问题。
输入SNI(服务器名称指示)。浏览器现在会在 TLS 协商期间传递主机名,因此服务器可以尽早获得此信息以发送正确的证书。在服务器端,配置与 HTTP 虚拟主机的配置方式非常相似。
缺点是主机名现在在加密之前以纯文本形式传递,并且本质上是泄露的信息。考虑到主机名通常会在 DNS 查询中公开,这通常被认为是可以接受的折衷方案。
当服务器不知道您请求的是哪个特定主机时,它会做什么取决于服务器的实现和配置。通常,指定的“默认”、“catchall”或“回退”站点将对所有未明确指定主机的请求提供响应。
这个默认站点可以是它自己的独立站点(通常会显示错误消息),也可以是服务器上的任何其他站点,具体取决于服务器管理员的偏好。
Len*_*nne 91
我对非技术人员有这种解释。
杰克、吉尔和乔住在一个宿舍里,他们没有手机。
在电话簿中,它们都以相同的号码列出。(一个记录)
你拨了号码,有人接了电话;你说“我想和吉尔说话”,然后你就让她上线了。
电话簿中可能没有A记录(电话号码/IP地址),可能只是说“X宿舍”,然后您必须进一步查找X宿舍的号码。这是一个CNAME记录。
如果吉尔不在,你可能会得到
302 吉尔正在拜访彼得,改为给他打电话
400我无法理解你。
451 你违反了限制令。
500 我们的电话系统坏了。
据我了解,DNS将域名与存储网站的服务器的IP地址联系起来,这是否意味着每个服务器只能容纳一个网站?
首先,您需要了解这里有许多不同的概念。
这些东西之间没有一对一的关系。一台服务器可以有多个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,但旧版本需要很长时间才能停止使用。
归档时间: |
|
查看次数: |
11542 次 |
最近记录: |