浏览器从输入 Url 到展示出页面都经历了哪些过程

本文深入解析从输入域名到浏览器展示页面的全过程,包括域名解析、HTTP请求与响应、TCP三次握手及四次挥手等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章写于 2017 年,首发于微信公众号:字节流动

输入域名

在浏览器输入网址时,浏览器会根据历史记录、书签智能匹配补全域名或者 url 。
例如 chrome 浏览器,甚至会根据匹配结果直接把网页加载出来。

解析域名

请求发起时,浏览器首先解析域名,一般会首先查看本地的 hosts 文件,查找相关域名与 ip 地址的对应规则,若查找到的话,就直接使用 hosts 文件里面的 ip 地址。

若在本地 hosts 文件中,未找到目标域名与 ip 地址的对应关系,浏览器便会向本地 DNS 服务器发起一个 DNS 请求,本地 DNS 服务器收到请求之后,便会查询其缓存记录,若查询到此记录便直接返回结果。

若本地 DNS 服务器缓存中未查询到相关记录,便向 DNS 根服务器进行查询,根 DNS 服务器没有记录具体的域名与 ip 地址的映射关系,而是返回域服务器的地址。

本地 DNS 继续向域服务器发起请求,域服务器收到请求之后,返回域名解析服务器的地址。最后本地 DNS 服务器向域名解析服务器发送请求,域名解析服务器收到请求之后,返回域名与 ip 映射关系信息,然后本地 DNS 服务器将映射信息保存到其缓存中,同时也将 ip 地址返回给用户电脑。

DNS域名系统

浏览器发起 http 请求

浏览器获取到域名对应的 ip 地址之后,便会以一个随机端口(1024< port < 65535)向服务端 web 程序 80 端口发起 TCP 连接请求。

浏览器与服务端经过 3 次 TCP 握手之后,建立 TCP 连接,然后浏览器发起一个 http 请求。一般的浏览器只能发起 GET 或者 POST 请求。

请求信格式包含四个部分:

  1. 请求行(请求方法 URI 协议/版本)
  2. 请求头(缓存、客户端身份信息等)
  3. 空行
  4. 消息体

http 请求格式示例:

GET /index.html HTTP/1.1
Cache-Control:max-age=0
Cookie:gsScrollPos=; _ga=GA1.2.329038035.1465891024; _gat=1
If-Modified-Since:Sun, 01 May 2016 23:59:59 GMT
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36

//消息体

PS:
常用的请求方法有 GET/POST/DELETE/PUT/HEAD 。
三次握手四次挥手示意图

TCP 三次握手的目的是:为了防止已经失效的连接请求报文发送到服务端,服务端因而产生不必要的响应开销

在谢希仁著《计算机网络》第四版中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。在另一部经典的《计算机网络》一书中讲“三次握手”的目的是为了解决“网络中存在延迟的重复分组”的问题。

TCP 四次挥手的目的是:为确保收发双方数据传输的完整性。

那四次分手又是为何呢?TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。如果要正确的理解四次分手的原理,就需要了解四次分手过程中的状态变化。

服务器返回 http 响应

服务端返回 http 响应的格式包含四个部分:

  1. 响应行(状态行)(协议/版本号 状态码 状态说明)
  2. 响应头(响应头是服务器传递给客户端用于说明服务器的一些信息,以及将来继续访问该资源时的策略。)
  3. 空行
  4. 消息体(响应体是服务端返回给客户端的 HTML 文本内容,或者其他格式的数据,比如:视频流、图片或者音频数据。)

http 响应格式示例:

HTTP/1.1 200 OK
Date: Sat, 31 Dec 2016 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 113

<html>
<head>
<title>Haohao</title>
</head>
<body>
Hello World!
</body>
</html>

PS:
服务器在返回响应之前可能会经过重定向、反向代理服务器请求等过程。

浏览器处理响应

以服务端响应消息体为 HTML 文本为例,浏览器解析 HTML 文本时,会”自上而下“加载,并在加载过程中进行解析渲染展现给用户。在解析过程中,如果遇到请求外部资源时,如图片、外链的 CSS 、 js 等,请求过程是异步的,并不会影响整个 HTML 文档的加载。

联系与交流

我的公众号

