Web 浏览器如何解析 URL 中的 IP 地址?

Web 浏览器如何解析 URL 中的 IP 地址?

如果我使用“www.example.com”这样的名称访问网页,浏览器将从右到左开始,查看 TLD 以查找域名,然后继续下一步。如果我输入该主机的 IP 地址,浏览器将如何解析它?

答案1

RFC 3986定义如何解析和处理 URL。解析 IPv4 地址非常简单,您只需:

  1. 取出字符串,检查它是否为 abcd,其中 a、b、c 和 d 是 0..255 范围内的数字。
  2. 检查四个数字是否全部为零。(0.0.0.0 不是有效的目标地址。)

解析的每个数字都可以存储在内存中的一个字节中(因此范围是 0..255)。如果您以给定的字节顺序(网络字节顺序)将它们存储在内存中,那么您将获得一个可供网络 API 使用的 4 字节结构。

通常浏览器不需要自己解析地址,只需调用操作系统函数即可。但必须小心(参见RFC 第 7.4 节),一些操作系统函数允许 RFC 不允许的 IPv4 地址表示法。例如 abc(a、b 为 0..255,c 为 0..65536)或仅 a 为 0..2^32-1(IE 曾经支持这一点,但这可能是一个安全问题)。

IPv6 地址的处理非常相似,但是 IPv6 地址使用 : 作为分隔符,更长并且支持使用 :: 而不是 :0: 或 :0:0: 的较短写法。

答案2

您的问题基于错误的假设。

Web 浏览器实际上不会对主机名做任何特殊处理。它会调用解析器库例程,询问“嘿,我得到了这个看起来很奇怪的字符串;你能给我一个我可以实际连接的相应 IP 地址吗?”。实际上,可能涉及几层间接层,因此“地址栏代码”可以简单地将用户输入的整个字符串传递给某个例程,最终触发加载请求的页面。

实际的名称解析通常由编程库提供的名称解析例程处理,这些例程又可能调用操作系统来反过来发出 DNS 请求并将其传递给配置的 DNS 解析服务器。DNS 解析服务器将其分解为它可以直接回答的部分并遵循所涉及的任何委派。这意味着网络浏览器完全不知道该过程。

IP 地址具有特定格式:要么n.n.n.nn0 到 255 之间的数字,要么是方括号内的 IPv6 地址[s0m3:add:re::s:s]。这可以通过编程轻松检测并作为特殊情况处理,只需将 IP 地址转换为二进制形式并使用它来连接到给定的主机即可。有现成的库函数可以进行此类转换,因为通常情况下,字符串中包含 IP 地址(由用户提供、从配置文件中读取或任何其他内容),并且需要连接到该地址。

请注意,以上内容非常笼统。某些操作系统可能提供接受完全合格的 TCP 连接函数主机名直接并代表调用者进行查找;其他可能要求调用者先查找主机名,然后再进行另一个调用以启动 TCP 连接。即便如此,一般过程是相同的;区别仅在于哪段代码负责流程的哪一部分。(即使 connect 调用可以接受主机名,无论如何先将其解析为 IP 地址可能更有利;例如,您可以选择是喜欢 IPv4 还是 IPv6,或者可以应用代理设置。)

答案3

实际上,浏览器不会从右到左解析 URL。它会尝试将其与以下模式匹配:

scheme://domain[:port]/[path][?query_string][#fragment_id]

Scheme 告诉如何处理 URL。如果是httphttps,它将在浏览器内部处理,否则浏览器可能会决定处理它(例如ftp)或将其传递给操作系统提供的外部应用程序(例如mailtoskype以及许多其他应用程序)。

当浏览器从 URL 中提取出域名部分后,它会检查它是否已经是 IP。如果不是,它会查询 DNS 服务器以获取服务器的 IP。

请注意,对于大多数网站来说,简单地用服务器 IP 替换域名是行不通的。这是因为虚拟主机。这是一种允许您在一个 IP 地址上运行多个网站的机制。当 IP 后面的服务器收到 HTTP 请求时,它会检查请求标头以确定客户端想要查看哪个网站。然后它会提供适当的文档。现在,如果服务器198.51.100.1配置为仅接受 的请求example.com,它将不会响应您的请求,http://198.51.100.1/因为域不是example.com

答案4

浏览器只会连接到指定的 IP,无需解析或解析任何内容。

相关内容