字节一面:说说地址栏输入 URL 敲下回车后发生了什么?

前言

最近博主在字节面试中遇到这样一个面试题,这个问题也是前端面试的高频问题,作为一名前端开发工程师,我们只有了解地址栏输入 URL 敲下回车后发生的事件,才知道性能优化如何下手,性能优化也是前端必备知识,博主在这给大家细细道来。


🚀 作者简介:程序员小豪,全栈工程师,热爱编程,曾就职于蔚来、腾讯,现就职于某互联网大厂,技术栈:Vue、React、Python、Java
🎈 本文收录于小豪的前端系列专栏,后续还会更新前端入门以及前端面试的一些相关文章,手把手带你从零学习前端到面试找工作,并如果有想进入前端领域工作的同学,这个前端专栏会对你有所帮助,欢迎关注起来呀
🌼 本人也会持续的去关注AIGC以及人工智能领域的一些动向并总结到博客中,大家感兴趣的可以关注一下我的人工智能专栏
🌊 云原生的入门学习系列,大家有兴趣的可以看一看

一、简单分析

简单的分析,从输入 URL到回车后发生的行为如下:

  • URL解析
  • DNS 查询
  • TCP 连接
  • HTTP 请求
  • 响应请求
  • 页面渲染

二、详细分析

URL解析

首先判断你输入的是一个合法的URL 还是一个待搜索的关键词,并且根据你输入的内容进行对应操作

URL的解析第过程中的第一步,一个url的结构解析如下:

## DNS查询

基本步骤

整个查询过程如下图所示:

1. 浏览器缓存

浏览器会先检查是否在缓存中,没有则调用系统库函数进行查询。

2. 操作系统缓存

操作系统也有自己的 DNS缓存,但在这之前,会向检查域名是否存在本地的 Hosts 文 件里,没有则向 DNS 服务器发送查询请求。

3. 路由器缓存

路由器也有自己的缓存。

4. ISP DNS 缓存

ISP DNS 就是在客户端电脑上设置的首选 DNS 服务器,它们在大多数情况下都会有缓存。

5. 根域名服务器查询

在前面所有步骤没有缓存的情况下,本地 DNS 服务器会将请求转发到互联网上的根域,下面这个图很好的诠释了整个流程:

需要注意的点

  • 递归方式:一路查下去中间不返回,得到最终结果才返回信息(浏览器到本地DNS服务器的过程)
  • 迭代方式,就是本地DNS服务器到根域名服务器查询的方式。
  • 什么是 DNS 劫持
  • 前端 dns-prefetch 优化

TCP连接

在之前文章中,了解到tcp是一种面向有连接的传输层协议

在确定目标服务器服务器的IP地址后,则经历三次握手建立TCP连接,流程如下:

发送 http 请求

当建立tcp连接之后,就可以在这基础上进行通信,浏览器发送 http 请求到目标服务器

请求的内容包括:

  • 请求行
  • 请求头
  • 请求主体

响应请求

当服务器接收到浏览器的请求之后,就会进行逻辑操作,处理完成之后返回一个HTTP响应消息,包括:

  • 状态行
  • 响应头
  • 响应正文
在服务器响应之后,由于现在http默认开始长连接keep-alive,当页面关闭之后,tcp链接则会经过四次挥手完成断开

页面渲染

当浏览器接收到服务器响应的资源后,首先会对资源进行解析:

  • 查看响应头的信息,根据不同的指示做对应处理,比如重定向,存储cookie,解压gzip,缓存资源等等
  • 查看响应头的 Content-Type的值,根据不同的资源类型采用不同的解析方式

关于页面的渲染过程如下:

  • 解析HTML,构建 DOM 树
  • 解析 CSS ,生成 CSS 规则树
  • 合并 DOM 树和 CSS 规则,生成 render 树
  • 布局 render 树( Layout / reflow ),负责各元素尺寸、位置的计算
  • 绘制 render 树( paint ),绘制页面像素信息
  • 浏览器会将各层的信息发送给 GPU,GPU 会将各层合成( composite ),显示在屏幕上

