从输入URL到页面加载完成的过程
输入URL用户发起请求
当用户在客户端输入一个网址如(如 https://www.example.com),浏览器会根据这个操作发起网络请求。
浏览器解析URL
浏览器会解析用户输入的URL
- 协议:例如HTTP或HTTPS
- 主机名:例如www.example.com
- 端口号:例如80或443
- 路径:例如/index.html
- 查询参数:例如?name=example
- 锚点:例如#section
检查缓存
在发起真正的网络请求之前,浏览器会检查以下几处缓存,以节省时间和资源:
- 浏览器缓存:如果之前已经访问过该网站,浏览器可能已经缓存了该资源,直接从缓存中加载。(强缓存、协商缓存)
- 强缓存依赖于请求头的Expires或Cache-Control
- DNS 缓存:浏览器会首先检查是否缓存了该域名对应的 IP 地址,避免重复的 DNS 解析。
- 操作系统的 DNS 缓存:如果浏览器没有缓存 DNS 记录,它会查询操作系统的 DNS 缓存(如 Windows 的 DNS 缓存或 Linux 的 nscd)。
发起DNS请求
如果缓存中没有找到对应的IP地址,浏览器会发起一个DNS请求,将域名解析为IP地址。
构建HTTP/HTTPS请求(应用层)
一旦获取了IP地址,浏览器就可以构建HTTP/HTTPS请求。HTTP请求报文包含以下几个部分:
- 请求行:包含请求方法、请求URL和HTTP协议版本
- 请求头:包含请求的各种信息,如User-Agent、Accept、Cookie等
- 请求体:包含请求的数据,如POST请求的表单数据
建立TCP连接(传输层)
HTTP是基于TCP协议的,因此浏览器需要建立TCP连接。TCP是一种面向连接的协议,它提供可靠的数据传输服务。HTTPS还需要建立TLS连接,TLS是SSL的升级版,提供了更强的安全性。
- 三次握手:客户端和服务器之间需要通过三次握手建立连接。
- 第一次握手:客户端发送一个 SYN 包给服务器,请求建立连接。
- 第二次握手:服务器收到 SYN 包后,回应一个 SYN+ACK 包。
- 第三次握手:客户端收到 SYN+ACK 包后,回应一个 ACK 包。
构建数据包(网络层)
一旦建立了TCP连接,浏览器就可以基于DNS解析得到的IP地址将HTTP请求报文封装成数据包,通过网络层发送给服务器。
数据包在网络中传输(数据链路层)
数据包通过数据链路层的设备(如交换机、网卡)在网络中传输,最终到达服务器。
服务器处理请求,浏览器接受HTTP响应
服务器收到请求后,会根据请求的 URL、
请求头等信息,调用相应的处理程序,如处理静态资源的 Nginx、处理动态资源的 Tomcat。
浏览器渲染
浏览器接收到服务器返回的 HTTP 响应后,会解析响应报文,根据响应头中的 Content-Type 等信息判断响应的类型,然后进行相应的处理。
- HTML:浏览器会解析 HTML,构建 DOM 树。
- CSS:浏览器会解析 CSS,构建 CSSOM 树。
- render tree:浏览器会将 DOM 树和 CSSOM 树合并成一个 render tree。
- 布局:浏览器会根据 render tree 计算每个节点的位置。
- 绘制:浏览器会将 render tree 绘制到屏幕上。
关闭TCP连接(四次挥手)
一旦服务器返回了 HTTP 响应,浏览器会关闭 TCP 连接。
- 四次挥手:客户端和服务器之间需要通过四次挥手关闭连接。
- 第一次挥手:客户端发送一个 FIN 包给服务器,请求关闭连接。
- 第二次挥手:服务器收到 FIN 包后,回应一个 ACK 包。
- 第三次挥手:服务器发送一个 FIN 包给客户端,请求关闭连接。
- 第四次挥手:客户端收到 FIN 包后,回应一个 ACK 包。
总结
以上就是从输入 URL 到页面加载完成的整个过程。在这个过程中,浏览器和服务器之间进行了多次的交互,包括 DNS 解析、建立 TCP 连接、发送 HTTP 请求、处理请求、返回 HTTP 响应等。最终,浏览器会将服务器返回的 HTML、CSS、JavaScript 等资源解析渲染,最终呈现给用户。