Skip to content

浏览器URL到网页的流程

要理解浏览器输入URL到显示页面的完整流程,需要串联网络协议、浏览器机制、后端服务(如Java Web)、渲染引擎四大核心模块。以下是逐步骤拆解+深度细节的讲解(结合Java后端场景),总流程可分为14个关键阶段


一、阶段1:URL解析(URL Parsing)

当你在浏览器地址栏输入https://www.example.com:443/path/to/page?name=java#section1时,浏览器首先要拆解URL的结构,提取关键信息:

  • 协议(Scheme)https(决定了应用层协议,如HTTP/HTTPS,也决定了默认端口:HTTP→80,HTTPS→443);
  • 域名(Domain)www.example.com(需要解析为IP地址);
  • 端口(Port)443(HTTPS默认端口,若URL未写则用协议默认值);
  • 路径(Path)/path/to/page(服务器上资源的位置);
  • 查询参数(Query)name=java(键值对,用于向服务器传递额外信息,GET请求会附在URL后);
  • 锚点(Fragment)#section1本地标识,不会发送给服务器,仅用于浏览器滚动到页面指定位置)。

关键细节:锚点不参与网络请求,仅浏览器本地处理;若URL不完整(如输入example.com),浏览器会自动补全协议(默认httphttps)和端口。


二、阶段2:缓存检查(Cache Lookup)

浏览器为了减少网络请求、提升性能,会优先检查本地缓存是否有可用资源。缓存策略分为强缓存协商缓存,规则由HTTP头控制:

1. 强缓存(无需向服务器确认)

  • 判断依据Expires(HTTP/1.0,绝对时间,如Expires: Wed, 21 Oct 2025 07:28:00 GMT)或Cache-Control(HTTP/1.1,相对时间,如Cache-Control: max-age=3600,表示资源1小时内有效)。
  • 逻辑:若当前时间未超过有效期,直接使用缓存资源,不发送任何请求

2. 协商缓存(需要向服务器确认有效性)

  • 触发条件:强缓存过期,或资源设置了Cache-Control: no-cache(必须协商)。
  • 判断依据
    • Last-Modified/If-Modified-Since:资源最后修改时间。浏览器发送If-Modified-Since(上次拿到的Last-Modified值),服务器对比:若未修改,返回304 Not Modified(无响应体,只需更新缓存时间);若修改,返回200 OK(带新资源)。
    • ETag/If-None-Match:资源唯一标识(如哈希值)。浏览器发送If-None-Match(上次拿到的ETag值),服务器对比:一致则304,否则200
  • 优先级ETag > Last-Modified(因为Last-Modified只能精确到秒,无法识别文件内容的微小变化,如修改后又改回)。

关键细节:缓存位置分为内存缓存(Memory Cache)(临时存储,关闭标签页失效)和硬盘缓存(Disk Cache)(持久存储,如Chrome的Cache文件夹)。例如,JS/CSS等大文件存硬盘,图片等小文件存内存。


三、阶段3:DNS域名解析(DNS Resolution)

浏览器需要将域名(www.example.com)转换成IP地址(如192.168.1.1),因为TCP/IP协议仅识别IP。DNS解析是递归查询+迭代查询的结合:

1. 解析流程(从近到远查找缓存)

  1. 浏览器缓存:浏览器会缓存最近访问过的域名-IP映射(如Chrome默认缓存1分钟);
  2. 系统缓存:查本地hosts文件(Windows:C:\Windows\System32\drivers\etc\hosts;Linux:/etc/hosts),若有对应条目直接使用;
  3. 路由器缓存:路由器内置DNS缓存,保存常用域名映射;
  4. ISP DNS服务器:向用户的网络服务商(如电信、联通)的DNS服务器查询(这是递归查询的终点,ISP DNS会帮我们做后续迭代查询);
  5. 根域名服务器(Root DNS):全球共13组,负责返回**顶级域名服务器(TLD)**的IP(如.com的TLD服务器IP);
  6. 顶级域名服务器(TLD):负责返回权威域名服务器的IP(如example.com的权威服务器IP);
  7. 权威域名服务器(Authoritative DNS):最终存储域名的IP映射,返回目标IP(如www.example.com192.168.1.1)。

