logo NodeSeekbeta

通过日本中转拆分TCP提高美西单线程TCP速度

写在前面:

  1. 此方案适合本身拥有亚太线路机(特别是日本),需要顺带拉美西(落地)的人
  2. 此方案单纯成本上肯定远远贵于美西线路机

很多人(包括我自己)拿到美西线路机,在多个终端上测速,单线程最大也就200M左右,都会以为是运营商锁死单线程。单线程速度不够高时,表现看视频的缓冲速度可能不够快(例如油管虽然够用,但跑分较低)。因为我同时测试gen2和turin,发现前者大概是500M,后者能跑满1000M+,因此我认为不是运营商的问题。

简单询问AI,AI表示是BDP(带宽延迟积) 决定。
BDP=带宽x(往返延迟)RTT
在默认情况下,如果操作系统或软件的 TCP 窗口大小(Window Size) 设置得不够大,数据传输就会进入“走走停停”的状态。160ms 的延迟意味着数据包在路上要花很长时间,如果窗口填满了,发送端就必须停下来等回包,导致带宽无法跑满。也就是绝大部分人被限制在200M左右,这其实是物理距离太远限制造成的

那为什么机场的专线能无视这个RTT,说明这个并不是无解的,而且也有mjj能跑到接近千兆的水平。一般来说,提高终端设备(以及美西服务器)的TCP窗口能直接解决问题,但是对我来说,我不希望每个终端设备还要调整这个。因此询问AI后,测试发现通过分拆TCP是一个可行的方案。即将
本地->美西 160ms延迟
拆成
本地->日本 60ms延迟 日本->美西 100ms延迟
两段,这样就能显著降低RTT的影响,终端不做任何调整,美西单线程测速能达到500M左右。
实际的技术方案就是在日本机器上部署一个HAProxy或者Nginx Stream拆分TCP并转发到美西。以下为HAPrxoy为例,下面的代码就是将日本服务器的54321口转发到美西ip的12345口,如果部署需要按照自己的需求更改配置:
frontend fe_54321
bind :54321
default_backend be_12345
部分,54321更改成自己希望的日本服务器入口,
backend be_12345
server c1 美西机器ip:12345
更改为自己美西代理服务的入口ip和端口

启用后,直接将美西代理配置的ip和入口改成日本的ip和入口,即可实现tcp split提速。实测经过提速后,原来200M的单线程可以提升到480M左右,油管美西速度能到18W左右

而直接用代理链因为没有进行TCP拆分,握手仍然是本地和美西完成,并不能提速,只有TCP Split本地先和日本握手,日本再和美西握手才有此效果

备注:

  1. 此方案只处理TCP,如果同时需要UDP转发,可能需要再用nftables之类的进行转发
  2. 这一方案对日本机器的性能要求会略高一点,iperf3测速时CPU占用会比较高,但speedtest单线程测速并不高。
  3. 由于使用日本中转到美西,因此美西其实无需线路机,落地机即可
  4. 日本和美西之间的TCP调优最好还是继续做,因为整条线路的速度略低于分段线路的最低值(瓶颈效应以及拆分的额外开销)
apt-get update
apt-get install -y haproxy

# 创建haproxy配置文件
cat > /etc/haproxy/haproxy.cfg <<EOF
global
  log /dev/log local0
  log /dev/log local1 notice
  daemon
  maxconn 20000
  ulimit-n 200000

defaults
  mode tcp
  log global
  option tcplog

  # 关键:零拷贝/低抖动
  option splice-auto

  timeout connect 5s
  timeout client  10m
  timeout server  10m
  timeout client-fin 30s
  timeout server-fin 30s

# --- Port maps with split (TCP) ---
frontend fe_54321
  bind :54321
  default_backend be_12345
backend be_12345
  server c1 美西机器ip:12345
EOF

# 创建haproxy服务
cat > /etc/systemd/system/haproxy-split.service <<EOF
[Unit]
Description=HAProxy TCP Split Proxy (Production)
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy-split.pid
ExecReload=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy-split.pid -c
ExecReload=/bin/kill -USR2 $MAINPID

Restart=always
RestartSec=2

# 关键:文件句柄、进程数
LimitNOFILE=200000
LimitNPROC=65535

# 安全加固(不影响性能)
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=true

# 允许绑定低端口(你现在端口都>1024,其实不必须)
AmbientCapabilities=CAP_NET_BIND_SERVICE
CapabilityBoundingSet=CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target
EOF

# 启动服务
systemctl daemon-reload
systemctl enable --now haproxy-split
systemctl status haproxy-split --no-pager

# 确认log
journalctl -u haproxy-split -f

1234
  • 有测速对比结果吗

  • 都有亚太线路了还去美西干嘛,不理解

  • 成本略高

  • 有些地区运营商就是限制200 不用想了 同设备 minibox 移动5G国内测速千兆 iperf3 600兆 联通5g国内800兆 iperf3卡死200±5兆

  • @yuqi923 #7 发布于2025/12/19 10:07:46
    有些地区运营商就是限制200 不用想了 同设备 minibox 移动5G国内测速千兆 iperf3 600兆 联通5g国内800兆 iperf3卡死200±5兆

    dmit也是这样

  • 另外这样相当于用日本中转美西,就要求日本线路要好,美西走国际,就浪费美西cn2了

1234

你好啊,陌生人!

我的朋友,看起来你是新来的,如果想参与到讨论中,点击下面的按钮!

📈用户数目📈

目前论坛共有62366位seeker

🎉欢迎新用户🎉