3.9. 浏览器访问地址过程
3.9.1. 用户输入与地址解析
用户在浏览器地址栏中输入网址,比如: https://lvjunjie.cn。
浏览器首先会对输入的内容进行解析。如果输入的是域名,浏览器会检查缓存中是否有该域名对应的IP地址。如果有,就可以直接使用;如果没有,就会进入 DNS 查询阶段。
3.9.2. DNS 查询
如果缓存中没有所需域名的 IP 地址,浏览器会启动 DNS 解析过程。
它会先向本地 DNS 服务器(通常由网络运营商提供)发送 DNS 查询请求,询问输入域名对应的 IP 地址。
如果本地 DNS 服务器也不知道该域名的 IP 地址,它会继续向更高级别的 DNS 服务器(如根 DNS 服务器、顶级 DNS 服务器等)进行查询,直到找到对应的 IP 地址。
一旦获取到 IP 地址,就会将其缓存起来,以便下次访问同一域名时可以更快地获取。
3.9.3. 建立 TCP 连接(对于 HTTP/1.1 及以下版本通常需要)
对于 HTTP 协议,浏览器通常使用 TCP 协议进行数据传输。
浏览器会根据获取到的 IP 地址和服务器的默认端口号(通常 HTTP 是 80 端口,HTTPS 是 443 端口),向服务器发起 TCP 连接请求。
服务器接收到连接请求后,会进行响应,经过三次握手过程来建立可靠的 TCP 连接。
3.9.4. 发送 HTTP 请求
TCP 连接建立后,浏览器会构建 HTTP 请求报文。
请求报文包含请求方法(如 GET、POST 等)、请求 URL、HTTP 版本、请求头(包含各种信息,如用户代理、接受的内容类型等)和请求体(如果有,比如 POST 请求的数据)。
浏览器将 HTTP 请求报文通过已建立的 TCP 连接发送到服务器。
3.9.5. 服务器处理请求
服务器接收到 HTTP 请求后,根据请求的 URL 和其他信息来确定如何处理请求。
服务器可能会从文件系统中读取相应的文件(如 HTML、CSS、JavaScript 等),或者执行服务器端脚本(如 PHP、Python、Java 等)来生成动态内容。
服务器在处理请求的过程中,可能还会访问数据库或其他外部资源来获取所需的数据。
3.9.6. 服务器返回 HTTP 响应
服务器处理完请求后,会构建 HTTP 响应报文。
响应报文包含 HTTP 版本、响应状态码(如 200 表示成功、404 表示未找到资源等)、响应头(包含内容类型、内容长度、缓存控制等信息)和响应体(即请求的资源内容或处理结果)。
服务器将 HTTP 响应报文通过已建立的 TCP 连接发送回浏览器。
3.9.7. 浏览器解析渲染页面
浏览器接收到 HTTP 响应后,首先会检查响应状态码。如果是 200 等成功状态码,就开始解析响应内容。
对于 HTML 文档,浏览器会构建 DOM 树(文档对象模型树,描述文档的结构)。同时,也会解析 CSS 文档,构建 CSSOM 树(层叠样式表对象模型树)。
然后将 DOM 树和 CSSOM 树合并成渲染树,它只包含需要显示在页面上的元素和样式信息。
接下来,浏览器会根据渲染树进行布局计算,确定每个元素在页面上的大小和位置。
最后进行绘制,将元素绘制到屏幕上,呈现出完整的页面。
3.9.8. 资源加载(异步)
在页面渲染过程中,如果页面中包含其他资源(如图片、JavaScript 文件、CSS 文件等),浏览器会继续发起请求来获取这些资源。
对于 JavaScript 文件,浏览器会暂停页面渲染,直到 JavaScript 代码下载、解析和执行完成,因为 JavaScript 可能会修改页面的结构和内容。
对于 CSS 文件,虽然不会暂停页面渲染,但会阻塞后续 DOM 内容的显示,直到 CSS 文件下载和解析完成,以确保页面能够正确地应用样式。
Note
随着 Web 技术的发展,一些优化措施如 HTTP/2 的多路复用、预加载、缓存机制等也会在这个过程中发挥作用,以提高页面的加载速度和性能。