<think>嗯,用户想了解从浏览器输入地址到页面渲染完成的过程。这个问题看起来挺基础的,但涉及的知识点其实很,需要一步步分解。首先,我得回忆整个流程,确保每个步骤都准确,同时用简单易懂的中文解释清楚。 首先,用户输入URL后,浏览器应该会先处理这个输入。可能包括检查是否有缓存,或者直接开始解析URL。这里可能需要提到URL的结构,比如协议、域名、路径等。然后,DNS解析是关键步骤,把域名转换成IP地址。这里要解释DNS查询的过程,比如浏览器缓存、系统缓存、路由器、ISP的DNS服务器,以及递归查询和权威DNS服务器。 接下来是建立TCP连接,三次握手的过程需要简明扼要地说明,为什么需要三次握手,确保可靠连接。然后是HTTPS的话,可能还要提到TLS握手,这部分可能稍微复杂,但用户可能想知道安全连接的建立过程。 发送HTTP请求的部分,要区分请求方法,比如GET、POST,以及请求头的内容。服务器处理请求时,可能需要提到后端处理,比如Web服务器、应用服务器、数据库交互,然后生成响应。响应状态码如200、404等也是需要提及的。 接收响应后,浏览器如何处理HTML,开始解析和渲染。这部分比较详细,比如构建DOM树、CSSOM树,合并成渲染树,布局计算,绘制页面。还要提到JavaScript的执行可能会阻塞解析,以及优化措施如async和defer属性。 最后,页面渲染完成后的持续过程,比如加载其他资源,事件循环,动态内容更新等。这部分可以让用户了解页面并不是一次性加载完毕,而是有后续处理。 需要注意用户的层级,可能不是技术人员,所以要用比喻或者简单例子,比如把DNS解析比作电话簿查找,三次握手比作打招呼确认双方都能通信。同时,按照系统级指令,数学公式和代码要用正确的LaTeX格式,但这个问题可能涉及较少公式,更的是步骤描述。 另外,检查是否有遗漏的步骤,比如重定向、缓存验证(304状态码),或者CDN的作用。是否需要提到HTTP/2或HTTP/3的影响,比如路复用,减少延迟。不过可能属于进阶内容,用户可能只需要基础流程。 最后确保结构清晰,分步骤说明,每个步骤的小标题明确,用列表或分段让读者容易跟随。同时检查技术术语是否准确,比如渲染树的构建,重排和重绘的区别,但可能不需要深入,保持概述级别。</think>从浏览器输入地址到页面渲染完成的全流程可拆解为以下步骤(以访问 `https://example.com` 为例): #### 一、URL解析与预处理 1. **协议补充**:若用户输入不完整(如 `example.com`),浏览器自动补全协议(`https://`) 2. **编码转换**:非ASCII字符转换为`%`开头的UTF-8编码,如`空格→%20` 3. **安全检查**:检查非法字符,阻止可能的XSS攻击 #### 二、DNS解析(域名→IP地址) 1. **查询顺序**: - 浏览器缓存 → 操作系统缓存 → 路由器缓存 → ISP的DNS服务器 - 若未命中,进行**递归查询**: $$根DNS→.com权威DNS→example.com权威DNS$$ 2. **结果缓存**:TTL决定缓存有效期(通常几分钟到几天) #### 三、建立TCP连接 1. **三次握手**: - 客户端发送`SYN=1, seq=x` - 服务端响应`SYN=1, ACK=1, seq=y, ack=x+1` - 客户端确认`ACK=1, seq=x+1, ack=y+1` 2. **HTTPS特殊处理**:额外进行TLS握手(约2-RTT) #### 四、发送HTTP请求 ```http GET / HTTP/1.1 Host: example.com User-Agent: Mozilla/5.0 Accept: text/html ``` - 现代浏览器默认使用HTTP/2协议(二进制分帧、头部压缩) #### 五、服务器处理 1. **负载均衡**:可能经过CDN节点或反向代理(如Nginx) 2. **动态生成**:PHP/Node.js等后端语言生成HTML 3. **响应返回**: ```http HTTP/1.1 200 OK Content-Type: text/html Cache-Control: max-age=3600 ``` #### 六、浏览器解析与渲染 1. **构建DOM树**: - 边下载HTML边解析 - 遇到`<script>`会阻塞解析(除非标记`async/defer`) 2. **构建CSSOM**: - 解析所有CSS文件(包括`@import`) - 遵循级联规则计算样式 3. **生成渲染树**: - 合并DOM和CSSOM,过滤不可见元素 - 计算布局(重排):$$width = content + padding + border$$ 4. **绘制与合成**: - 分层绘制 → 光栅化 → 合成图层 - 优化策略:仅更新脏矩形区域 #### 七、加载后续资源 1. **并行下载**:通常保持6-8个TCP连接 2. **优先级控制**: - CSS/字体 > 图片 > async脚本 - 使用`preload`预加载关键资源 #### 八、页面可交互 1. **事件绑定**:DOMContentLoaded事件触发 2. **持续优化**: - 空闲时预取后续页面资源 - 实施虚拟滚动等优化策略 #### 关键技术指标 - **FP**(First Paint):首次渲染时间(约1s内优秀) - **TTI**(Time to Interactive):可交互时间(约3s达标) - **LCP**(Largest Contentful Paint):最大内容渲染(2.5s内优秀) 整个过程涉及网络协议栈、渲染引擎、JavaScript引擎(如V8)等个子系统的协作,现代浏览器通过进程架构(每个标签页独立进程)保障安全性与稳定性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

字节流动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值