输入URL地址后按下回车发生了什么

4 阅读8分钟

1、URL地址检测、缓存检查

  • 输入地址后会进行URL地址的纠错和补全,如果地址中有中文还会进行中文转码提取协议、域名、端口、路径等)
  • 缓存检查,在确认输入的是有效URL后,浏览器才会开始检查本地缓存(包括浏览器缓存、系统Hosts文件、本地DNS缓存等)是否已有该资源的缓存副本‌。

2、DNS解析

  • 首先会查看DNS缓存中是否有缓存该域名对应的 IP 地址,有则用无则继续解析。
  • DNS域名解析 解析出对应IP地址。

3、建立TCP连接

  • 进行TCP三次握手,这一过程确保了双方都具备发送和接收数据的能力,为后续的HTTP请求打下可靠基础。

  • 端口选择‌:TCP连接的目标端口通常由URL协议决定:

    • HTTP 默认使用 ‌80‌ 端口;
    • HTTPS 默认使用 ‌443‌ 端口 ‌。
  • HTTPS额外步骤‌:若URL以 https:// 开头,在TCP连接建立后,还需进行 ‌TLS/SSL握手‌,用于协商加密算法、交换密钥并验证服务器身份 。

  • 连接复用优化‌:现代浏览器可能复用已有的TCP连接(通过 Connection: keep-alive 头),避免重复三次握手,提升性能。

  • 流程说明:

    • 1、 如果只是HTTP请求则只有TCP三次握手建立连接(好比:修好一条安全的马路)
    • 2、 如果是https请求,则在TCP连接建立后,还要进行TLS/SSL握手(好比:在连接上叠加安全,在这条马路上搭建一个加密的安全隧道)
    • 3、 HTTPS通信是在安全通道中进行加密的HTTP数据传输(好比:最后让你的数据车辆在隧道里安全行驶)

