Skip to content

输入 URL 并 enter 时,到底发生了什么?

示意图

DNS解析

DNS(Domain Name System)服务器解析过程

  • 当你在浏览器中输入一个 URL 比如www.example.com时,我们需要先找到它对应的IP地址:这个过程被称为DNS解析域名系统解析

  • 缓存查找过程

    • 浏览器缓存: 首先,浏览器会检查它的缓存中是否有这个域名的记录,因为之前访问的网址的解析结果可能会储存在浏览器缓存中。
    • 操作系统缓存: 如果浏览器缓存中没有找到,浏览器会询问操作系统,因为操作系统也可能有自己的 DNS 缓存。
    • 路由器缓存: 如果操作系统中也没有找到,请求会发送到本地网络中的路由器,它同样可能有自己的 DNS 缓存。
    • ISP(Internet service provider)缓存: 如果以上都没有缓存记录,请求最终会发送到你的互联网服务提供商,他们通常会有更大范围的 DNS 缓存。
  • DNS 递归解析: 如果所有本地缓存查找都失败,DNS 查询就变成了一个递归查询过程,涉及到多个 DNS 服务器:

    • 根域名服务器: 首先,你的 DNS 查询会被发送到根域名服务器。根服务器是最高级别的 DNS 服务器,负责重定向到负责管理顶级域名(如.com.net等)的顶级域名服务器。
    • 顶级域名服务器(TLD 服务器): 根服务器会告诉你的 ISP 的 DNS 服务器去查询哪个顶级域名服务器来找到.com域的信息。这个服务器掌握所有.com域名及其相应的服务器的信息。
    • 权威域名服务器: 一旦你的 DNS 查询到达了正确的顶级域名服务器,它会进一步定向到负责example.com的权威服务器。权威服务器有该域名对应的具体IP地址。

IP 地址获取和缓存

IP 地址的获取: 最终,权威域名服务器会提供www.example.com域名对应的IP地址(如图中的93.184.216.34),这个信息会被发送回用户的电脑。

DNS解析

缓存结果: 一旦 IP 地址被找到,它通常会被存储在浏览器、操作系统、路由器或 ISP 的 DNS 缓存中,以便未来的查询可以更快得到解析。

建立 TCP 连接

  • TCP (Transmission Control Protocol, 传输控制协议),TCP 是一种面向连接的协议,用于在网络中的两个端点之间建立可靠的会话。
  • 以下是 TCP 连接建立过程,通常称为三次握手(TCP 3-way handshake):
  • SYN(Synchronize):
    • 客户端发送一个 SYN 包到服务器以初始化一个连接。
    • 客户端设置一个随机的序列号,告诉服务器它准备开始发送数据。
    • 序列号不仅仅是在握手期间使用的,后续传输数据也会用到,用来保证数据的完整性和顺序。
  • SYN-ACK(Synchronize-Acknowledgment):
    • 服务器接收到客户端的SYN包后,会发送一个SYN-ACK包作为响应。 -服务器同样设置一个随机的序列号,并将客户端的序列号加一,发送回给客户端,确认已经收到了客户端的同步请求(+1 表示服务器确认收到)
  • ACK(Acknowledgment):
    • 客户端收到服务器的SYN-ACK后,发送一个ACK包作为回应。
    • 这个 ACK 包将服务器的序列号加一,并可能包含客户端准备发送的数据的开始部分(比如HTTP请求行GET/HTTP/1.1和请求头,这个被称之为 TCP 快速打开)。
    • 此时,TCP 连接已经建立,双方可以开始数据传输。

发送 HTTP 请求

  • HTTP (Hypertext Transfer Protocol, 超文本传输协议)
    • 它是建立在 TCP 连接之上的应用层协议。(这里不展开网络的分层架构)
HTTP 工作流程如下:

DNS解析

  • 客户端请求:
    • 一旦 TCP 连接建立,客户端(通常是 Web 浏览器)就可以通过这个连接发送一个HTTP请求到服务器。
    • 这个请求包含了方法(GET、POST 等)、URI(统一资源标识符)和协议版本,以及可能包含的请求头和请求体。
  • 服务器响应:
    • 服务器接收到 HTTP 请求后,会处理这个请求并返回一个HTTP响应
    • 响应通常包括一个状态码(如 200 表示成功,404 表示未找到),响应头,以及任何响应内容(如请求的 HTML 文件)。

TCP 为 HTTP 提供了一个可靠的通道,确保数据正确完整地从服务器传输到客户端。