Appearance
09. 现代移动端网络底座:HTTP/1.1、HTTP/2、HTTP/3(QUIC) 与弱网治理
一句话定位:这一页不是教你背协议名词,而是帮你建立移动端网络底座的判断框架:DNS 怎么选、连接怎么建、请求库怎么配、UI/状态层怎么承接弱网结果,以及为什么今天很多优化会从 HTTP/2 继续走向 HTTP/3 / QUIC。
相关专题:00 基础知识(Foundations) · TLS 1.2、ECDHE 密钥协商与 CA 信任链 · 08. 移动端弱网与长连接治理:WebSocket/gRPC、智能心跳重连与离线 WAL 同步 · Token 鉴权体系、JWT、OAuth2 与移动端双 Token 自动无感刷新
这页解决什么问题
- 为什么同样是“一个请求”,在办公室 Wi‑Fi 很快,进电梯或地库后却会突然卡一大截?
- 一句话答:因为移动端真正耗时的不只是接口执行,还包括 DNS 解析、TCP/TLS/QUIC 建连、丢包重传、连接复用、网络切换;弱网下最容易暴露的是连接层而不是业务层。
- 为什么 HTTP/2 已经多路复用了,弱网下还是会出现“一个包丢了,整个连接像都慢了”的体感?
- 一句话答:HTTP/2 只是把“多条请求”放进一个 TCP 连接里,TCP 依然要求按序交付,所以一个包丢失仍可能拖住整条连接上的多个流。
- HTTP/3 / QUIC 到底解决了什么?是不是上了它就没有弱网问题了?
- 一句话答:QUIC 主要解决 TCP 层队头阻塞、握手时延、网络切换重连成本,但不解决 DNS 选错、服务端慢、业务重试乱配、UI 没做取消与兜底。
- Android / Flutter / Compose 里,协议升级和日常开发有什么真实关系?
- 一句话答:你日常写的是 OkHttp、Dio、Repository、ViewModel/Notifier、取消请求和错误态,但这些体验的上限,最终受到底层连接协议、TLS、安全策略和网络治理能力约束。
- HTTPDNS、阿里 DNS、一键登录这类能力应该放在什么层看?
- 一句话答:它们都属于“移动网络底座”的组成部分,但不是这一页的展开重点;这里先把它们放回正确层级,并说明它们解决什么典型问题、该去哪里继续看。
一张图看懂 HTTP/1.1 / 2 / 3
图注:HTTP/1.1 的问题主要是“连接太多、握手太多”;HTTP/2 的改进是“把很多请求塞进一个 TCP 连接”;HTTP/3 则进一步把“连接复用”从 TCP 约束里解放出来,用 QUIC 在用户态按 Stream 管理传输。
先别急着记定义,先记体感差异
- HTTP/1.1 像开很多条单车道:每条道都能跑,但建太多连接,握手和维护成本高。
- HTTP/2 像把很多车并进一条高速:平时效率很高,但如果高速某段因为丢包被卡,后面的很多车都会受影响。
- HTTP/3 像高速仍是一条入口,但每条业务流在传输层更独立:一条流出问题,不必让别的流一起等。
为什么 HTTP/2 弱网仍会卡
先解决一个常见误解
很多人听到“HTTP/2 多路复用”后,会下意识以为它已经彻底解决了并发请求互相影响的问题。这个结论只对了一半。
HTTP/2 的确解决了 HTTP/1.1 应用层的队头阻塞:不用再靠多开很多 TCP 连接来并发请求,多个请求可以复用一条连接里的多个 Stream。
但它没有解决 TCP 自己的按序交付约束。
图注:HTTP/2 的 Stream 是“应用层并发单元”,但真正往外发数据的还是同一条 TCP。只要 TCP 还没等到前面丢失的那段字节,后面的数据就不能按序交给上层,所以用户会感到“明明只丢了一个包,怎么整个页面都慢了”。
这件事在移动端为什么更明显
- 地铁、电梯、地下车库这类场景里,瞬时丢包和 RTT 抖动 很常见。
- 移动端往往会同时发很多小请求:接口、图片、埋点、配置、实验开关。
- 当这些请求共用一个 HTTP/2 连接时,一处丢包可能拖慢整批请求的交付节奏。
举个更贴近 App 的例子
假设首页同时发 6 个请求:
- 用户信息
- 卡片流
- 角标数
- 实验开关
- 营销弹窗配置
- 埋点上报
如果它们都跑在同一个 HTTP/2 连接上,而某个早到的数据包丢了,那么后面即使有些响应片段已经到达设备,也可能因为 TCP 还在等重传而不能及时交付。你看到的现象往往不是“某一个接口报错”,而是:
- 首屏整体慢一下
- loading 一起多转半秒到两秒
- 某些卡片晚出现
- 页面像“顿了一下”
这就是为什么在极端弱网下,HTTP/2 的理论优势不一定完全转化为体感优势。
QUIC/HTTP3 解决什么与没解决什么
QUIC 主要解决什么
1. 解决 TCP 层队头阻塞
QUIC 建在 UDP 之上,自己在用户态维护可靠传输和流控制。它的关键点不是“UDP 更快”这么简单,而是:不同 Stream 的传输状态不必像 TCP 那样绑定成一个全局按序字节流。
- 某个 Stream 丢包时,主要影响这个 Stream 自己。
- 其他 Stream 只要数据已经满足交付条件,可以继续往上层走。
2. 解决握手链路过长
HTTP/1.1 / HTTP/2 通常是:
- 先 TCP 建连
- 再 TLS 握手
- 然后才能发业务数据
HTTP/3 把传输层和加密握手结合得更紧,结合 TLS 1.3 后,首包到可发业务数据的路径更短。这对弱网、高 RTT、冷启动首个请求特别有价值。
3. 解决切网后整条连接作废
TCP 连接由四元组标识:
- 源 IP
- 源端口
- 目的 IP
- 目的端口
手机从 Wi‑Fi 切到 4G/5G,本地 IP 一变,原 TCP 连接通常就废了。
QUIC 引入 Connection ID,连接标识不再死绑当前 IP。于是网络切换时,连接迁移成本明显更低,用户体感就是:
- 切网时更不容易整页重新转圈
- 长列表滚动中发请求没那么容易整体断掉
- 长连接/流式请求更容易平滑恢复
QUIC 没解决什么
- 没解决 DNS 解析错地址:域名如果被劫持、缓存脏了、调度 IP 不合理,底层协议再先进也白搭。
- 没解决服务端本身慢:接口 800ms 花在数据库和下游调用上,不会因为 HTTP/3 自动变 80ms。
- 没解决业务侧乱重试:比如超时 3 秒、重试 3 次、没有幂等保护,还是会把问题放大。
- 没解决 UI 没做取消/兜底:页面销毁了还在请求、切 tab 不取消、错误态和骨架屏没设计,用户依然觉得卡。
- 没解决企业网/防火墙封 UDP:部分网络环境会限制 UDP,这时往往还需要回退到 HTTP/2。
一个实用判断
如果你要回答“HTTP/3 有没有价值”,更准确的说法不是“它更快”,而是:
- 在弱网、高 RTT、切网频繁的移动端场景里,它更稳,也更容易把延迟尖刺压下去。
- 但它只覆盖网络底座的一部分,不是万能药。
移动端网络链路分层:DNS、连接、请求库、UI
把移动端一次请求拆开看,通常更容易判断问题在哪一层:
图注:DNS 层决定“去哪里”;连接层决定“怎么连得快且稳”;请求库层决定“超时、重试、缓存、证书、拦截器怎么配”;应用层负责 Repository/UseCase 等业务编排;UI/状态层负责取消、降级、加载态、错误态和重试交互。
1. DNS 层:先决定“连到谁”
这一层处理的是:
- 域名解析
- 调度到哪个 IP / 边缘节点
- 是否命中运营商劫持、脏缓存、TTL 失真
典型问题:
- 明明接口服务没挂,但某地区用户大量超时
- 同一个域名在不同网络下解析到质量差的节点
- 系统 DNS 被运营商污染,导致解析结果不稳定
2. 连接层:再决定“怎么连”
这一层处理的是:
- TCP / TLS / QUIC 建连
- 连接复用
- 丢包恢复
- 切网迁移
- HTTP/2 / HTTP/3 协商与回退
典型问题:
- 冷启动首个请求慢
- 弱网下偶发整批请求一起卡
- Wi‑Fi 切蜂窝时长连接或请求中断
3. 请求库层:把连接能力变成工程配置
这一层你最常碰到的是:
- OkHttp / Retrofit
- Dio / dart:io HttpClient
- 拦截器、超时、重试、缓存、Pinning、取消、日志
这一层决定的不是协议原理,而是协议能力有没有被你正确用起来。
4. UI / 状态层:把失败变成“可承受的失败”
真正影响用户体感的最后一层,是:
- 页面切走后请求有没有取消
- 首屏是骨架屏、局部 loading 还是整页菊花
- 错误态能不能局部重试
- 数据有没有缓存回显
- 是否把“网络慢”放大成“整个页面不能操作”
很多所谓“网络优化”最后改的其实不是网络协议,而是这层的交互策略。
Android / Flutter / Compose 映射
先看总映射
| 层级 | Android / Kotlin | Flutter / Dart | Compose / UI 侧关注点 | iOS 对照 |
|---|---|---|---|---|
| DNS 层 | 系统 DNS、自定义 Dns、HTTPDNS SDK | dart:io / 插件封装 / 平台侧解析 | 通常不直接感知,但会影响首屏与重试策略 | URLSession / Network.framework + 自定义解析 |
| 连接层 | OkHttp、Cronet、TLS、HTTP/2、HTTP/3 | Dio 底层 HttpClient、插件桥接 Cronet/平台能力 | 影响加载态时机、取消、切网恢复 | URLSession、Network.framework |
| 请求库层 | Retrofit + OkHttp,拦截器、连接池、Pinning | Dio,拦截器、CancelToken、证书校验 | ViewModel / Notifier 决定怎么消费结果 | URLSession + adapter |
| 状态/UI 层 | Repository + UseCase + ViewModel + StateFlow | Repository + Notifier/Bloc + AsyncValue/State | Compose UiState、Flutter AsyncValue / sealed state | ObservableObject / async-await |
结论先说:Android 和 Flutter 的差别,很多时候不在“网络问题本质不同”,而在一边更容易直接触到 OkHttp/TLS 细节,另一边更常通过 Dio + 插件 + 平台桥接去间接使用这些能力。
Android:通常更容易直接触到连接层细节
Android 主流栈里,Retrofit 底层就是 OkHttp,所以你经常能直接配置:
connectTimeout/readTimeout/writeTimeoutretryOnConnectionFailureConnectionPoolCertificatePinner- 应用拦截器 / 网络拦截器
这也是为什么 Android 工程师通常对“连接池、TLS、Pinning、DNS、自定义 Dns、协议版本”更容易形成一手认知。
Flutter:更多通过请求库和平台桥接承接
Flutter 主流是 Dio,但 Dio 本身更偏“请求编排层”,不是完整复刻 OkHttp 的网络栈。
你在 Flutter 里通常会这样分工:
- 用 Dio 做请求模型、拦截器、超时、错误归一化、401 刷新、取消
- 用
dart:io HttpClient或平台插件承接底层证书、代理、平台网络能力 - 需要更强连接能力时,通过插件桥到 Android/iOS 原生网络栈
这和仓库里参考架构文档的分层是一致的:UI → Notifier/ViewModel → Repository → DataSource(Dio/平台能力),网络层不应该直接泄漏到 Widget 或 Composable 中。
Compose:协议本身不在 UI 层,但体感问题最后都落到 UI 层
Compose 不会直接让 HTTP/3 生效,但它会决定用户如何感知网络:
- 页面是否用单一
UiState表达 loading / success / error - 一个子卡片失败,是否拖死整页
- 列表分页时,是否把“下一页失败”做成局部错误而不是整屏报错
- 切换页面时,是否及时取消旧请求
所以更准确地说:
- HTTP/3/QUIC 优化的是连接层上限
- Compose / Flutter 状态管理决定的是这个上限有没有被用户真正感受到
iOS 只做简要对照
iOS 侧核心概念并不特殊:
- 仍然要处理 DNS、TLS、连接复用、切网、证书校验
- 主要入口通常是
URLSession或Network.framework - ATS 会默认抬高 TLS 合规门槛
差异主要在 API 形态和平台策略,不在网络问题本质本身。这一页以 Android / Flutter 为主,不在这里展开 iOS 工程细节。
保留的关键工程抓手:OkHttp / Dio / TLS / Pinning
OkHttp:Android 端最常落地的网络抓手
OkHttp 值得保留,不是因为它“有名”,而是因为它把很多连接层能力以工程配置形式暴露出来了。
你至少要熟这几类配置:
kotlin
val client = OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(15, TimeUnit.SECONDS)
.retryOnConnectionFailure(true)
.certificatePinner(
CertificatePinner.Builder()
.add("api.example.com", "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")
.add("api.example.com", "sha256/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB=")
.build()
)
.addInterceptor { chain ->
val request = chain.request().newBuilder()
.header("Authorization", "Bearer $token")
.build()
chain.proceed(request)
}
.build()connectTimeout更偏建连阶段。readTimeout更偏“连上了但迟迟收不到数据”。retryOnConnectionFailure对幂等请求更安全,不能无脑放大到所有写操作。CertificatePinner是通信安全加固,不是性能优化。
Dio:Flutter 端最常落地的请求编排抓手
Dio 的价值主要在:
- 统一请求/响应/错误模型
- 拦截器里做鉴权、埋点、错误归一化
- 用
CancelToken承接页面销毁或状态切换 - 通过队列/锁做 401 无感刷新
dart
final dio = Dio()
..interceptors.add(
InterceptorsWrapper(
onRequest: (options, handler) {
options.headers['Authorization'] = 'Bearer ${getToken()}';
handler.next(options);
},
onError: (error, handler) {
if (error.response?.statusCode == 401) {
refreshTokenAndRetry(error, handler);
} else {
handler.next(error);
}
},
),
);
final cancelToken = CancelToken();一个很常见但很关键的细节是:Flutter 里网络慢,经常不是“请求真的慢很多”,而是页面销毁、切 tab、列表复用时没有及时 cancel,导致过期结果回写 UI。
TLS 与 Pinning:它们是安全底座,不是 QUIC 的替代品
这一页只保留你做移动端时最该记住的判断:
- TLS 解决的是加密、身份认证、完整性。
- QUIC / HTTP/3 解决的是更快更稳地传输。
- Pinning 解决的是即使系统信任链被代理利用,也要额外校验是不是“我认的服务端”。
如果你要深入 TLS 1.2 / 1.3、ECDHE、CA 信任链,请直接看: TLS 1.2、ECDHE 密钥协商与 CA 信任链
HTTPDNS 与一键登录只做摘要入口
HTTPDNS / 阿里 DNS 在这条链路里属于哪一层
它属于 DNS 层,核心价值不是“让请求更快”这么泛,而是:
- 避开系统 DNS 被劫持或污染
- 避开某些地区解析结果不稳定
- 让客户端更可控地拿到可用 IP
- 给多机房/多边缘节点调度留下空间
它通常解决什么真实问题
- 某运营商网络下偶发大面积超时,但服务端没挂
- 同域名解析到质量差节点,导致特定地区首包慢
- 系统 DNS 缓存脏、TTL 不准、切网后解析结果滞后
这页只保留一个工程结论
很多团队不是“简单接了个 HTTPDNS SDK 就结束”,而是会做二次工程化改造,例如:
- 把解析结果接入自家请求栈而不是孤立调用
- 增加过期策略、失败回退、灰度开关
- 协调 HTTPS 证书校验、Host 头、SNI 与 IP 直连之间的边界
- 在弱网和切网时处理缓存命中与重新解析时机
也就是说,真实价值不只是“用了 HTTPDNS”,而是把它工程化到能解决线上解析与调度问题。
延伸专题:HTTPDNS / 阿里 DNS 移动端工程化。如果你想真正看懂它为什么不只是
resolveDomain,重点看 Host / SNI / TLS / 回退策略如何一起收口。
一键登录在这条链路里属于哪一层
一键登录更接近 接入层 / 鉴权与运营商能力编排层,不属于 HTTP/3 本身,但它强依赖移动网络环境、运营商链路、超时策略与回退策略。
它通常解决什么真实问题
- 降低手机号登录输入成本
- 在注册/登录首转阶段减少流失
- 借助运营商认证能力缩短登录路径
这页只保留一个工程结论
真实项目里,一键登录插件通常也不是“拿来即用”就够了,往往会做二次工程化改造,比如:
- 统一 Android / Flutter 的调用封装与错误码映射
- 处理厂商 ROM、页面生命周期、弹窗时机、返回栈异常
- 增加兜底:超时后自动回退短信验证码或其他登录方式
- 把埋点、A/B 开关、风控策略、协议弹窗校验接进去
所以这类能力的复盘重点应该放在:它如何被工程化成稳定的登录入口,而不是只看 SDK API 怎么调。
跳转入口:鉴权主线可先看 Token 鉴权体系、JWT、OAuth2 与移动端双 Token 自动无感刷新;工程化细节再看 移动端一键登录工程化。
反复碰到的问题
1. 为什么切到 HTTP/3 了,首屏还是慢
- 原因常常不在协议本身:可能是 DNS 慢、接口聚合差、服务端慢、图片太大、UI 等全部接口回来才渲染。
- 会怎样:你会误以为“HTTP/3 没效果”,其实瓶颈不在连接层。
- 怎么判断:拆开看 DNS、建连、TTFB、业务处理、首屏渲染各花了多少时间。
2. 为什么弱网下会出现“偶发全部请求都慢一下”
- 常见原因:HTTP/2 连接共用 + TCP 丢包;或者某个网段抖动导致整条连接的有效吞吐瞬时下降。
- 会怎样:页面不是彻底失败,而是多个模块一起延后。
- 举例:首页同时请求多个卡片接口,结果它们像商量好一样晚 1 秒出来。
3. 为什么切网后有些请求像失踪了一样
- 常见原因:老连接失效、DNS 结果过期、上层没有及时取消与重发。
- 会怎样:用户看到 loading 一直转,或者操作后长时间无反馈。
- 举例:从公司 Wi‑Fi 走到室外 5G,提交按钮点了但迟迟不成功,最后又重复提交。
4. 为什么 Pinning 一上就出事故
- 常见原因:只 pin 了单张叶子证书,没有预埋备用公钥或轮换窗口。
- 会怎样:证书续期后,旧版本 App 大面积握手失败。
- 举例:服务端证书正常更新,但客户端全量报 SSL 校验错误。
5. 为什么 Flutter 页面对弱网更容易“看起来乱”
- 常见原因:没有 cancel 旧请求、Notifier/Bloc 状态收口不清晰、错误态和局部 loading 没拆开。
- 会怎样:过期响应覆盖新状态,列表抖动,切页后旧请求还回写。
- 举例:快速切换筛选条件,最后页面显示的不是最后一次点击对应的数据。
高频面试题
HTTP/2 都已经多路复用了,为什么还需要 HTTP/3?
答:因为 HTTP/2 的多路复用建立在 TCP 之上,应用层不阻塞不代表传输层不阻塞。弱网丢包时,TCP 的按序交付会拖住整条连接上的多个 Stream;HTTP/3 把可靠传输和流控制搬到 QUIC,能更好隔离不同流之间的影响,并降低握手与切网成本。
HTTP/3 / QUIC 最适合解决移动端什么问题?
答:最适合解决三类问题:弱网下的丢包拖累、冷启动首请求建连成本、Wi‑Fi 与蜂窝切换时的连接迁移成本。它的价值主要体现在“更稳”和“延迟尖刺更少”,而不是所有请求都绝对更快。
HTTP/3 上线后,是不是可以把 HTTP/2 彻底关掉?
答:通常不能。因为一部分网络环境会限制 UDP,或中间网络设备对 QUIC 支持不佳,所以工程上通常需要保留 HTTP/2 作为回退路径,而不是孤注一掷只跑 HTTP/3。
OkHttp 和 Dio 在这张图里分别扮演什么角色?
答:它们更多属于“请求库层”。OkHttp 更靠近 Android 连接细节,方便直接配置 TLS、连接池、Pinning、拦截器等;Dio 更偏 Flutter 侧请求编排与状态接入,常配合
dart:io或平台插件承接底层能力。HTTPDNS 的核心价值是什么?
答:核心价值不是简单“提速”,而是让客户端对解析结果更可控,减少系统 DNS 劫持、污染、节点调度不合理等问题。真正落地时,重点在于它和现有请求栈、证书校验、缓存/回退策略如何工程化集成。
一键登录为什么也可以放进“移动网络底座”视角里看?
答:因为它强依赖运营商网络链路、超时、回退、页面生命周期和端侧封装稳定性。真正难点不只是调起 SDK,而是把运营商能力、登录状态机、异常回退和跨端封装整合成稳定入口。
对应专题与实验室入口
先去这些已存在专题
- TLS / CA / ECDHE 深挖: TLS 1.2、ECDHE 密钥协商与 CA 信任链
- 弱网长连接、心跳、重连、WAL: 08. 移动端弱网与长连接治理:WebSocket/gRPC、智能心跳重连与离线 WAL 同步
- Token / OAuth2 / 登录主线: Token 鉴权体系、JWT、OAuth2 与移动端双 Token 自动无感刷新
- Flutter / Android 分层参考架构: 2026 生产级参考架构指南:Android (Compose/XML) 与 Flutter 最优解
当前页对应实验情况
| 类型 | 入口 | 说明 |
|---|---|---|
| HTTPDNS 专题 | 09. HTTPDNS / 阿里 DNS 移动端工程化:Android / Flutter 主线、Host/SNI/TLS 边界与回退策略 | 从解析层看 HTTPDNS / 阿里 DNS:它解决什么、为什么不是只会 resolveDomain、以及 Host / SNI / TLS / 回退策略怎么协同。 |
| HTTPDNS Lab | flutter-httpdns-override README | Flutter host 的首版工程化承载,包含预解析、候选 IP、系统 DNS 回退、请求计划与 TLS/SNI 边界演示。 |
| 一键登录专题 | 移动端一键登录工程化 | 从运营商能力、授权页生命周期、回退策略与状态收敛角度看一键登录为什么不是普通 HTTP 登录。 |
| 一键登录 Lab | mobile-one-tap-login README | Flutter host 的状态机 / 回退策略 demo,演示协议校验、失败分叉、短信验证码兜底与登录后用户信息收敛。 |
| 仍建议后续补的实验 | QUIC / HTTP2 弱网对比抓包或时序实验;OkHttp / Dio 超时、取消、重试、401 刷新实验 | 当前主文与两条专题链路已经有真实入口,但 QUIC 抓包与请求库专题实验仍值得后续补齐。 |
复习检查题
为什么 HTTP/2 的“多路复用”不能等同于“弱网下一定不卡”?
答:因为 HTTP/2 只是把多个请求复用到一条 TCP 连接里,应用层并发并不等于传输层完全隔离;一旦 TCP 前面的包丢了,后面的字节即使到了也不能乱序交付,整条连接上的多个 Stream 都可能一起慢下来。
QUIC 最值得移动端重视的三个点是什么?
答:第一是减轻 TCP 层队头阻塞带来的整批卡顿;第二是结合 TLS 1.3 降低建连时延;第三是用 Connection ID 改善 Wi‑Fi/蜂窝切换时的连接迁移体验。
为什么说“网络优化”不能只盯着协议版本?
答:因为用户体感由整条链路共同决定:DNS、建连、服务端处理、请求库配置、缓存、取消、错误态和 UI 渲染都可能成为主瓶颈。只升级 HTTP/3,不会自动修好 DNS 污染、接口慢、乱重试和糟糕的页面状态管理。
Flutter 页面里,什么网络问题经常被误判成“Dio 很慢”?
答:常见根因是请求没有在页面销毁、参数切换、tab 切换时及时取消,导致过期结果晚到后回写 UI;表现上像“网络乱、响应慢”,但本质是请求生命周期和状态管理没收好。
HTTPDNS 和一键登录在这页里为什么只做摘要入口,不展开实现?
答:因为这页主轴是移动网络底座总览,要先回答“它们分别属于哪一层、解决什么问题、为什么真实价值在工程化集成”。具体 SDK 接法、平台坑、异常码处理更适合放到独立专题,否则会冲散 HTTP/2 / HTTP/3 / 弱网治理这条主线。
速记
- HTTP/1.1:连接多,握手重,靠多开连接并发。
- HTTP/2:一个 TCP 扛多请求,平时高效,弱网怕 TCP 丢包拖全局。
- HTTP/3:QUIC over UDP,重点是更稳的多流隔离、更短握手、更好的切网迁移。
- 移动端网络要分层看:DNS 决定去哪里,连接层决定怎么连,请求库决定怎么配,UI 层决定用户怎么感知失败。
- HTTPDNS / 一键登录:都不是“接 SDK 就完事”,真正价值在二次工程化改造和线上问题治理。