2. DNS优化

  • DNS预解析:浏览器会自动对页面中的linkscriptimg等标签的域名提前解析(可通过rel="dns-prefetch"手动触发);
  • CDN智能DNS:若资源在CDN上,DNS会返回离用户最近的CDN节点IP(如用户在上海,返回上海CDN节点IP),减少网络延迟;
  • DNS缓存时间:通过TTL(Time To Live)设置,单位秒(如TTL=3600表示缓存1小时)。

关键细节:DNS是UDP协议(因为查询数据量小,无需建立连接),默认端口53;若查询结果过大(超过512字节),会自动切换到TCP。


四、阶段4:建立TCP连接(TCP Three-Way Handshake)

HTTP(或HTTPS)基于TCP协议,因此需要先建立可靠的TCP连接。连接过程是三次握手

三次握手的细节(以客户端C→服务器S为例)

  1. C→S:发送SYN(同步)包,包含初始序列号(seq=x),表示“我要连接你,我的起始序号是x”;
  2. S→C:回复SYN+ACK包,包含服务器的初始序列号(seq=y)确认号(ack=x+1),表示“我收到了你的请求,我的起始序号是y,你下一个应该发x+1”;
  3. C→S:发送ACK包,包含确认号(ack=y+1),表示“我收到了你的回复,你下一个应该发y+1”。

为什么是三次?

  • 第一次:客户端确认服务器“能收”;
  • 第二次:服务器确认客户端“能发能收”;
  • 第三次:客户端确认服务器“能发”;
  • 三次握手确保双方的收发能力正常,避免无效连接(如客户端发送的连接请求超时后,服务器才响应,此时客户端已放弃,但服务器仍建立连接,浪费资源)。

HTTPS的额外步骤:TLS握手

若协议是HTTPS,则在TCP三次握手后,需要建立TLS加密连接(TLS是SSL的升级版),流程如下:

  1. 客户端Hello:发送支持的TLS版本(如TLS 1.3)、加密套件(如AES-256-GCM)、随机数client_random
  2. 服务器Hello:选择双方都支持的TLS版本和加密套件,发送随机数server_random服务器证书(包含公钥,由CA签名);
  3. 客户端验证证书:检查证书的有效期、签名(通过CA根证书链)、域名匹配(证书中的CNSAN是否包含目标域名);
  4. 生成会话密钥:客户端生成预主密钥(pre_master_secret),用服务器公钥加密后发送给服务器;
  5. 协商会话密钥:双方用client_randomserver_randompre_master_secret生成会话密钥(session key)(对称加密密钥,用于后续通信加密);
  6. 加密通信确认:双方发送Finished消息(用会话密钥加密),确认加密通道建立成功。

关键细节:TLS 1.3简化了握手流程(从6次交互减少到3次),提升了性能;HTTPS的核心是加密(保护数据机密性)、认证(确认服务器身份)、完整性(防止数据篡改)


五、阶段5:发送HTTP请求(HTTP Request)

TCP连接建立后,浏览器会向服务器发送HTTP请求报文,报文结构分为三部分:

1. 请求行(Request Line)

格式:方法 路径 协议版本,例如: GET /path/to/page?name=java HTTP/1.1

  • 方法(Method):常用的有GET(获取资源)、POST(提交数据)、PUT(更新资源)、DELETE(删除资源)、OPTIONS(查询服务器支持的方法,用于CORS跨域);
  • 路径(Path):URL中的路径+查询参数(如/path/to/page?name=java);
  • 协议版本HTTP/1.1(主流)、HTTP/2(多路复用)、HTTP/3(基于QUIC,UDP协议)。

2. 请求头(Request Headers)

键值对格式,传递额外信息,常用头:

  • Host:目标域名(如Host: www.example.com,HTTP/1.1要求必须包含,用于虚拟主机部署,即一台服务器多个域名);
  • Cookie:客户端保存的Cookie(如Cookie: JSESSIONID=abc123,用于身份认证);
  • User-Agent:浏览器/设备信息(如Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36);
  • Accept:浏览器支持的资源类型(如Accept: text/html,application/xhtml+xml);
  • Accept-Encoding:浏览器支持的压缩格式(如Accept-Encoding: gzip, deflate, br,服务器会用这些格式压缩响应体,减少传输量);
  • Connection:是否保持连接(Connection: keep-alive,HTTP/1.1默认开启,复用TCP连接,减少握手次数)。

