短剧类应用的网络请求密度比大多数人想象的要高得多。一个几十秒的竖屏视频背后往往藏着启动埋点、配置下发、剧集列表、播放地址、分片加载、广告素材、进度上报、心跳保活这一长串请求而且它们的时间窗口高度重叠全都挤在用户点开 App 之后的那两三秒里。这段时间里任何一条请求慢了、重试了、或者被前置阻塞了用户看到的就是白屏、转圈和这 App 好卡。我平时的工作有一大半时间在做客户端性能和数据链路排查抓包分析是我用得最频繁的手段之一。这篇内容就以某短剧 App 的网络行为分析为例把抓包这件事从工具选型、环境搭建、时间轴定位到码率估算、首帧拆解、预加载窗口设计完整地拆一遍。适合做客户端开发、性能优化、测试开发的同学参考也适合产品同学了解一条短视频到底经历了什么。需要提前说清楚的是全文只讨论自有可控流量和公开的技术方法论目的是优化体验和验证功能所有涉及用户隐私、账号鉴权、付费内容的部分都不在讨论范围内。1. 短剧类应用的网络行为到底特殊在哪1.1 一条播放链路上藏着多少次请求往返普通图文类 App 的请求模型比较简单用户滑动一次触发一次列表请求一次请求拿回十几条数据节奏很慢。短剧 App 完全不是这个模型。用户点开某一集客户端至少要走完这么几步拉取播放地址这一步通常还要带剧集 ID、集数、清晰度档位、拿鉴权票据、请求 m3u8 或 fmp4 索引清单、下载首个分片、下载音频分片、上报播放开始事件、加载贴片素材、开始周期性上报播放进度。如果用户看的是剧集列表页还要再加上列表接口、封面图、推荐位配置、个性化排序参数。把这些请求按时间轴铺开你会发现它们并不是串行的有一半是并发的但其中又存在硬性的依赖关系播放地址拿到之前分片请求发不出去鉴权票据没回来播放地址接口会返回错误码。这种部分依赖、部分并发的结构是短剧类 App 网络分析的核心难点。抓包工具只是把包给你真正的功夫在于把这些条目还原成一张有依赖关系的时序图而不是简单看哪条请求最慢。还有一个容易被忽略的点短剧的观看行为是高度碎片化的。用户平均单次使用时长可能只有几分钟但会切好几次剧。这意味着每次切剧都完整跑一遍上述链路链路的稳定性比单次耗时更重要。你优化了 200 毫秒用户几乎感知不到但你把一次超时重试从 5 秒压到 1 秒用户立刻就不觉得卡了。1.2 三种典型诉求决定了你该用什么姿势去抓抓包不是目的抓包之前先想清楚你要回答什么问题这决定了你抓哪一段、用什么过滤器、抓多久。我遇到的诉求基本可以归成三类。第一类是性能类首帧时间太长、切集卡顿、弱网下播放失败率高。这类诉求要抓的是冷启动到首帧这十几秒的完整流量重点看时间线看每条请求的耗时分布和阻塞关系。第二类是稳定性类偶发播放失败、某些机型必现黑屏、某些运营商网络下加载不出来。这类诉求要抓的是异常样本重点是比对成功样本和失败样本的请求差异看错误码、重试次数、DNS 解析结果。第三类是自测验证类新版本上线前验证接口有没有重复调用、埋点有没有漏报、某个开关打开后是否真的生效。这类诉求抓的是行为正确性重点在请求体内容和调用次数而不是耗时。这三类的抓包方法完全不同。性能类要求高精度时间戳最好用系统级抓包或者浏览器内核自带的网络面板稳定性类要求长时间挂机记录需要能自动保存并分类的工具自测验证类对时间精度要求低但对请求体和响应体的完整可读性要求高。很多人一上来就把所有工具都开一遍结果数据互相干扰反而看不出问题。1.3 先把边界划清楚哪些能看、哪些不该碰这里必须单独说一段因为这是很多人容易踩线的地方。抓包分析的正当用途是分析你自己有权限调试的流量——自己团队开发的应用、自己搭建的测试环境、自己设备的网络行为。分析的目标是优化体验、验证功能、排查故障。不该做的事也很明确不去分析他人账号的数据不尝试获取未授权的付费内容不去破解任何鉴权或加密机制不把抓到的用户数据传输、留存或分享给第三方。这些不是技术难度问题而是压根不该做。我在实际工作中有一条硬规则抓包环境一定用测试账号、沙箱环境、脱敏数据抓完立刻清理绝不把真实用户的数据落到本地。还有一条同样重要如果应用做了证书校验或请求签名那是产品方的安全设计说明这条路径不开放给外部调试。正确的做法是走研发流程让团队提供一个带调试开关的测试包或者用开发环境直连。在生产包上做任何形式的绕过尝试既不合规也浪费时间我当时第一次碰到证书校验卡住抓包折腾了大半天后来问了负责安全的同事才知道团队本来就提供了测试包只是我不知道。这个坑我后面还会详细讲。2. 抓包工具怎么选别一上来就装一堆2.1 四类工具的能力边界对照抓包工具大概能分成四档能力差异非常大选错了就是白干。工具类型代表工具能看到什么适用场景主要短板系统级代理抓包桌面端 HTTP 代理类工具HTTP/HTTPS 明文需装证书、完整请求头响应体、时间戳接口分析、埋点验证、参数排查只能看到经过代理的流量容易漏掉不走代理的请求底层网络抓包通用网络协议分析器全部 IP 层数据包、TCP 握手、重传、RTT分析连接建立耗时、丢包、DNS 问题加密流量只能看包长和时序不理解业务语义平台内置网络面板移动开发工具自带的网络检查器应用内请求的完整调用栈、发起位置定位是哪个模块发的请求、查重复调用只能在调试构建下用无法看生产包客户端内埋点日志自建的请求拦截日志与自己关心的业务字段强相关的精简信息线上灰度验证、长期监控需要提前埋点灵活性差我一般的组合是先用平台内置面板或者代理工具看业务语义再用底层抓包工具看连接层的时间开销。这两者缺一不可。你只代理工具看到的请求耗时是应用层耗时包含不了 DNS、TCP 握手、TLS 协商这些你只看底层数据包又完全不知道这条连接上跑的是播放地址请求还是埋点上报。两边对照着看才能把一条链路的耗时拆干净。2.2 HTTPS 抓包能看明文的原理很多人会疑惑明明流量是加密的为什么装个证书就能看到明文。这里的原理不复杂用生活场景类比一下就很清楚。正常情况下客户端和服务器之间像是两个人用只有他们懂的语言通信中间人插不上话。抓包工具的做法是它同时扮演两个角色对客户端它冒充服务器对服务器它冒充客户端。它给客户端出示一张自己签发的证书客户端如果信任这张证书就会把本该发给服务器的数据发给抓包工具抓包工具解出来看一眼再用真正的身份跟服务器通信。所以关键在于客户端是否信任这张证书。这也是为什么装证书这一步是整个流程的核心。在 iOS 上除了安装描述文件还必须在系统设置里手动把证书信任开关打开很多人只做了一半结果所有 HTTPS 请求都失败还以为是工具坏了。Android 7 之后用户安装的证书默认不被应用信任只有系统级证书才被信任这也是很多人在新机型上抓不到包的根本原因。理解了原理你就能明白另一件事证书校验是产品方主动加的一道门。如果 App 不信任你装的证书说明它做了额外的校验这是一种正当的安全措施。遇到这种情况不存在应该怎么绕过的问题只有该找谁要测试包的问题。2.3 环境准备的具体参数和顺序环境搭建这块顺序错了会浪费很多时间。我固定按这个顺序做基本一次成功。第一步确认设备和工具在同一网段。用手机连同一个 WiFi然后从手机浏览器访问抓包工具的代理地址能看到工具自带的欢迎页或者返回信息说明连通了。这一步没通就不要往下走后面所有问题都是它引起的。第二步配置代理。在手机 WiFi 设置里填上代理服务器地址和端口。注意要记下原来的设置方便恢复我见过不止一个人抓完包忘了关代理第二天上班发现手机连不上任何东西。第三步装证书。从工具的帮助页找到证书下载地址用手机浏览器下载然后去系统设置里安装并信任。iOS 的路径是先在已下载的描述文件里安装再去关于本机 - 证书信任设置里打开开关两步都要做。第四步验证。随便打开一个网页或者发起一次请求确认工具里能看到明文内容。看到一堆乱码或者只有 CONNECT 记录说明证书没生效。第五步限定抓包范围。这一步很多人跳过结果抓到一堆系统后台请求噪音比信号还多。在工具里设置只记录特定域名的请求立刻清爽。提示抓包环境一定要用测试账号和测试数据。分析结束后完整清理代理设置、证书和本地抓包文件不要把这些东西留在工作设备上。3. 一次完整的实操从启动到首帧3.1 清空环境后重放一次冷启动要分析首帧第一件事是保证这次启动是冷的。我的做法是先杀掉应用进程清掉抓包工具里的历史记录等 30 秒让后台连接彻底释放再启动。这一步不做你看到的请求可能是十分钟前预加载残留的时间轴完全对不上。启动之后不要急着操作停在首页静置 10 秒让所有延迟请求、重试、埋点上报都跑完。然后开始计时标记启动瞬间、首屏内容出现、封面图加载完成、点击某一集、播放器开始出画面。这四个节点在抓包工具里不会有标记需要你自己对着秒表记或者录屏回看。实测下来一个典型短剧 App 从点击图标到首帧出画落在 2.1 秒到 3.4 秒之间。拆开看大概是这么个分布进程启动和 SDK 初始化占 400 到 700 毫秒配置下发和首页列表请求占 500 到 900 毫秒播放地址请求占 200 到 400 毫秒索引清单加首个分片下载占 300 到 600 毫秒解码首帧加渲染占 150 到 300 毫秒。剩下的时间是各种排队和回调延迟。注意这些数字只是我在特定设备、特定网络下测到的参考值不同环境差别很大你自己测的时候要以自己的数据为准。关键发现通常出在排队那部分。有次我测出来总耗时 3.2 秒但各段加起来只有 2.1 秒剩下 1.1 秒去哪了翻时间轴发现播放地址请求在等列表请求返回的某个字段而列表请求又在等配置下发完成。三个请求串成了一条链每一个都不慢加起来就慢。这就是为什么单纯的找出最慢的请求解决不了问题。3.2 读懂请求头和响应体里的业务线索抓到请求之后怎么读是关键。我一般先看三样东西请求路径的命名、请求参数、响应体的结构。请求路径的命名能直接告诉你这个接口干什么。RESTful 风格比较清楚但短剧类应用为了灵活经常用统一的网关加一个 action 参数来区分。这时候要看参数里的scene、type、source这类字段它们通常标明了调用来源比如是首页推荐位还是详情页是首次加载还是下拉刷新。请求参数里最有价值的是分页游标和版本号。游标能看出列表是不是真的走了增量加载我抓到过一种情况用户每次下拉刷新请求里的游标都是同一个初始值等于每次都全量拉一遍团队完全不知道因为界面上看不出区别。版本号参数则能看出客户端有没有命中缓存策略如果同一个列表在短时间内用不同版本号请求了三次说明缓存失效了。响应体要重点看两样字段冗余度和下发的预加载信息。字段冗余是指返回了客户端根本不用的字段我见过一个剧集列表接口每条返回 40 多个字段实际渲染只用到 9 个多出来的数据在弱网下就是实打实的延迟。预加载信息是指服务端有没有下发下一集地址或者推荐下一部的地址如果下发了但客户端没用那就是白白浪费的优化机会。3.3 视频分片的观察方法与码率估算短剧的视频一般走 HLS 或者类似的切片协议抓包时会看到大量并发的小请求文件名带序号。很多人看到这一片密密麻麻就头大其实只要算清楚几个数就明白了。先看索引清单。清单里会列出每个分片的地址、时长、码率档位。假设一集 90 秒切片时长 4 秒那就是 23 个分片。再看单个分片的大小如果是 600KB 左右那么码率大概是 600KB × 8 ÷ 4 秒 1200 kbps也就是 1.2 Mbps。这个数值对 720P 竖屏短剧来说是合理的画质和流量能平衡。整集流量就是 1.2 Mbps × 90 秒 ÷ 8 13.5 MB。这些数字有什么用用处大了。第一它能帮你判断码率档位设置是否合理。如果 480P 档位也有 1.0 Mbps那清晰度和流量完全不成比例低端机用户白白多花流量。第二它能帮你算首片下载时间。首片 600KB在实测 30 Mbps 的家用 WiFi 上理论耗时 160 毫秒加上 TCP 和 TLS 的握手开销实际 300 毫秒左右。如果实测超过 1 秒说明瓶颈不在带宽而在连接建立或者服务端响应。第三也是最有价值的一点它能让你算出首片大小对首帧的影响。首片越小首帧越快。有些团队会把首片切成 1 秒代价是清单条目变多、请求数增加。这个平衡点需要通过抓包实测来定一般来说首片 1 到 2 秒后续分片 4 到 6 秒是个比较稳的折中。3.4 别忽略音频分片和封面资源视频分片好理解但真正拖慢首帧的经常是被忽略的那几个小请求。音频分片就是一个典型。如果音视频是分离的播放器要先拿到音频首片才能出声而音频首片和视频首片是并行下载的哪个慢哪个成为瓶颈。我测过一次视频首片 180 毫秒就回来了音频首片花了 620 毫秒原因排除下来是音频走了不同的域名DNS 解析多花了 300 多毫秒。这种问题你只看视频请求永远发现不了。封面图也有类似的问题。列表页的封面图如果不做尺寸裁剪一张 1080P 的图直接下载下来当缩略图用单张可能 300KB一屏 8 张就是 2.4MB。在弱网下这就是好几秒的空白。抓包时看图片请求的响应体大小一眼就能看出来。合理的做法是让服务端按不同屏幕尺寸下发不同规格的图或者干脆用支持自动裁剪的图片服务。还有一个更隐蔽的贴片素材和角标资源。这些资源通常在播放开始前就要准备好如果它们和视频首片抢带宽首帧就会延后。抓包时把时间轴按域名分组看一眼如果发现素材域名和视频域名在同一时段并发且素材明显更大那基本可以确定是互相拖累。4. 把抓包数据变成可落地的优化动作4.1 首帧时间拆解从 2.3 秒到 900 毫秒的实操记录这一节讲一个具体的优化案例把前面所有分析串起来。背景是某一版短剧 App 的冷启动首帧实测 2.3 秒目标是压到 1 秒以内。第一步拆解基线。按前面说的方法抓一次冷启动把时间轴拆成五段得到SDK 初始化 550 毫秒、配置接口 420 毫秒、列表接口 380 毫秒、播放地址 260 毫秒、首片下载 340 毫秒、解码渲染 200 毫秒加上排队 150 毫秒总计 2.3 秒。第二步找可以并行的。配置接口和列表接口看起来有依赖翻请求体发现列表接口只用到配置里的一个字段是否开启某种排序其他字段都是后置使用的。于是改成配置接口和列表接口并行发起列表接口用本地缓存的旧配置兜底回来后再校正。这一下省掉 420 毫秒。这个改动风险在于旧配置可能导致排序闪动所以要加一个列表渲染前不做二次排序的处理。第三步找可以前置的。播放地址请求必须等用户点击这个无法提前。但我们发现用户点击之前列表接口的响应里已经带了下发给第一集的视频索引地址。于是改成列表渲染完成后立刻预建连接并预取索引清单用户点击时直接进首片下载。省掉 260 毫秒的播放地址请求和一部分握手时间。第四步砍首片。原来首片 4 秒 600KB改成首片 1.5 秒 220KB后续分片保持 4 秒。首片下载从 340 毫秒降到 130 毫秒。第五步处理连接预热。实测发现首片下载里有 100 多毫秒是 TCP 加 TLS 握手。改为在列表接口返回后立即和目标域名建立连接并保持握手时间被摊到用户浏览列表的时间里。省掉约 90 毫秒。改完之后重新抓一次总耗时落在 880 到 950 毫秒之间。注意每一步改动之后都要重新抓包验证因为改动之间会互相影响比如首片变小后预加载策略可能要跟着调否则用户看第 10 秒的时候会卡一下。注意以上所有数值是我在特定设备和网络条件下的实测记录换环境一定会有差异。优化思路可以照搬具体参数必须自己重测。4.2 预加载窗口到底该开多大预加载是短剧 App 最能提升体感的功能也是最容易做错的。开小了没用开大了烧流量、占内存、影响低端机稳定性。这个值不能拍脑袋得算。算法大概是这样的先设定目标——用户连续观看时不出现缓冲。这要求下一集的首片在用户看完当前集之前下载完成。假设单集 90 秒用户在剩余 30 秒时开始预加载那么有 30 秒的窗口。以 1.2 Mbps 码率算30 秒能下载 4.5 MB约等于三分之一集。所以预加载一集是来不及的结论就是预加载首片加前几个分片而不是整集。这也是为什么合理的预加载策略通常是下集前 10 秒内容约 1.5 MB。再看档位。我一般按网络类型分三档WiFi 下预加载下集前 15 秒移动网络下预加载前 6 秒弱网或者省流量模式下完全不预加载改成用户点击时再拉。这三个值都是通过抓包实测反复调的早期我试过 WiFi 下预加载整集结果是用户切剧时内存暴涨低端机直接闪退回滚花了两天。还有一个细节是预加载的取消时机。用户如果没有继续看而是退出了 App预加载应该立刻停。抓包时能明显看到这个问题用户只看了 5 秒就退出但后台还在持续下载浪费了十几 MB 流量。这类问题只能在抓包的时间轴上看到界面上完全无感。4.3 第三方 SDK 的隐性请求盘点这一块是我认为最值得做的抓包分析因为收益往往超出预期而且绝大多数团队没做过。方法很简单抓一次完整的冷启动把时间轴上的请求按域名分组统计。你会发现除了自己的业务域名还有一堆第三方域名。逐个排查一般能发现这么几类统计埋点、崩溃上报、推送通道、广告素材、分享组件、支付组件、网络库自身的探测请求。重点看三件事。第一首屏期间有多少第三方请求。如果冷启动 2 秒内有 20 条第三方请求在跑它们必然和关键请求抢连接、抢 CPU。合理的做法是全部延迟到首屏渲染完成之后再发。这一条通常能省 200 到 400 毫秒代价是埋点数据延迟几秒上报几乎无影响。第二有没有重复发起的请求。我见过一个统计 SDK 在启动时连发了 6 次几乎相同的请求原因是初始化被调用了多次。这种问题在代码里很难发现但抓包一眼就看出来了。第三有没有超长超时和无限重试。某个第三方 SDK 如果设置了 30 秒超时加 5 次重试在弱网下它会一直占着连接不放。抓包时看到某条请求反复出现、时间戳密集基本就是它。处理方式是给所有第三方请求加统一的超时上限超出就让主流程继续走。需要说明的是做这类排查时我只看请求的数量、时机和大小不看具体的上报内容涉及用户信息的字段一律不记录。这一点在团队里要提前说清楚避免有人在排查过程中顺手把数据存下来。5. 常见问题速查与排查思路5.1 抓不到包的五类原因和对应处理抓不到包是最高频的问题我把遇到过的原因整理成表按出现概率排序。现象可能原因排查动作工具里完全没有记录代理没生效或设备没连对 WiFi手机浏览器访问代理地址看能否返回内容只有 CONNECT没有明文证书没被信任iOS 检查描述文件安装和信任开关两步Android 检查是否为系统级证书部分请求能看到部分看不到应用做了证书校验停止尝试走研发流程申请带调试开关的测试包能看到请求但响应体为空用了 HTTP/2 或长连接推送换用支持该协议的工具或在平台内置网络面板里看时间戳全是一个时间工具的时间显示精度不够开启毫秒级时间戳或改用底层协议分析工具看精确时序除了表里的还有两个非技术原因经常被忽略。一是防火墙或者企业网络策略拦截了代理端口这种情况换个网络环境立刻能验证。二是应用有独立的网络库绕过了系统代理比如某些下载组件会自己建连接。后者只能在平台内置网络面板或者底层协议工具里看到验证方法是同时开两个工具对照。还有一个我踩过的坑抓包工具开着但手机连着蜂窝网络代理配置在 WiFi 里当然抓不到。这个错误很低级但我确实犯过而且排查了半小时。5.2 弱网复现和数据对齐的正确姿势很多问题只在弱网下出现但在办公室里怎么都复现不了。这时候要用网络限速工具模拟但模拟的时候有两个细节决定了你的数据有没有参考价值。第一个细节是限速参数怎么设。我一般设三档对照良好 4G下行 10 MbpsRTT 50 毫秒丢包 0.1%、一般 4G下行 3 MbpsRTT 100 毫秒丢包 1%、弱网下行 500 kbpsRTT 300 毫秒丢包 3%。这三档能覆盖绝大多数真实场景。只设一个慢速是不够的因为有些问题对带宽敏感有些对延迟敏感得靠多档对照才能区分。第二个细节是每次测试前清缓存。DNS 缓存、TLS 会话缓存、CDN 边缘节点缓存任何一个没清你的数据就不可比。我习惯在每次测试前重启一次网络连接确保 DNS 重新解析。数据对齐的意思是你抓到的数据要和用户侧的体感指标对上。抓包显示首片 300 毫秒但用户反馈卡了 3 秒说明中间还有别的东西没算进去。这时候要在客户端加打点把请求发出首片收到解码开始第一帧上屏四个时间戳都记下来和抓包数据交叉验证。只有两边对得上你的优化才算真的生效。5.3 抓包数据的隐私处理规范这一条必须写进团队流程里不是个人习惯问题。我自己的做法是三条硬规矩。第一只用测试账号。任何时候不用真实用户账号抓包不抓真实用户的设备。测试账号的数据本身就是构造的抓到了也没风险。第二抓包文件即时清理。分析完立刻删除不留档。如果确实需要留证据只截取必要的请求路径和耗时把请求体和响应体全部裁掉。第三分享时脱敏。给同事看抓包截图之前先把所有可能含用户信息的字段遮掉包括不限于设备标识、位置参数、账号相关字段、任何看起来像令牌的字符串。这个动作花不了几秒钟但能避免很多麻烦。提示如果团队没有明确的抓包规范建议在做第一次分析之前就先定一个简单的三条规矩比事后补救省事得多。6. 几次踩坑之后总结的几条经验做这类分析做得多了有些判断会变成肌肉记忆。分享几条我认为最有价值的。先看时间轴再看单条耗时。几乎所有性能问题的答案都藏在请求之间的空档里而不是某条请求自己的耗时里。我现在的习惯是打开抓包结果先不点任何一条请求先整体扫一眼时间轴上的空白区域和密集区域密集区域说明并发过度空白区域说明有串行等待。改动一次抓一次。别想着一次改五处然后一起验证你永远不知道是哪个改动起了作用出了回滚也不知道回滚哪个。哪怕改动的收益很小也要单独验证一次记下来。这个习惯让我的优化记录一直很干净任何时候都能说清每个版本的提升来自哪里。别迷信工具给的总耗时。工具显示的请求耗时通常是从发出到收到完整响应的时长但它不包含应用层的排队、线程切换和回调延迟。真实体感时间永远比工具数字长。所以优化的目标不是把工具里的数字压到最低而是把用户体感的那段时间压下来。遇到证书校验就停下来问人。这一条我前面提过但值得再说一次。我第一次碰到的时候浪费了半天后来发现团队早就准备了测试包只是没人告诉客户端这边。问一句的成本是五分钟自己折腾的成本是半天而且折腾的过程本身就不合规。最后分享一个我觉得很有用的小技巧。抓包分析之前先在纸上或者文档里把你想验证的假设写下来比如我怀疑首帧慢是因为播放地址请求在等列表返回。带着假设去抓抓完对照能省掉大量漫无目的的翻查。我现在的分析记录里每条结论前面都有一条对应的假设回头看的时候特别清楚。这个方法看起来笨但它能防止你在几百条请求里迷失方向。另外提一句这些方法不只适用于短剧类应用任何请求链路长、首屏依赖多的内容型产品都能套用。区别只在于请求的具体形态拆解思路是一样的还原时序、找依赖、砍串行、控并发、算预加载。抓到第五次、第十次的时候你会发现自己看一眼时间轴就知道问题在哪了。
阅读完成 · 觉得有帮助?