总结

各位看官老爷们好,小豪已经建立了技术交流群,如果你很感兴趣,可以私信我加入我的社群。

📝社群中不定时会有很多活动,例如学习资料分享、大厂面经分享、技术讨论、行业大佬创业杂谈等等。

📝本人目前是在互联网大厂正式工作,也有过多个大厂的工作经历,加入社群也会有简历修改辅导,模拟面试,手把手项目实战教学,大厂工作内推机会以及大厂面试题解析分享等福利。

📝社群方向很多,相关领域有Web全栈(前后端)、人工智能、AIGC、自媒体变现、前沿科技文章分享、论文精读等等。

📝不管你是多新手的小白,都欢迎你加入社群中讨论、聊天、分享,加速助力你成为下一个技术大佬!也随时欢迎您跟我沟通,一起交流,一起成长。变现、进步、技术、资料、项目、你想要的这里都会有

📝网络的风口只会越来越大,风浪越大,鱼越贵!欢迎您加入社群~一个人可以或许可以走的很快,但一群人将走的更远!

📝想都是问题,做都是答案!行动起来吧!欢迎评论区or后台与我沟通交流,也欢迎您扫描下方二维码直接加入到我的交流社群!(微信:adcoderhao)

### 浏览器 URL 输入到页面渲染的完整流程 当用户在浏览器地址栏输入URL并按下回车键后,一系列复杂的操作随即展开。以下是详细的处理过程: #### 1. DNS 查询 一旦接收到有效的URL请求,浏览器会先解析域名对应的IP地址。如果本地DNS缓存中不存在该记录,则发起DNS查询以获取服务器的具体位置信息[^2]。 #### 2. 建立TCP连接 通过三次握手建立与目标Web服务器之间的通信信道。对于HTTPS协议还需要额外完成SSL/TLS加密协商过程。 #### 3. 发送HTTP/HTTPS 请求 构建GET方法的数据包发送给远程主机上的指定端口,默认情况下HTTP使用80端口而HTTPS采用443端口。此阶段还包括设置必要的头部字段如User-Agent、Accept-Language等。 #### 4. 接收响应数据 服务器接收到来自客户端发出的请求之后返回相应的HTML文档以及其他资源文件(CSS样式表、JavaScript脚本)。这些内容通常被分割成多个分片传输回来,在网络状况良好时能够显著提高下载效率。 #### 5. 解析DOM树结构 随着首个字节到达,浏览器开始逐步解释标记语言定义的内容,并将其转换为内部表示形式——即Document Object Model (DOM)对象模型。与此同时还会启动对其他外部依赖项(图片链接、字体描述符)的新一轮异步加载工作。 #### 6. 构建渲染树 基于已有的DOM节点以及关联样式的计算结果形成可视化布局信息。值得注意的是,由于存在动态变化的可能性,某些部分可能暂时无法确定最终形态直到所有必需条件都满足为止。 #### 7. 绘制界面元素 按照上述步骤建立起完整的视觉呈现体系之前,还需经历一次或多次重绘(Repaints) 和 回流(Layout)[^1] 。前者仅涉及颜色属性改变而不影响几何尺寸;后者则意味着整个页面或者局部区域内的空间分配发生变化从而触发重新排列子组件的位置关系。 #### 8. 执行 JavaScript 脚本 在整个过程中间穿插着各种事件监听器注册动作,允许开发者编写交互逻辑控制程序行为。然而需要注意一点:出于性能考虑,现代浏览器往往采取延迟策略尽可能减少不必要的阻塞现象发生[^3]。 #### 9. 启动预加载和预渲染机制 针对未来可能出现的需求提前准备相关联的对象实例化副本放在后台默默运行等待时机成熟即可无缝切换过去继续前进。这类前瞻性措施有助于缩短实际感知时间差提升用户体验满意度水平。 ```javascript // 示例代码展示如何利用link标签实现预加载功能 <link rel="preload" href="/styles.css" as="style"> ```
评论 99
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值