从输入网址到显示页面

The Redefine Team Lv3

从输入网址到显示页面

从在浏览器地址栏输入一个网址(URL)到最终看到页面,这个过程涉及到了计算机网络、操作系统、Web服务器、浏览器内核等方方面面的知识。


概览:核心四大步骤

为了方便理解,我们可以先把整个过程粗略地分为四个核心阶段:

  1. 导航(Navigation):浏览器根据用户输入,准备开始请求页面。核心是DNS查询,将网址(域名)转换成服务器的IP地址。
  2. 连接(Connection):浏览器与目标服务器建立一个可靠的连接,通常是TCP连接,如果是HTTPS网址,还需要进行TLS握手来加密通信。
  3. 请求与响应(Request & Response):浏览器向服务器发送一个HTTP请求,服务器处理后返回一个HTTP响应,响应体里通常包含了页面的HTML代码。
  4. 渲染(Rendering):浏览器接收到HTML后,进行解析,并请求页面所需的CSS、JavaScript、图片等资源,最终将所有内容组合、计算、绘制成我们看到的像素画面。

下面,我们来深入每一个阶段的细节。


步骤一:导航(Navigation) - 从输入到寻址

处理用户输入 (Input Handling)

  • 你开始输入:当你开始在地址栏输入时,浏览器会立即开始工作。它会根据你的输入历史、书签、搜索建议等,提供自动补全功能。
  • 判断输入类型:浏览器会判断你输入的是一个搜索关键词还是一个合法的URL
    • 如果是搜索词(如 “今天天气”),浏览器会将其与默认的搜索引擎(如 https://www.google.com/search?q=今天天气)组合成一个新的URL。
    • 如果是URL(如 example.comhttps://example.com),浏览器会准备导航到这个地址。如果你只输入了 example.com,浏览器会自动为你添加协议,通常是 https://

URL解析 (URL Parsing)

当用户按下回车键,浏览器确认了要导航的URL后,会首先解析这个URL。一个标准的URL结构如下:
https://www.example.com:443/path/to/page?query=string#section1

  • https: 协议 (Protocol/Scheme) - 告诉浏览器用什么方式去访问资源。常见有HTTP, HTTPS, FTP等。
  • www.example.com: 主机名/域名 (Hostname/Domain) - 这是我们要找的服务器在互联网上的名字。
  • :443: 端口 (Port) - 服务器上不同服务的数字“门牌号”。HTTP 默认是 80HTTPS 默认是 443。如果URL中省略了端口,浏览器会使用默认端口。
  • /path/to/page: 路径 (Path) - 请求服务器上哪个具体的文件或资源。
  • ?query=string: 查询字符串 (Query String) - 向服务器传递的额外参数,通常用于动态页面。
  • #section1: 片段/锚点 (Fragment) - 用于定位到页面的特定部分。重要: 这部分内容不会发送给服务器,它完全由浏览器在前端处理。

DNS查询 (DNS Lookup) - 核心中的核心

计算机网络通信只认IP地址(比如 192.0.2.1),不认域名(www.example.com)。因此,浏览器必须先通过DNS(Domain Name System,域名系统)将域名转换成IP地址。这个过程就像查电话本。

DNS查询是一个分级缓存递归查询的过程,为了性能,浏览器会按以下顺序查找:

  1. 浏览器缓存 (Browser Cache):浏览器会先在自己的缓存里找,看最近有没有访问过这个域名。这是最快的一步。
  2. 操作系统缓存 (OS Cache):如果浏览器缓存没有,会查询操作系统的缓存。Windows的ipconfig /displaydns,Linux/Mac的hosts文件都属于这一层。
  3. 路由器缓存 (Router Cache):请求会发送到你的路由器,路由器通常也有自己的DNS缓存。
  4. ISP DNS服务器缓存 (ISP’s DNS Server Cache):如果以上都没有,请求会发送到你的网络服务提供商(ISP,如中国电信、联通)的DNS服务器。这里缓存了大量常用域名的IP地址。

如果连ISP的DNS服务器缓存里也没有,就会触发一个完整的递归查询

a. ISP的DNS服务器 会向 根域名服务器 (Root DNS Server) 发起请求:“请问.com域名的顶级域名(TLD)服务器地址是什么?”
b. 根服务器 回复:“.com的TLD服务器地址是xxx。”
c. ISP的DNS服务器 接着向 .com TLD服务器 发起请求:“请问 example.com 的权威域名服务器(Authoritative Name Server)地址是什么?”
d. TLD服务器 回复:“example.com的权威域名服务器地址是yyy。”
e. ISP的DNS服务器 最后向 example.com的权威域名服务器 发起请求:“请问 www.example.com 的IP地址是什么?”
f. 权威服务器 给出最终的IP地址。
g. ISP的DNS服务器 拿到IP地址后,返回给操作系统,操作系统再返回给浏览器,并各级都会将这个对应关系缓存起来,以便下次快速访问(缓存时间由TTL值决定)。

至此,浏览器终于拿到了目标服务器的IP地址。

步骤二:建立连接 (Connection) - 打通通信管道

建立TCP连接 (Establishing a TCP Connection)

HTTP协议是构建在TCP/IP协议之上的。为了保证数据传输的可靠性,浏览器需要和服务器通过TCP三次握手 (Three-way Handshake) 建立连接。

  1. 第一次握手 (SYN):浏览器(客户端)向服务器发送一个SYN报文,表示“你好,我想和你建立连接”。
  2. 第二次握手 (SYN+ACK):服务器收到后,返回一个SYN+ACK报文,表示“好的,我收到了,我也准备好了”。
  3. 第三次握手 (ACK):浏览器收到后,再发送一个ACK报文,表示“收到了,那我们开始通信吧”。

握手成功后,一个可靠的TCP连接就建立好了。

TLS握手 (TLS Handshake) - 如果是HTTPS

如果你的URL是HTTPS开头的,那么在TCP连接建立之后,还需要进行一个TLS (Transport Layer Security) 握手过程,以建立一个加密信道。这个过程比TCP握手复杂得多:

  1. Client Hello:浏览器发送支持的TLS版本、加密套件列表和一个随机数。
  2. Server Hello:服务器选择一个加密套件,返回它的SSL证书**(包含了服务器的公钥)和另一个随机数。
  3. 证书验证 (Certificate Verification):浏览器会验证服务器的证书是否由受信任的证书颁发机构(CA)签发、是否过期、域名是否匹配。如果验证失败,浏览器会显示一个“不安全”的警告。
  4. 密钥交换 (Key Exchange):浏览器生成第三个随机数(预主密钥),用服务器的公钥加密后发送给服务器。
  5. 生成会话密钥 (Session Key Generation):服务器用自己的私钥解密,得到预主密钥。现在,客户端和服务器都拥有了三个相同的随机数,它们使用这三个数通过一个约定好的算法,各自独立地生成一个完全相同的对称会话密钥
  6. 握手完成 (Finished):双方互相发送一个“Finished”消息,用刚刚生成的会话密钥加密。如果双方都能解密对方的消息,则TLS握手成功。

此后,所有浏览器和服务器之间的HTTP通信都会使用这个对称会话密钥进行加密和解密,确保了数据的机密性和完整性。

步骤三:请求与响应 (Request & Response) - 数据交换

发送HTTP请求 (Sending HTTP Request)

现在,安全的通信管道已经打通,浏览器会构建并发送一个HTTP请求报文。一个典型的GET请求报文包含:

  • 请求行 (Request Line): GET /path/to/page HTTP/1.1 (请求方法、请求路径、协议版本)
  • 请求头 (Request Headers): 包含许多键值对信息,例如:
    • Host: www.example.com (目标主机)
    • User-Agent: Mozilla/5.0 ... (浏览器身份标识)
    • Accept: text/html,application/xhtml+xml,... (浏览器能接收的内容类型)
    • Accept-Language: zh-CN,zh;q=0.9 (偏好的语言)
    • Cookie: name=value;... (携带之前服务器设置的Cookie)
    • Connection: keep-alive (表示希望保持TCP连接,以便后续请求复用)
  • 请求体 (Request Body): 对于GET请求,请求体通常是空的。对于POST请求,这里会包含要提交的数据(如表单信息)。

服务器处理请求并返回响应 (Server Processing & Response)

  • 服务器接收请求:Web服务器(如 Nginx, Apache)接收到这个HTTP请求。
  • 处理请求:服务器可能会将请求转交给一个应用服务器(如 Node.js, Tomcat, PHP),后者会执行相应的业务逻辑,比如查询数据库、生成动态内容等。
  • 构建响应:服务器处理完毕后,会构建一个HTTP响应报文。响应报文包含:
    • 状态行 (Status Line): HTTP/1.1 200 OK (协议版本、状态码、状态描述)。常见的状态码有:
      • 200 OK: 请求成功。
      • 301 Moved Permanently: 永久重定向,浏览器会自动跳转到新地址。
      • 304 Not Modified: 资源未修改,浏览器可以使用本地缓存。
      • 404 Not Found: 服务器上没有找到请求的资源。
      • 500 Internal Server Error: 服务器内部错误。
    • 响应头 (Response Headers): 包含服务器信息和数据描述,例如:
      • Content-Type: text/html; charset=utf-8 (响应内容的类型和编码,非常重要!)
      • Content-Length: 1234 (响应体的大小)
      • Set-Cookie: new_cookie=value;... (让浏览器保存一个新的Cookie)
      • Cache-Control: max-age=3600 (告诉浏览器如何缓存这个资源)
    • 响应体 (Response Body): 包含了请求的实际内容,对于网页请求来说,通常就是HTML源代码。

连接关闭 (Connection Closing)

如果请求头或响应头中包含了 Connection: keep-alive,那么这个TCP连接会保持一段时间,以便浏览器继续用它来请求页面中的CSS、JS、图片等资源。否则,连接会在此次响应后关闭(通过TCP四次挥手)。

步骤四:渲染 (Rendering) - 从代码到图像

浏览器终于拿到了HTML,但离看到五彩斑斓的页面还差最后一步。这是浏览器内核(Rendering Engine,如Chrome的Blink,Firefox的Gecko)的工作。

解析与构建 (Parsing & Building Trees)

  1. 构建DOM树 (DOM Tree):浏览器从上到下解析HTML文档,将HTML标签转换成一个树形结构的对象模型,即文档对象模型 (Document Object Model)<html>是根节点,<body>, <div>, <span>等都是它的子节点。
  2. 构建CSSOM树 (CSSOM Tree):在解析HTML的过程中,如果遇到<link>标签引用外部CSS文件,或者<style>标签里的内联CSS,浏览器会异步下载并解析这些CSS,构建一个类似的树形结构,即CSS规则对象模型 (CSS Object Model)
  3. 执行JavaScript:如果遇到<script>标签,HTML解析会暂停(默认情况下),浏览器会立即下载、解析并执行JavaScript代码。JS代码可能会修改DOM和CSSOM(例如 document.getElementById('...').style.color = 'red')。这就是为什么通常建议把<script>标签放在<body>底部,以避免阻塞页面主要内容的显示。
    • asyncdefer 属性可以改变JS的加载和执行行为,避免阻塞。

渲染过程 (Rendering Process)

  1. 构建渲染树 (Render Tree):浏览器将DOM树和CSSOM树结合起来,生成渲染树。渲染树只包含需要显示的节点及其样式信息(比如display: none的节点就不会出现在渲染树中)。
  2. 布局 (Layout / Reflow):浏览器根据渲染树,计算出每个节点在屏幕上的确切位置和大小(几何信息)。这个过程也叫回流 (Reflow)
  3. 绘制 (Painting / Repaint):布局完成后,浏览器将每个节点转换成屏幕上的实际像素。这个过程会调用底层的图形API来完成,也叫重绘 (Repaint)
  4. 合成 (Compositing):现代浏览器为了优化性能,会将页面分成多个图层(Layers)。一些复杂的动画或变换(如transform, opacity)可以直接在GPU上进行图层合成,而不需要重新布局和绘制,从而大大提高性能。

持续加载

在初步渲染出页面框架后,浏览器会继续加载HTML中引用的其他资源,如图片 (<img>)、字体等。这些资源加载完成后,可能会引起部分区域的回流重绘,最终完整地显示出整个页面。


总结

整个过程可以总结为:

  1. 输入与解析URL:浏览器理解你的意图。
  2. DNS查询:将域名转换为IP地址。
  3. TCP/TLS握手:与服务器建立安全连接。
  4. 发送HTTP请求:告诉服务器我想要什么。
  5. 服务器响应:返回HTML等资源。
  6. 浏览器渲染
    • 解析HTML -> DOM树
    • 解析CSS -> CSSOM树
    • DOM + CSSOM -> 渲染树
    • 计算布局 (Layout)
    • 绘制像素 (Paint)
    • 合成图层 (Composite)
  • 标题: 从输入网址到显示页面
  • 作者: The Redefine Team
  • 创建于 : 2025-06-12 13:26:00
  • 更新于 : 2025-06-27 00:47:20
  • 链接: https://redefine.ohevan.com/2025/06/12/从网址到页面/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论