3. 请求体(Request Body)

POSTPUT等方法有,用于传递数据(如表单数据、JSON),例如: name=java&age=18(表单格式,Content-Type: application/x-www-form-urlencoded)或{"name":"java","age":18}(JSON格式,Content-Type: application/json)。

关键细节

  • GET请求的参数在URL中,请求体为空;
  • POST请求的参数在请求体中,更安全(但仍需加密,如HTTPS);
  • HTTP/2用二进制帧代替文本格式,支持多路复用(同一个TCP连接中并行发送多个请求,无HTTP/1.1的“队头阻塞”问题)。

六、阶段6:服务器处理请求(Server Side Processing,Java Web场景)

请求到达服务器后,Java Web应用的处理流程由Servlet容器(如Tomcat、Jetty)主导,核心是Servlet规范(Java EE的一部分)。以下是详细流程:

1. 容器接收请求

  • Tomcat监听指定端口(如8080),当TCP连接建立后,Tomcat的Acceptor线程接收请求,交给Worker线程池处理;
  • 容器解析HTTP请求报文,生成HttpServletRequest(请求对象)和HttpServletResponse(响应对象)。

2. 路径匹配(映射到Servlet)

容器根据请求的**路径(Path)**找到对应的Servlet(Java类,实现javax.servlet.Servlet接口),映射规则有两种:

  • web.xml配置:在web.xml中用<servlet><servlet-mapping>标签配置,例如:
    xml
    <servlet>
      <servlet-name>MyServlet</servlet-name>
      <servlet-class>com.example.MyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
      <servlet-name>MyServlet</servlet-name>
      <url-pattern>/path/to/page</url-pattern>
    </servlet-mapping>
  • 注解配置:用@WebServlet注解(Servlet 3.0+支持),例如:
    java
    @WebServlet("/path/to/page")
    public class MyServlet extends HttpServlet {
      // ...
    }

3. 执行过滤器链(Filter Chain)

在调用Servlet之前,容器会执行过滤器(Filter)(实现javax.servlet.Filter接口),用于统一处理通用逻辑,例如:

  • 字符编码过滤(request.setCharacterEncoding("UTF-8"));
  • 权限验证(检查Cookie中的JSESSIONID是否有效);
  • 日志记录(记录请求的URL、IP、时间)。
  • 过滤器链的执行顺序由web.xml中的<filter-mapping>顺序或@WebFilterorder属性决定。

4. Servlet处理业务逻辑

Servlet的生命周期由容器管理:

  1. 初始化(init):容器首次加载Servlet时调用init()方法(仅一次),用于初始化资源(如连接数据库);
  2. 处理请求(service):容器调用service()方法,根据请求方法(GET/POST)转发到doGet()doPost()
  3. 销毁(destroy):容器关闭时调用destroy()方法,释放资源(如关闭数据库连接)。

业务逻辑示例doGet()方法):

java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  // 1. 获取请求参数
  String name = request.getParameter("name"); // 从查询参数或表单中获取
  // 2. 调用业务层(Service)
  UserService userService = new UserService();
  User user = userService.getUserByName(name);
  // 3. 调用数据访问层(DAO)(Service内部)
  // UserDAO userDAO = new UserDAO();
  // userDAO.selectByName(name);
  // 4. 生成响应
  response.setContentType("text/html;charset=UTF-8");
  PrintWriter out = response.getWriter();
  out.write("<html><body>");
  out.write("<h1>Hello " + user.getName() + "!</h1>");
  out.write("</body></html>");
}

5. 数据访问层(DAO)操作数据库

Java中操作数据库的方式:

  • JDBC:原生API,需要手动加载驱动、创建连接、执行SQL(如PreparedStatement防止SQL注入);
  • MyBatis:半ORM框架,通过XML或注解映射SQL和Java对象;
  • Hibernate:全ORM框架,自动生成SQL,映射Java对象到数据库表。

JDBC示例

java
public class UserDAO {
  public User selectByName(String name) {
    String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC";
    String user = "root";
    String password = "123456";
    try (Connection conn = DriverManager.getConnection(url, user, password);
         PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE name = ?")) {
      stmt.setString(1, name);
      ResultSet rs = stmt.executeQuery();
      if (rs.next()) {
        return new User(rs.getInt("id"), rs.getString("name"), rs.getInt("age"));
      }
    } catch (SQLException e) {
      e.printStackTrace();
    }
    return null;
  }
}

