[前端计算机网络]资源加载过程的详细性能信息浏览器加载资源的全过程

article/2025/7/20 22:57:21

资源加载过程的详细性能信息

基于 PerformanceResourceTiming 对象对页面中某个资源加载过程的详细性能信息进行采集与封装,并结合了计算机网络中的请求生命周期进行度量。
在这里插入图片描述

export function observeEvent():void{const type="resource";const entryHandler=(list:PerformanceObserverEntryList,observer:PerformanceObserver):void=>{const data=list.getEntries();for(const entry of data){ observer && observer.disconnect();// Cast to PerformanceResourceTiming to access resource-specific propertiesconst resourceEntry = entry as PerformanceResourceTiming;const reportData = {name: entry.name, // 资源的名字type: 'performance', // 类型subType: entry.entryType, //类型sourceType: resourceEntry.initiatorType, // 资源类型duration: entry.duration, // 加载时间dns: resourceEntry.domainLookupEnd - resourceEntry.domainLookupStart, // dns解析时间tcp: resourceEntry.connectEnd - resourceEntry.connectStart, // tcp连接时间redirect: resourceEntry.redirectEnd - resourceEntry.redirectStart, // 重定向时间ttfb: resourceEntry.responseStart, // 首字节时间protocol: resourceEntry.nextHopProtocol, // 请求协议responseBodySize: resourceEntry.encodedBodySize, // 响应内容大小responseHeaderSize: resourceEntry.transferSize - resourceEntry.encodedBodySize, // 响应头部大小transferSize: resourceEntry.transferSize, // 请求内容大小resourceSize: resourceEntry.decodedBodySize, // 资源解压后的大小startTime: performance.now(),};// TODO:发送数据}  }const observer=new PerformanceObserver(entryHandler);observer.observe({type:type,buffered:true})
}

✅ 目标:

梳理资源加载过程中各阶段的网络开销与性能指标,并解释这段代码中的每个字段,按照计算机网络请求-响应的真实顺序排列分析。


🧩 一、资源加载的网络过程(结合指标顺序)

我们将其还原为浏览器加载资源时实际的网络执行流程,并将你 reportData 中的字段标注进来:


⏱️ 1. redirect - 重定向时间(HTTP 状态 3xx)

redirect = redirectEnd - redirectStart
  • 表示该资源在跳转链中的耗时;
  • 如从 http://a.comhttps://a.com

🌐 2. dns - DNS 查询时间

dns = domainLookupEnd - domainLookupStart
  • 浏览器将域名(如 example.com)解析为 IP 地址;
  • 若启用了本地缓存,时间可能为 0。

🔐 3. tcp - TCP 握手 + TLS 握手时间

tcp = connectEnd - connectStart
  • 包括三次握手 + TLS 握手(如果是 HTTPS);
  • 若启用 keep-alive,这部分也可能为 0。

📥 4. ttfb - 首字节时间(Time to First Byte)

ttfb = responseStart
  • 表示浏览器开始接收到服务器的第一个字节的时间点
  • 包括请求排队、后端处理、网络传输;
  • 越小越好,反映服务器响应速度。

📦 5. responseHeaderSize & responseBodySize

responseHeaderSize = transferSize - encodedBodySize
responseBodySize = encodedBodySize
  • Header 是响应头;
  • Body 是响应内容的压缩大小;
  • transferSize 包括头 + 压缩的 body + 其他元数据;
  • 通过这些可以分析资源是否压缩,是否缓存命中(有时大小为 0)。

📊 6. resourceSize - 解压后的真实内容大小

resourceSize = decodedBodySize
  • 如 gzip 压缩后资源只有 100KB,但解压后为 300KB;
  • 用于真实数据占用的评估。

🔍 7. protocol - 请求使用的协议

protocol = nextHopProtocol
  • 可能值有:h2http/1.1http/3 等;
  • 可以用来分析 HTTP/2 多路复用是否生效。

⌛ 8. duration - 整体加载耗时

duration = entry.duration
  • 完整的资源加载耗时:从发出请求到下载完全部内容;
  • 等于:responseEnd - startTime

📍 9. startTime - 当前时间采集点

startTime: performance.now()
  • 当前调用采集逻辑的相对时间(从 navigationStart 开始);
  • 可用于排序和关联其他性能事件(如 paint)。

🧠 二、附加字段(非网络指标)

name = entry.name
type = 'performance'
subType = entry.entryType
sourceType = entry.initiatorType
  • name:资源的 URL;
  • type:标记类型(用于上报分类);
  • subType:此处为 'resource'
  • sourceType:如 scriptimgcssfetch 等,用于判断加载来源。

📈 三、浏览器加载资源完整流程图

Browser DNS Server Web Server App DNS 查询 (domainLookupStart → domainLookupEnd) 返回 IP TCP/TLS 连接 (connectStart → connectEnd) 建立连接 发起 HTTP 请求 处理请求 (等待TTFB) 首字节响应 (responseStart) 响应头 & 压缩内容 (transferSize) 解压内容 (decodedBodySize) 调用 Performance API 获取 entry 信息 Browser DNS Server Web Server App

✅ 总结版字段梳理(顺序)

字段名说明来源
redirect是否跳转及跳转耗时HTTP 3xx
dns域名解析耗时DNS
tcp建立连接耗时(含 TLS)TCP/TLS
ttfb首字节时间(服务器响应速度)HTTP
responseHeaderSize响应头大小HTTP
responseBodySize响应体大小(压缩)HTTP
resourceSize解压后真实大小应用层
duration整体耗时综合
protocolHTTP 协议版本网络
startTime当前采集点时间监控逻辑
sourceType资源来源性能入口
subType资源类型(resource)性能入口

浏览器加载资源的全过程

🧩 一、浏览器加载资源的全过程(从点击链接到资源加载完成)

我们以加载一个资源(如图片、脚本或 CSS)为例,步骤如下:


✅ 步骤 1:构建请求 URL

浏览器在解析 HTML、JS 时遇到资源引用(如 <img src="..."><script>),会开始构造请求 URL。


✅ 步骤 2:查找缓存(非网络部分)

  • Memory Cache / Disk Cache / Service Worker Cache
  • 若命中,直接返回缓存内容,跳过网络阶段;
  • 否则继续发起网络请求。

🌐 网络部分(计算机网络角度)


✅ 步骤 3:重定向(可选)

redirect = redirectEnd - redirectStart
  • 若 URL 被服务器重定向(如 http → https),浏览器首先跟随跳转;
  • 每次重定向都重新走 DNS → TCP → 请求 → 响应;
  • 过多重定向会严重影响性能(应控制在 < 3 次)。

✅ 步骤 4:DNS 解析

dns = domainLookupEnd - domainLookupStart
  • 浏览器将域名(如 img.cdn.com)解析成 IP 地址;
  • 查询顺序:浏览器缓存 → 操作系统缓存 → 本地 hosts 文件 → DNS 服务器;
  • 若使用了 DNS Prefetch,此步耗时为 0。

✅ 步骤 5:TCP 建立连接(含 TLS)

tcp = connectEnd - connectStart
  • 包括三次握手(TCP)+ TLS 握手(HTTPS);
  • 如果开启 HTTP Keep-Alive,复用连接,此处耗时为 0;
  • HTTP/2、HTTP/3 可复用一个连接,减少耗时。

✅ 步骤 6:发送 HTTP 请求 + 等待响应首字节(TTFB)

ttfb = responseStart
  • TTFB (Time To First Byte):从请求发出到接收到服务器首字节;
  • 反映服务器后端处理速度 + 网络延迟;
  • 低 TTFB 是高性能服务的体现。

✅ 步骤 7:响应下载(Header + Body)

responseHeaderSize = transferSize - encodedBodySize
responseBodySize = encodedBodySize
  • transferSize 是传输的总字节数(头部+压缩内容);
  • encodedBodySize 是压缩后的体积;
  • decodedBodySize 是解压后的体积(真实内容大小)。

✅ 步骤 8:下载结束、解压资源

resourceSize = decodedBodySize
duration = entry.duration
  • duration 是整体耗时(从 startTimeresponseEnd);
  • 浏览器可能同时进行解码、缓存写入等操作;
  • resourceSize 反映资源实际内存占用。

🔍 二、与 Performance API 的字段对应关系表

网络阶段指标名称含义Performance 对应字段
重定向redirect重定向耗时redirectEnd - redirectStart
DNS 查询dns域名解析时间domainLookupEnd - domainLookupStart
TCP/TLStcp连接耗时connectEnd - connectStart
请求发出 → 首字节ttfbTime to First ByteresponseStart
响应传输responseBodySize压缩体积encodedBodySize
响应头responseHeaderSizeHeader 大小transferSize - encodedBodySize
资源体积resourceSize解压后大小decodedBodySize
整体耗时duration总体加载耗时entry.duration
协议protocolHTTP/1.1, HTTP/2…nextHopProtocol

🧠 三、实际示意图说明(Mermaid 类图)

我们用 Mermaid 的类图表示资源加载中的性能数据结构:

PerformanceEntry
+string name
+string entryType
+DOMHighResTimeStamp startTime
+DOMHighResTimeStamp duration
PerformanceResourceTiming
+DOMHighResTimeStamp redirectStart
+DOMHighResTimeStamp redirectEnd
+DOMHighResTimeStamp domainLookupStart
+DOMHighResTimeStamp domainLookupEnd
+DOMHighResTimeStamp connectStart
+DOMHighResTimeStamp connectEnd
+DOMHighResTimeStamp requestStart
+DOMHighResTimeStamp responseStart
+DOMHighResTimeStamp responseEnd
+string nextHopProtocol
+unsigned long transferSize
+unsigned long encodedBodySize
+unsigned long decodedBodySize
+string initiatorType
ReportData
+string name
+string type
+string subType
+string sourceType
+number duration
+number dns
+number tcp
+number redirect
+number ttfb
+string protocol
+number responseBodySize
+number responseHeaderSize
+number transferSize
+number resourceSize
+number startTime

🧾 总结:开发中这些字段怎么用?

场景指标用途
网络慢?检查 DNS / TCP / TTFB 哪一步耗时高
CDN 优化检查 protocol 是否为 HTTP/2
资源压缩对比 encodedBodySizedecodedBodySize
后端慢ttfb 偏大,说明服务响应慢
首屏加载慢分析关键资源的 duration 是否超标


http://www.hkcw.cn/article/kJhdUHuHne.shtml

相关文章

德布劳内将接受那不勒斯体检 加盟在即

据报道,德布劳内将加盟那不勒斯。预计他将在比利时国家队比赛结束后接受那不勒斯的体检。上月公布的比利时世预赛名单中包括了德布劳内。比利时队将在世预赛中先后对阵北马其顿和威尔士,其中与威尔士的比赛将于本月10日北京时间2点45分开球。现年33岁的德布劳内在今夏合同到期…

《在人间》是2025最难看懂的剧吗 烧脑剧情挑战观众

《在人间》这部剧集让艺绽君感到难以评价。这种“难评”并非贬义,而是因为观剧过程中真实地感受到了大脑爆炸、脑细胞死了不少,只能用一个相对中立的词汇来形容这部“神剧”。《在人间》共8集,隶属于爱奇艺的微尘剧场,这一剧场以短小精悍的作品著称。主创团队中有知名导演兼…

警方辟谣北京有人高空撒一千万:不是故意的,系工人施工碰倒钱箱 干活不慎掉落

5月29日,北京昌平区住总万科天地一带发生了一起撒钱事件。有市民发帖称,有人在楼上撒了一千万元。视频画面显示,空中飘着几张纸币,一些市民在楼下接钱。次日,北京七里渠派出所工作人员表示,当事人是因为工作时不小心掉落了钱,并提醒市民不要听信网络谣言。至于掉落的金钱…

96岁老兵走失找回 曾为陈毅元帅送信 抗战英雄平安归家

6月2日,山东省济宁市一救援队成功找回了走失的96岁高龄抗战老兵吕企荣老人,老人身体无碍。吕企荣家住泗水县济河街道何家庄村。5月31日早晨7时许,老人从家中步行到村北侧的小公园遛弯,直到中午都没有回家。家属通过监控发现,老人沿着城区北侧万象城附近道路一直向北走,直…

地磁暴雷暴大风与暴雨交织登场 双预警齐发

6月2日6时,中央气象台发布暴雨蓝色预警和强对流天气蓝色预警,覆盖福建、广东、广西等十余省份。中国气象局国家空间天气监测预警中心指出,6月1日至3日可能连续发生地磁暴,6月2日左右,我国北部有机会出现较为明显的极光,部分地区甚至有出现红绿复合极光的可能。预计6月2日…

6月1日起 新疆伊尔克什坦口岸试行24小时货运通关

6月1日,新疆伊尔克什坦口岸货运通道正式启动为期6个月的24小时通关试行。随着首批出入境货车有序通关,该口岸成为中国首个面向吉尔吉斯斯坦实行24小时货运通关的公路口岸。伊尔克什坦口岸位于新疆克孜勒苏柯尔克孜自治州乌恰县,是我国最西端的陆路口岸。口岸主要出口日用百货…

美防长炒作中国威胁论难获东盟支持 东盟强调战略自主

在新加坡举行的第22届香格里拉对话会上,美国国防部长赫格塞思极力渲染所谓的“中国威胁”,以迫使盟国增加军费开支。然而,东盟国家的国防部长们强调了“战略自主”的概念。菲律宾国防部长吉尔伯特特奥多罗表示,菲律宾作为美国的条约盟友,并非没有战略自主的棋子。他虽然仍…

Python 训练营打卡 Day 32-官方文档的阅读

我们已经掌握了相当多的机器学习和python基础知识&#xff0c;现在面对一个全新的官方库&#xff0c;看看是否可以借助官方文档的写法了解其如何使用 我们以pdpbox这个机器学习解释性库来介绍如何使用官方文档 以鸢尾花三分类项目来演示如何查看官方文档 import pandas as pd…

USB子系统和type-c接口快速理解

USB子系统 USB硬件基础 在了解LINUX 的USB驱动之前&#xff0c;我们肯定是要了解相关硬件内容的&#xff0c;如下给出了三种常用的USB接口。 特性 Type A (2.0) Type A 3.0 Type C 接口形状 长方形&#xff0c;单向插入 与 Type A 2.0 相同 椭圆形&#xff0c;可双…

DQN和DDQN(进阶版)

来源&#xff1a; *《第五章 深度强化学习 Q网络》.ppt --周炜星、谢文杰 一、前言 Q表格、Q网络与策略函数 Q表格是有限的离散的&#xff0c;而神经网络可以是无限的。 对于动作有限的智能体来说&#xff0c;使用Q网络获得当下状态的对于每个动作的 状态-动作值 。那么 a…

新视讯影视官网入口,影视动漫在线播放网站

新视讯影视是一个免费为广大追剧迷提供在线播放服务的影视平台&#xff0c;深受众多影视爱好者的喜爱。它涵盖了大量免费的VIP电视剧资源、最新上映的大片、好看的综艺节目以及动漫视频&#xff0c;是一个播放速度快、资源多的免费影视网站。用户无需注册或登录&#xff0c;即可…

张家界溶洞垃圾已清运2.7吨 排污事件引发关注

近日,有网友反映张家界市慈利县一处天然溶洞遭到人为排污,导致溶洞被污染。相关话题引发了广泛关注。据慈利县融媒体中心6月1日发布的最新视频,经过7天的努力,杨家坡溶洞内的垃圾已清理打捞出2.7吨。相关视频显示,溶洞内垃圾正在被装袋并通过吊机吊出,旁边已经摆放着大量…

杭州机场迎首批入境旅客 免签新政促便利

6月1日下午,杭州口岸迎来了首批享受免签新政的南美洲旅客。为便利中外人员往来,中方决定扩大免签国家范围,自2025年6月1日起至2026年5月31日,巴西、阿根廷、智利、秘鲁、乌拉圭五个国家持普通护照的人员来华经商、旅游观光、探亲访友、交流访问或过境不超过30天,可免办签证…

余承东为何“炮轰”友商 华为销量不及小米

华为终端BG董事长余承东在2025未来汽车先行者大会上提到,有一家公司仅凭一款车型就取得了巨大成功。尽管该公司的产品质量和智能驾驶能力并不出色,但凭借强大的品牌影响力和流量支持,依然实现了热销。余承东表示,华为的产品在质量、体验和性能方面都优于这家公司,但在销量…

患者服临床试验抗癌药致重症肺炎 临床研究用药疑云

在重庆39度的高温天气里,刘呈富推着轮椅艰难地爬坡过坎,汗流浃背,呼吸短促。坐在轮椅中的李忠美怀里抱着30多斤重的制氧机,拖着枕头状氧气袋,同样疲惫不堪。李忠美是一位45岁的宫颈癌患者,抗癌已有12年。2023年她的病情再次复发,医生推荐她使用一种名为卡度尼利单抗的注…

190头猪高速中暑晕厥消防员浇水救援 高温下的生命接力

近日,一段发生在山东泰安的救援视频在网络上广为流传,既让人忍俊不禁又感动不已。在地面温度高达43℃的酷热天气下,一辆运输生猪的货车行驶在高速公路上,车厢内的190头猪因高温中暑晕厥,情况危急。消防员迅速赶到现场展开了一场特殊的救援行动。货车司机当时心急如焚,这些…

WEBSTORM前端 —— 第3章:移动 Web —— 第5节:响应式网页

目录 一、媒体查询 1.媒体查询 2.媒体查询 – 书写顺序 3.案例 – 左侧隐藏 4.媒体查询 – 完整写法&#xff08;了解&#xff09; 5.媒体查询 – 外部CSS 二、Bootstrap 1.Bootstrap – 简介 2.Bootstrap – 栅格系统 3.Bootstrap – 全局样式 4.Bootstrap – 组件&…

dify本地部署的怎么更新新版本

首先拉取源码到你的dify的docker下面 然后解压 在原来的dify下面拉取docke-compose up -d&#xff08;生死在此一举&#xff09; 把volmes文件夹替换掉 暂停掉docker和服务 systemctl stop docker docker compose down 之后拉取失败可能是你doker的源有问题替换一下就可以成…

韩国人到底吃不吃得起肉 统计数据揭示真相

关于韩国人吃不吃得起肉的问题,可以通过韩国国家统计局KOSIS的门户网站查看相关统计数据。在该网站上搜索“고기(肉)”,可以找到2022-2023年的《首尔市民食品调查》数据,发布日期为2024年7月18日。数据显示,首尔居民每两周吃一次肉的比例为20.1%,每周吃1到3次肉的比例为…

斯维托丽娜晋级法网女单八强 胜利瞬间庆祝

6月1日,在巴黎举行的2025法国网球公开赛女子单打第四轮比赛中,乌克兰选手斯维托丽娜以2比1战胜意大利选手保利尼,成功晋级八强。比赛中,斯维托丽娜展现了出色的状态,多次在得分后庆祝,并在关键时刻回球和发球表现出色。责任编辑:zhangxiaohua