低流量场景(例如偶发数据传输、后台同步 infrequent keepalive)会让移动网络和系统进入省电或休眠策略,从而导致连接被关闭或丢包。另一个常见原因是高延迟与丢包:跨国链路本身延迟大,运营商或中间节点的拥塞、丢包会放大 TCP 超时和重传。NAT 超时、APN 限制、移动运营商对长连接的中间设备(如 CGNAT)回收空闲会话,也会让连接中断。最后,还有 DNS 解析延迟、MTU 不匹配引起分片和重传,及应用层没有实现心跳(keepalive)导致的连接失活。
包括链路质量、带宽抖动、丢包率、延迟和 MTU。跨国链路更容易出现高 RTT 和丢包。
移动运营商为省资源会缩短 NAT 会话、断开长时间无数据的 TCP 会话,或对非活跃连接降速。
手机的省电、应用休眠策略会阻止后台网络活动,导致长连接被系统挂起或关闭。
手机端优化应从系统设置、应用设置和连接方式三方面入手。首先在系统层面关闭针对该应用的电池优化(如 Android 的“忽略电池优化”或 iOS 的后台应用刷新设置),并允许后台数据和“始终允许 VPN/代理”。
确保目标应用不会因为省电策略被系统休眠。
使用可靠的公共 DNS(如 1.1.1.1 或 8.8.8.8)可减少解析延迟,必要时检查并恢复 APN 为默认或运营商推荐配置以避免异常限制。
在客户端开启或实现短间隔的心跳(例如 20–60 秒),或使用应用提供的“保持在线”选项,避免连接被 NAT 或运营商回收。
服务器端需要从 TCP/UDP 内核参数和应用层两个角度优化。内核层面可调整 TCP keepalive 时间(net.ipv4.tcp_keepalive_time、tcp_keepalive_intvl、tcp_keepalive_probes),并增加 net.ipv4.tcp_fin_timeout、增加可用端口范围(net.ipv4.ip_local_port_range)以应对短时重连。
对 SSH 可在 /etc/ssh/sshd_config 中设置 ClientAliveInterval=60 与 ClientAliveCountMax=3;对 web 反向代理(如 Nginx)可启用 keepalive_timeout 并调整 proxy_read_timeout、proxy_connect_timeout。
对于 WireGuard 等 UDP 协议,客户端可启用 PersistentKeepalive(例如 25 秒)以维持中间 NAT 的映射;如果使用 IPSec 或 OpenVPN,可开启 ping/keepalive 配置以防 NAT 回收。
在服务器或中间路由上进行 MSS clamping(例如 iptables --clamp-mss-to-pmtu)可避免分片导致的包丢失。
选择取决于需求:若追求轻量与低延迟,推荐 WireGuard(UDP、低开销、支持 PersistentKeepalive);若只需单端口、易穿透的方案,SSH 隧道可作为备用;若有复杂路由或内容分发需求,CDN 结合反向代理可降低跨国延迟对静态资源的影响。对于极低流量与长连接稳定性,优先考虑支持心跳的协议与“始终开启 VPN/代理”能力。
优点:高效、低延迟、易配置的 UDP 隧道。适合移动端配合 PersistentKeepalive 使用。缺点:若网络对 UDP 封锁需备用 TCP 方案。
优点:兼容性强,TCP 模式在封锁情况下更可靠;缺点:TCP over TCP 的性能问题和更高的延迟。
适合仅需要少量端口转发或 HTTP 请求的场景,配置简便,但心跳与重连需自行处理。
下面提供若干示例配置片段与排查流程,便于快速应用和定位问题。
ClientAliveInterval 60 ClientAliveCountMax 3 TCPKeepAlive yes
[Peer] PersistentKeepalive = 25 # 服务器公钥、endpoint 与 allowed IPs 同时配置
net.ipv4.tcp_keepalive_time = 60 net.ipv4.tcp_keepalive_intvl = 20 net.ipv4.tcp_keepalive_probes = 6 net.ipv4.ip_local_port_range = 15000 61000
设置 → 应用 → 目标应用 → 忽略电池优化;开发者选项关闭“后台限制”;VPN 应用开启“始终开启 VPN”。
设置 → 通用 → 后台应用刷新打开;对 VPN 应用开启“始终允许”。
在手机上使用 ping 或应用内网络检测(或从 PC 端 traceroute)查看是否存在明显丢包或高延迟节点。
查看服务器端日志(ssh、vpn、nginx)并用 tcpdump/wireshark 抓包,确认是否有 RST、ICMP 丢包或 MTU 分片异常。
尝试从 UDP 切到 TCP 或更换端口(如 443),以排查被运营商或防火墙策略干扰的可能。
确保客户端心跳间隔小于运营商 NAT 超时时间(通常 60–300 秒),并测试在短时间无流量后是否能自动重连。