6. 转发(Forward)或重定向(Redirect)

  • 转发request.getRequestDispatcher("/another-page.jsp").forward(request, response),是服务器内部跳转,浏览器地址栏不变,请求对象可共享(request.setAttribute()传递数据);
  • 重定向response.sendRedirect("/another-page.jsp"),是客户端跳转,服务器返回302 Found状态码和Location头,浏览器重新发送请求到新地址,地址栏改变,请求对象不共享。

七、阶段7:服务器返回HTTP响应(HTTP Response)

Servlet处理完业务逻辑后,容器会生成HTTP响应报文,结构与请求报文对应:

1. 响应行(Response Line)

格式:协议版本 状态码 状态描述,例如: HTTP/1.1 200 OK

  • 状态码:三位数字,代表响应结果:
    • 1xx(信息):临时响应,如100 Continue(客户端继续发送请求体);
    • 2xx(成功):请求成功,如200 OK(正常返回)、201 Created(资源创建成功);
    • 3xx(重定向):需要客户端进一步操作,如301 Moved Permanently(永久重定向)、302 Found(临时重定向)、304 Not Modified(协商缓存命中);
    • 4xx(客户端错误):请求有误,如400 Bad Request(参数错误)、401 Unauthorized(未认证)、403 Forbidden(无权限)、404 Not Found(资源不存在);
    • 5xx(服务器错误):服务器故障,如500 Internal Server Error(代码报错)、502 Bad Gateway(网关错误,如反向代理后后端不可用)、503 Service Unavailable(服务器过载)。

2. 响应头(Response Headers)

常用头:

  • Content-Type:响应体的类型和编码(如Content-Type: text/html;charset=UTF-8image/jpegapplication/json);
  • Content-Length:响应体的长度(字节数,如Content-Length: 1024);
  • Set-Cookie:设置客户端Cookie(如Set-Cookie: JSESSIONID=abc123; Path=/; HttpOnly; SecureHttpOnly防止JS窃取Cookie,Secure仅HTTPS传输);
  • Cache-Control:缓存策略(如Cache-Control: max-age=3600);
  • Access-Control-Allow-Origin:跨域允许的源(如Access-Control-Allow-Origin: *,允许所有域,用于CORS)。

3. 响应体(Response Body)

服务器返回的实际资源,如:

  • HTML:<!DOCTYPE html><html><body><h1>Hello Java!</h1></body></html>
  • CSS:body { background-color: #f0f0f0; }
  • JS:console.log("Hello Java!");
  • 图片:二进制数据(如JPEG、PNG)。

八、阶段8:关闭TCP连接(TCP Four-Way Handshake)

HTTP响应完成后,需要关闭TCP连接(四次挥手),因为TCP是全双工协议(双方可同时发送数据),所以需要四次交互:

四次挥手的细节(C→S)

  1. C→S:发送FIN(结束)包,seq=x,表示“我没有数据要发送了,关闭我的发送通道”;
  2. S→C:回复ACK包,ack=x+1,表示“我收到了你的关闭请求,等我处理完剩余数据”;
  3. S→C:发送FIN包,seq=y,表示“我也没有数据要发送了,关闭我的发送通道”;
  4. C→S:回复ACK包,ack=y+1,表示“我收到了你的关闭请求,连接可以关闭了”。

为什么是四次?

  • 第一次:客户端告诉服务器“我要关发送了”;
  • 第二次:服务器确认“好的,我知道了,你等我”;
  • 第三次:服务器告诉客户端“我也关发送了”;
  • 第四次:客户端确认“好的,关吧”;
  • 四次挥手确保双方都完成了数据传输,避免数据丢失。

关键细节:HTTP/1.1默认开启Keep-AliveConnection: keep-alive),即复用TCP连接(同一域名的多个请求共用一个TCP连接),减少挥手次数,提升性能;HTTP/2的多路复用更进一步,同一连接可并行发送多个请求。


九、阶段9:浏览器解析响应(Response Parsing)

浏览器收到响应后,需要解析响应体(如HTML、CSS、JS),生成可渲染的结构。核心是渲染引擎(如Chrome的Blink、Firefox的Gecko)的工作。

