继续之前关于 通过 Docker Compose 在应用的 Nginx 前部署 Caddy 的讨论:
在我之前关于在 Discourse 的 nginx 容器前运行 Caddy 以提供 HTTP/3 和 QUIC 0-RTT 的讨论之后,我一直在研究一个相关但独立的问题:多路径 TCP (MPTCP) 是否能在 iOS 用户在 Wi-Fi 和蜂窝网络之间切换时改善连接的连续性。
我之前的工作主要关注初始页面加载性能。而这个问题有所不同:我经常在移动中访问我的私人 Discourse 学习存档,连接中断或缓冲会延迟我获取重要信息。
我为什么提出这个问题
在某些地点,Wi-Fi 很稳定但蜂窝信号很差;而在其他地方,情况则相反。
普通的 iOS 网络切换并不总能提供我所需要的连续性。我已经使用独立的网络绑定/故障转移技术来增强连接韧性,但我感兴趣的是,是否可以在 iOS 客户端和我的 Discourse 服务器之间原生地实现部分这种连续性。
具体来说,我关注的是连接切换(handover)和避免请求停滞,而不一定是要聚合两个连接的带宽。
我目前的发现
Linux MPTCP 兼容性文档 列出了 Caddy v2.10.0 及更高版本默认支持 MPTCP,具体取决于操作系统的支持情况。
Apple 的 MPTCP 文档 描述了应用程序如何通过 URLSessionConfiguration 选择加入 MPTCP。
然而,我也找到了一个 Apple 开发者论坛的解释,指出 WKWebView 没有暴露等效的 MPTCP 配置选项。
这让我对 DiscourseHub、Safari 或已安装的 iOS PWA 是否能从 MPTCP 中受益感到不确定,尤其是在同时提供基于 QUIC 的 HTTP/3 的情况下。
已确认的服务器环境
我使用只读命令检查了生产 VPS,未修改其配置。
-
反向代理: Caddy v2.11.4,官方
caddy:2.11.4Docker 镜像 -
主机: Ubuntu,Linux 内核
6.8.0-146-generic -
主机 MPTCP:
net.mptcp.enabled = 1 -
容器 MPTCP:
/proc/sys/net/mptcp/enabled = 1 -
Docker 网络:
caddy_default,驱动bridge,选项{} -
Go 环境:
GODEBUG未设置 -
发布端口: TCP 80、TCP 443 和 UDP 443,在 IPv4 和 IPv6 上
Discourse 的 nginx 仍然位于 Caddy 之后,由 Caddy 提供公共的 HTTPS 和 HTTP/3 端点。
这些检查表明服务器具备 MPTCP 支持的基本前提条件,尽管我尚未通过 Docker 的发布端口转发验证实际的 MPTCP 协商。
问题
-
DiscourseHub: 其 iOS 网络功能是否使用了能够请求 MPTCP 的组件,还是其主要网页内容通过不暴露此功能的网络 API 处理?
-
Safari 和已安装的 PWA: 通过 DiscourseHub、Safari 和已安装的 iOS PWA 访问 Discourse 之间是否有区别?客户端是否必须显式请求 MPTCP,还是这些访问方式中的任何一种都可以透明地受益?
-
Docker 网络: bridge/NAT 配置能否保留初始的 MPTCP 协商和额外的子流(subflows),还是这会导致连接回退到普通 TCP?
-
HTTP/3 与 MPTCP: 由于 HTTP/3 使用基于 UDP 的 QUIC 而不是 TCP,当切换网络时,QUIC 连接迁移是否能提供类似的连续性?在这种情况下,基于 MPTCP 的 HTTP/2 和基于 QUIC 的 HTTP/3 之间是否有实际区别?
-
Discourse 端恢复: Discourse 或其 iOS 客户端中是否存在现有机制,用于在底层网络变化时恢复中断的请求?是否有推荐的方法来确定 iOS 客户端实际使用的传输层?
我并不是建议 Discourse 本身应该管理多个网络接口。我试图理解责任在 iOS 客户端、传输协议、Docker/Caddy 和 Discourse 之间是如何分配的,以及是否有我可以利用的现有功能。
对于任何指引或对我理解的纠正,我将不胜感激。
谢谢!