本质是TCP拥塞控制在长RTT、高丢包链路的负向放大;需阻断堆积源头并释放滞留数据,先用ss -i命令检查rcv_ssthresh是否极低以区分拥塞型堆积与配置溢出。

跨地域内网穿透反代中,Master节点缓冲区数据堆积,本质是TCP拥塞控制在长RTT、高丢包链路上的负向放大——特别是当代理链路本身已嵌套TCP(如frp over TLS over TCP),再叠加底层网络拥塞时,双重慢启动、重复重传和缓冲区滞留会迅速耗尽Master内存与连接资源。解决重点不是“加速传输”,而是“阻断堆积源头+释放滞留数据”。
识别是否为拥塞型堆积而非配置溢出
先排除误判:执行 ss -i | awk '$1 ~ /^tcp/ {print $2,$3,$7}' | head -20 查看活跃连接的 rcv_ssthresh 与 rcv_space。若大量连接显示 rcv_ssthresh 极低(rcv_space 接近 tcp_rmem 最大值,说明接收窗口被持续压制,是典型拥塞反馈;若 rcv_space 高但无数据读取(sk_rmem_alloc 持续不降),才是应用层未消费导致的堆积。
禁用TCP-over-TCP结构,改用UDP承载隧道
frp、nps等工具默认走TCP隧道,在跨地域场景下极易触发TCP-in-TCP问题:外层TCP因丢包重传,内层TCP误判为网络恶化而收缩cwnd,形成恶性循环。必须切换为UDP隧道模式:
- frp服务端启用 udp_mux = true,客户端配置 protocol = udp;
- 若需强可靠性,用KCP替代原生UDP(frp支持 kcp 协议),它基于UDP但自带前向纠错与动态FEC,比双TCP吞吐高3–5倍、延迟低40%以上;
- 禁用所有TLS-over-TCP封装(如stunnel套frp),改用frp内置 use_encryption = true(AES-GCM轻量加密),避免额外TCP握手与缓冲开销。
收紧Master节点TCP栈与应用缓冲联动
缓冲区堆积是内核与用户态协同失控的结果,需两端同步约束:
- 内核层:设BDP导向的硬上限,例如北京↔新加坡(RTT≈80ms,带宽1Gbps)→ BDP≈10MB → 执行:
sysctl -w net.ipv4.tcp_rmem="4096 131072 8388608"(8MB收缓冲上限)
sysctl -w net.core.rmem_max=8388608 && sysctl -w net.ipv4.tcp_moderate_rcvbuf=0; - 应用层:frps配置中显式限制每连接缓冲,如 max_buffer_size = 2097152(2MB),并开启 tcp_mux = true 复用连接,避免每请求新建TCP流;
- 关键动作:在frps.ini的[common]段添加 heartbeat_timeout = 30 和 heartbeat_interval = 15,主动淘汰空闲连接,防止“僵尸连接”长期占缓冲。
用BBRv2替代Cubic,抑制重传雪崩
传统Cubic在跨境链路上易因短暂丢包激进降窗,恢复慢;BBRv2(Linux 5.10+)通过建模带宽+RTT,主动避开拥塞点,对长肥管道(Long Fat Network)更友好:
- 启用命令:sysctl -w net.ipv4.tcp_congestion_control=bbr2;
- 验证生效:sysctl net.ipv4.tcp_congestion_control 应返回 bbr2;
- 配套调大初始cwnd:ip route change default via [gw] dev [if] initcwnd 30,缩短首包传输爬坡时间。

