1. 解析HTML生成DOM树(DOM Tree)

  • 词法分析(Tokenization):将HTML字符串拆分成Token(标签、属性、文本、注释等),例如<h1 class="title">Hello</h1>会被拆成StartTag(h1, class=title)Text(Hello)EndTag(h1)
  • 语法分析(Parsing):将Token组装成DOM节点Document Object Model,文档对象模型),建立父子关系(如html是根节点,headbody是子节点,h1body的子节点)。

关键细节

  • HTML解析是增量解析(边下载边解析),无需等待整个HTML下载完成;
  • 遇到<script>标签(无defer/async)会阻塞DOM解析(因为JS可能修改DOM,如document.write()),因此建议将JS放在<body>底部,或用defer(延迟执行,DOM解析完成后执行)、async(异步执行,下载完成后立即执行,不阻塞DOM解析)。

2. 解析CSS生成CSSOM树(CSSOM Tree)

  • CSSOM(CSS Object Model)是CSS的对象表示,包含所有样式规则(选择器、属性值),例如body { background-color: #f0f0f0; }会被解析为一个规则:选择器body,属性background-color#f0f0f0
  • 优先级计算:CSS规则的优先级由** specificity**( specificity)决定,顺序是:!important > 内联样式(style属性) > ID选择器(#id) > 类选择器(.class) > 标签选择器(tag) > 通配符(*) > 继承样式;
  • 样式计算:每个DOM节点会继承父节点的样式(如bodyfont-family会被所有子节点继承),并应用自身的样式。

关键细节

  • CSS解析是并行的(不会阻塞DOM解析),但会阻塞渲染(因为渲染需要DOM+CSSOM);
  • 遇到@import阻塞CSS解析(需要下载导入的CSS文件),因此建议用<link>代替@import

十、阶段10:合成渲染树(Render Tree)

渲染树是DOM树与CSSOM树的结合,仅包含需要显示的节点(隐藏节点不会出现在渲染树中):

  • 过滤掉display: none的节点(visibility: hidden的节点会保留,因为它占据空间);
  • 过滤掉<head>中的节点(如<title><style>,除非有display: block);
  • 为每个DOM节点附加对应的CSS样式(如h1font-size: 24pxcolor: #333)。

十一、阶段11:布局(Layout,又称回流Reflow)

布局是计算渲染树中每个节点的几何信息(位置、大小)的过程,也叫回流(因为修改DOM或样式会导致布局重新计算)。

布局的流程

  1. 根节点(html):计算根节点的大小(默认是视口大小,即浏览器窗口的大小);
  2. 子节点:从根节点开始,递归计算每个子节点的宽(width)、高(height)、边距(margin)、内边距(padding)、边框(border)、位置(top/left/right/bottom)
  3. 流式布局:HTML默认是流式布局(Flow Layout),即元素从左到右、从上到下排列,块级元素(divp)占满父元素宽度,行内元素(spana)按内容宽度排列。

触发回流的操作

  • 修改DOM结构(如添加/删除节点);
  • 修改样式(如widthheightmargindisplay);
  • 窗口resize;
  • 读取某些属性(如offsetWidthoffsetHeightscrollTop,因为需要立即计算最新值,触发强制同步布局)。

十二、阶段12:绘制(Paint,又称重绘Repaint)

绘制是将渲染树中的节点转换为像素的过程(即“画”到屏幕上)。绘制的内容包括:

  • 背景颜色(background-color);
  • 边框(border);
  • 文本(font-sizecolor);
  • 图片(img标签);
  • 阴影(box-shadow)。

绘制的流程

  1. 分层:渲染引擎会将渲染树分成多个图层(Layer)(如videocanvastransform属性的元素会生成单独图层);
  2. 绘制每个图层:对每个图层进行像素填充(如先画背景,再画边框,最后画文本);
  3. 合并图层:将所有图层合并成一个图像(但现代浏览器会在合成阶段合并)。

触发重绘的操作

  • 修改不影响布局的样式(如colorbackground-colorbox-shadow);
  • 滚动页面(需要重新绘制可见区域的像素)。

关键细节:回流必然导致重绘,但重绘不一定导致回流(如修改颜色只触发重绘)。


十三、阶段13:合成与显示(Composite & Display)

合成是将绘制好的图层合并成最终图像,并发送给GPU(图形处理器)显示在屏幕上的过程。

合成的优势

  • 分层渲染:单独图层的修改不会影响其他图层(如transform: translate(100px, 0)仅修改该图层的位置,无需回流和重绘,直接合成);
  • GPU加速:图层的合成由GPU处理(GPU擅长并行计算),提升渲染性能。

关键细节:CSS的transformopacity属性修改会触发合成层更新(不会回流/重绘),是性能最优的动画方式(如transition: transform 0.3s)。


十四、阶段14:后续操作(Post-Rendering)

页面显示后,浏览器还会处理以下操作:

  1. 加载静态资源:解析HTML时遇到的<link>(CSS)、<script>(JS)、<img>(图片)、<video>(视频)等标签,会异步发送请求加载资源(图片、视频等资源不会阻塞DOM解析,但JS会阻塞,除非用defer/async);
  2. 执行JS:若script标签无defer/async,会在DOM解析到该标签时执行;若有defer,会在DOM解析完成后执行;若有async,会在下载完成后立即执行;
  3. 处理事件:监听用户交互事件(如点击、滚动),执行对应的JS逻辑(如element.addEventListener('click', function() { ... }));
  4. 更新页面:JS可能修改DOM或样式(如document.getElementById('title').innerText = 'New Title'),触发回流→重绘→合成的流程,更新页面显示。

总结:完整流程全景图

URL解析 → 缓存检查 → DNS解析 → TCP三次握手(HTTPS加TLS握手) → 发送HTTP请求 → 服务器处理(Servlet容器→Filter→Servlet→Service→DAO→数据库) → 返回HTTP响应 → TCP四次挥手 → 解析HTML生成DOM树 → 解析CSS生成CSSOM树 → 合成渲染树 → 布局(回流) → 绘制(重绘) → 合成与显示 → 加载静态资源/执行JS/处理事件

Java工程师需要关注的点

  1. Servlet容器:Tomcat/Jetty的工作原理(请求处理流程、线程池配置);
  2. Servlet规范:Servlet的生命周期、HttpServletRequest/HttpServletResponse的使用;
  3. Filter与Listener:Filter处理通用逻辑(编码、权限),Listener监听应用/会话/请求的生命周期;
  4. 数据访问:JDBC的使用(PreparedStatement防止SQL注入)、MyBatis/Hibernate的映射;
  5. 性能优化
    • 缓存:使用Cache-Control/ETag优化静态资源缓存;
    • 连接复用:HTTP/1.1的Keep-Alive、HTTP/2的多路复用;
    • 减少回流/重绘:用transform代替top/left,批量修改DOM;
  6. 跨域处理:通过@CrossOrigin注解或Filter设置Access-Control-Allow-Origin头;
  7. 安全
    • HTTPS:配置SSL证书(如Let's Encrypt),使用HttpOnly/Secure Cookie;
    • 防止SQL注入:用PreparedStatement代替字符串拼接;
    • 防止XSS:对用户输入进行转义(如HtmlUtils.htmlEscape())。

常见面试延伸问题

  1. 为什么JS会阻塞DOM解析?:因为JS可能修改DOM(如document.write()),浏览器必须等待JS执行完成才能继续解析;
  2. HTTP/1.1的队头阻塞(Head-of-Line Blocking):同一TCP连接中,前一个请求未完成,后面的请求必须等待;
  3. HTTP/2的多路复用如何解决队头阻塞?:用二进制帧和流(Stream),同一连接中多个请求并行发送,互不干扰;
  4. HTTPS为什么比HTTP安全?:HTTPS通过TLS加密数据,防止窃听、篡改、冒充;
  5. Cookie和Session的区别?:Cookie是客户端存储(键值对),Session是服务器端存储(通过Cookie的JSESSIONID关联);
  6. 什么是回流和重绘?如何优化?:回流是布局计算,重绘是像素绘制;优化方法:减少DOM操作、用transform代替top/left、批量修改DOM(DocumentFragment)。

以上就是从URL输入到页面显示的完整流程+深度细节,涵盖了网络、浏览器、Java后端的核心知识点。理解这个流程,不仅能应对面试,更能在实际开发中(如性能优化、问题排查)快速定位问题。

Last updated: