On this page
public
浏览器输入url并按下回车后,期间发生了什么
浏览器输入url并按下回车后,期间发生了什么
考察点分析
这道题目主要考察:
- 网络协议相关知识(DNS、TCP、HTTP等)
- 浏览器工作原理
- 页面渲染流程
技术解析
关键知识点
- URL 解析
- DNS 查询
- TCP 连接
- HTTP 请求/响应
- 浏览器渲染
原理剖析
浏览器输入 URL 到页面显示的完整过程如下:
URL 解析
- 浏览器解析 URL 的组成部分(协议、域名、路径等)
- 检查 URL 是否合法
- 进行 URL 编码
DNS 解析
- 首先查找浏览器 DNS 缓存
- 然后查找操作系统 DNS 缓存
- 查找本地 hosts 文件
- 向 DNS 服务器发起递归查询
- 最终获取目标服务器的 IP 地址
TCP 连接建立
- 进行三次握手
- 如果是 HTTPS,还需要 TLS 握手
发送 HTTP 请求
- 构建 HTTP 请求报文
- 添加请求头部信息
- 发送请求数据
服务器处理请求并响应
- 服务器接收请求
- 处理请求
- 返回响应结果
浏览器解析渲染页面
- 解析 HTML,构建 DOM 树
- 解析 CSS,构建 CSSOM 树
- 合并 DOM 树和 CSSOM 树,生成渲染树
- 布局(Layout)
- 绘制(Paint)
常见误区
DNS 解析过程理解不完整
- 误认为 DNS 解析只查询一次
- 忽略了浏览器和操作系统的 DNS 缓存
TCP 连接理解片面
- 只知道三次握手,不了解具体细节
- 忽略了 HTTPS 场景下的 TLS 握手
页面渲染过程理解不够深入
- 混淆 DOM 树和渲染树的概念
- 不了解回流(reflow)和重绘(repaint)的区别
问题解答
当用户在浏览器中输入 URL 并按下回车后,会经历以下主要阶段:
- 浏览器解析输入的 URL,获取协议、域名、路径等信息
- 通过 DNS 解析获取目标服务器的 IP 地址
- 与服务器建立 TCP 连接(如果是 HTTPS 还需要 TLS 握手)
- 发送 HTTP 请求
- 接收服务器响应
- 解析并渲染页面内容
解决方案
为了优化这个过程,可以采取以下措施:
DNS 优化
- 使用 DNS 预解析(dns-prefetch)
- 部署 DNS 缓存服务器
网络优化
- 使用 CDN 加速
- 开启 HTTP/2
- 配置合适的缓存策略
页面渲染优化
- 减少重排重绘
- 使用异步加载
- 资源压缩
深度追问
1. DNS递归查询和迭代查询的区别是什么?
递归查询:
- 客户端只发出一次请求,由DNS服务器代为查询
- DNS服务器必须返回最终结果(IP地址或错误信息)
- 整个查询过程对客户端是透明的
- 查询负担在DNS服务器端
迭代查询:
- 客户端发出多次请求,每次查询不同的DNS服务器
- 如果DNS服务器没有目标域名的记录,会返回下一级DNS服务器的地址
- 客户端需要自己向下一级DNS服务器继续查询
- 查询负担在客户端
2. TCP三次握手中任意一次握手失败会怎样?
第一次握手失败:
- 客户端发送SYN包,但服务器未收到
- 客户端会进行重传,通常最多重试5次
- 重试间隔呈指数增长(1s, 2s, 4s, 8s, 16s)
- 全部失败后,客户端返回"连接超时"错误
第二次握手失败:
- 服务器发送SYN+ACK包,但客户端未收到
- 服务器会创建半连接,进入SYN_RECV状态
- 服务器会重传SYN+ACK包
- 一段时间后,服务器会关闭这个半连接(SYN超时)
第三次握手失败:
- 客户端发送ACK包,但服务器未收到
- 服务器仍处于SYN_RECV状态,等待ACK
- 客户端认为连接已建立,可能开始发送数据
- 服务器会丢弃这些数据,并在超时后关闭连接
3. 浏览器渲染过程中,回流(reflow)和重绘(repaint)的区别是什么?
回流(Reflow):
- 当DOM元素的几何属性(位置、大小)发生变化时触发
- 需要重新计算元素位置和布局
- 影响渲染树中的一部分或全部
- 成本较高,会导致整个渲染树重新计算布局
- 触发条件:添加/删除DOM元素、改变元素尺寸、改变窗口大小等
重绘(Repaint):
- 当元素外观(颜色、背景等)发生变化但不影响布局时触发
- 不需要重新计算元素位置和布局
- 只影响元素的外观
- 成本相对较低
- 触发条件:改变颜色、背景、可见性等
关键区别:回流必定会导致重绘,而重绘不一定会导致回流。回流对性能的影响更大。
4. 如何优化首屏加载速度?
网络优化:
- 使用CDN分发静态资源
- 启用HTTP/2多路复用
- 启用Gzip/Brotli压缩
- 合理设置缓存策略
- 减少HTTP请求数量(合并文件、雪碧图等)
资源优化:
- 压缩和优化图片(WebP格式、响应式图片)
- 压缩JavaScript和CSS文件
- 移除不必要的代码和依赖
- 使用Tree-Shaking减少代码体积
加载策略优化:
- 关键CSS内联到HTML中
- 非关键资源延迟加载
- 使用资源提示(preload、prefetch、preconnect)
- 实现懒加载(图片、组件)
- 代码分割,按需加载
渲染优化:
- 避免阻塞渲染的资源
- 减少DOM节点数量
- 避免复杂的CSS选择器
- 使用骨架屏或加载指示器提升用户体验
5. HTTPS握手过程是怎样的?为什么需要这么多步骤?
HTTPS握手过程:
客户端Hello:
- 客户端发送支持的加密套件列表、随机数、协议版本等
服务器Hello:
- 服务器选择加密套件、发送随机数、协议版本
- 发送服务器证书(包含公钥)
- 发送Server Hello Done消息
客户端验证证书:
- 验证证书有效性和可信度
- 生成预主密钥(Pre-Master Secret)
- 使用服务器公钥加密预主密钥
- 发送加密后的预主密钥
密钥生成:
- 双方使用相同算法,基于预主密钥和之前交换的随机数生成会话密钥
完成握手:
- 客户端发送Change Cipher Spec消息,表示后续使用会话密钥加密
- 客户端发送Finished消息
- 服务器发送Change Cipher Spec消息
- 服务器发送Finished消息
为什么需要这么多步骤:
身份验证:确保服务器身份真实可信,防止中间人攻击
密钥协商:安全地协商出对称加密的密钥,同时不在网络中明文传输
前向安全性:即使私钥泄露,也不会影响之前通信的安全性
防止重放攻击:使用随机数确保每次会话的唯一性
算法协商:确保双方使用兼容且安全的加密算法
完整性保护:确保握手过程中的消息未被篡改
这些步骤共同确保了HTTPS通信的机密性、完整性和认证性,缺少任何一步都可能导致安全漏洞。
Last updated 12 Mar 2025, 09:25 +0800 .