4、准备请求头

  • 请求头中的这些参数用于向服务器传递客户端信息、协商响应内容格式、管理连接与缓存等。
    • Host‌:指定目标服务器的域名和端口号,是 HTTP/1.1 协议中‌必需‌的字段,用于虚拟主机区分。
    • User-Agent‌:标识客户端类型(如浏览器名称、版本、操作系统),帮助服务器返回适配的内容(如移动端或 PC 端页面。
    • Accept‌:声明客户端可接收的内容类型(MIME 类型),如 text/htmlapplication/json,用于内容协商。
    • Cookie‌:携带之前由服务器通过 Set-Cookie 设置的会话信息,用于维持登录状态等。
    • Cache-Control‌:指令缓存行为,如 no-cache(不使用缓存)、max-age=3600(缓存 1 小时)等,影响性能与一致性。
    • 等等不再一一列举。

5、发送请求头

6、服务器响应

在这一过程中服务器可能会涉及:数据库查询、调用第三方 API、用户认证与权限校验、会话管理等生成响应内容。

7、处理响应头

处理响应头‌是服务器返回 HTTP 响应的关键环节。当浏览器接收到服务器发回的 HTTP 响应后,会首先解析响应头

  • 解析状态行‌:响应头的第一行是状态行,包含 HTTP 版本、状态码(如 200、301、404)和状态描述(如 OK、Not Found)。浏览器根据状态码决定后续行为(例如重定向、错误提示等)‌。
    HTTP1.1 连接复用策略 多个请求按照顺序使用同一个连接,减少挥手开销;
    HTTP2.0 多路复用策略 多个请求并行使用一个连接;
  • 读取关键响应头字段‌:
  • Content-Type:告知浏览器响应体的数据类型(如 text/htmlapplication/json),用于决定如何解析和渲染内容‌29。
    • Set-Cookie:若存在,浏览器会将 Cookie 存储到本地,后续请求会自动携带‌。
    • Location:用于重定向(如 301、302),浏览器会自动发起新请求‌。
      301和302 都表示重定向,需要进一步操作完成请求;
      301 永久性转移
      场景:
      (1)网站迁移或重定向到新的域名。
      (2)永久性地将某个页面或资源移动到新的路径。
      302 临时性转移,最终还会回归原先地址。
      场景:
      系统临时维护、调整等
      304 请求的资源未被修改,客户端可以使用本地缓存的版本。 常见场景
      (1)客户端请求了一个资源,但该资源自上次请求以来未被修改。
      (2)用于优化性能,减少不必要的数据传输。
    • Cache-Control / Expires:指示资源是否可缓存及缓存时间,影响浏览器缓存策略‌。
      浏览器缓存:强缓存 Cache-Control / Expires
      协商缓存:ETag/if-none-match 是HTTP1.1产物, last-modified/if-modified-since是HTTP1.0产物
    • Connection:决定是否保持 TCP 连接(如 keep-alive 或 close)‌是否保持长连接。

8、收响应体及渲染

资源加载解析HTML,这一部分完成后会得到DOM树 和CSSOM树

  • 遇到link href css样式下载和解析不会影响主线程渲染,会继续解析后续HTML,因为下载和接续css的工作在预解析线程中进行,所以css不会阻塞HTML解析。
  • js 若主线程遇到script,会停止解析HTML等待JS文件下载好并将全局代码执行完成,才能继续HTML解析,因为JS代码执行可能会修改dom树,所以dom树生成必须暂停,顾JS会阻塞HTML解析。
  • 若为图片、字体等资源,则发起额外请求加载,一般不会影响HTML解析;
    • 补充: 解析过程中可能会涉及:资源描述符
    • script:资源描述符<script 此efer/ansyn ></script>
      async 异步下载文件,下载过程不阻塞解析,但是下载完成后会暂停HTML解析,优先执行脚本,执行完成后才会再继续HTML解析。不保证顺序,谁先下载完谁先执行。特点:下载不阻塞解析,执行阻塞解析,且不保证循序。
      defer 异步下载脚本,下载过程不阻塞解析,下载后不会立即执行,会放到延迟执行队列中,会等待HTML解析完成才执行脚本。特点:下载不阻塞解析,执行阻塞解析,html解析完成后才执行,且按照脚本顺序执行。
    • css:资源描述符 <link rel="repload/prefetch" ></link> repload: 预加载,必须指定as属性(告诉浏览器资源类型以便设置正确的优先级和缓存策略),当前页面肯定要用的资源,高优先级,时机:提前加载与当前页面资源同等优先级。场景:当前页面需要的字体,关键css、首屏图片
      prefetch:预获取 下一个页面可能需要的资源,低优先级加载,时机:浏览器空闲时加载,场景:下一个页面需要的资源用户可能访问的页面资源

style样式计算 (computed style)

主线程遍历DOM树后,依次为树中节点计算出最终样式,会得到一棵带有样式的DOM树。(这一过程预设值会变成绝对值,如:rem 变成px);

layout 布局,完成后得到布局树

遍历DOM树,计算每个节点的几何信息,如宽高,相对包含块的位置,大部分时候DOM树和布局树并非一一对应。
如:
1、display:none; 没有集合信息,生成DOM树,但是没有布局树
2、伪元素,在DOM树中不存在,但它们有几何信息,所以会在布局树中
3、匿名行盒、匿名块盒等等会导致DOM树和布局树无法一一对应,因为它的布局规则:css中有行盒块盒:1)内容只能放到行盒中 2)、行盒块盒不能相邻

layer 分层

主线程会使用一套特殊的策略对整个布局树进行分层
好处:若某一次修改仅对该层进行处理,从而提升效率。
补充滚动条、堆叠上下文、transform、opacity等样式都会多少影响分层结果,也可用will-change:"transform"改变 .
优化:若发现某块渲染效率低,或总是改变则可以考虑使用分层will-change。will-change可做性能优化,提前告知浏览器元素未来的变化。通过创建独立的合成层,让GPU加速渲染。

paint 绘制

根据分层绘制渲染指令paint,主线程会为每个层单独产生指令,用于描述这一层的内容该如何画出来
————这步之后会交给合成线程。 完成绘制后,主线程会将每个图层的绘制信息提交给合革线程,剩余工作由合成线程完成。

tiling 分块

将每一层分为多个小的区域,会优先分并画靠近视口区域的块。合成线程会对每个图层进行分块,划分为更多小区域

raster 光栅化

光栅化是将每个块变成位图,也就是变成像素点,优先处理靠近视口的块。光栅化在GPU中进行,会开启多个线程来完成光栅化。

draw 画

合成线程计算出每个位图在屏幕上的位置,交给GPU进行最终呈现,这时会考虑旋转、缩放、变形等
优化 :
变形等发生在合成线程,与渲染主线程无关,这就是transform效率高的原因

最后经过沙河等一列操作,在电脑屏幕上显示

9、四次挥手

会根据情况决定是否要断开连接。 如果设置了Connection: keep-alive则需要保持长连接。


以上就是学习整理的输入URL之地后按下回车发生了什么的问题,若有错误,欢迎指正,互相学习