Pages

Wednesday, 23 December 2020

网络加速的东东

 主流的网络加速(一般指tcp加速)技术大致可以分为单边加速双边加速

1.1 单边加速

故名思议,只需要在tcp的一端部署的加速技术。因为部署容易,变动不大,所以应用范围较广,包括目前各种商业的的动态加速技术,也大都包含单边加速技术。但也正因为其在tcp一端部署的特性,其必须兼容标准的tcp协议,导致其能优化和调整的地方不如双边加速那么多。绝大大多数的单边加速都是通过优化tcp的拥塞控制算法来实现tcp加速的。

1.2 双边加速

相较于单边加速,双边加速是双端部署,如果是服务器对服务器,那么两边的服务器上都要进行部署,如果是服务器对客户端,那么除了服务器端部署外,客户端也要安装软件。

因为是双边,所以基本上可以说自己的天下了。可以采用各种优化加速技术,例如实现自己更高效的传输协议,数据缓存,流量压缩,多路径转发等。

因为双边加速并未明确的标准或者规范限制,所以各厂商的具体实现也往往不同,但是实现原理大多相同。

笔者自己也经常会使用一些网络加速软件,但是具体加速性能好坏也从来没有对比过,这里主要选择了几款开源(或者能获取到)单边和双边加速软件,对其效果进行测试对比。我们线上业务也有采用类似BBR的单边加速,尤其是针对移动端效果显著(国内的主流网民的网络延时在100ms以下,丢包率10%以下),而网宿,腾讯之类的商业CDN厂商更是很早就已经支持,可以针对特定的网络场景进行优化。

接下来是无聊的部署和测试数据,不感兴趣的可以直接跳到总结。

2. 单边加速

常用的单边加速有FastTCP,ZetaTCP(LotServer锐速),TCP Vegas, KernelPCC.

2.1 部署

2.1.1 Google BBR

地址:https://github.com/google/bbr

安装配置:开启BBR优化算法内核版本必须 4.9 以上,可以使用elrepo的yum源,直接yum安装

#安装yum源 rpm -Uvh http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm #更新到最新版的内核 yum –enablerepo=elrepo-kernel install kernel-ml #vim修改grub.conf的启动首选项,修改为安装内核所在顺序(顺序从0开启)

#reboot重启服务器,切换拥塞控制算法到bbr sysctl -w net.ipv4.tcp_congestion_control=bbr #核实在用的拥塞控制算法 sysctl net.ipv4.tcp_congestion_control

2.1.2 ZetaTCP(LotServer锐速)

地址:官网或者网上第三方提供(一键安装)

安装配置:安装安装说明,一路安装,注意选择跟自己内核相同或者相近的选项。安装成功后不需要重启服务器自动生效

注意:ZetaTCP为商业闭源产品,建议在线上环境上使用时要慎重。

2.1.3 TCP Vegas(优化版)部署

地址:https://github.com/marywangran/qvegas

安装部署:

#升级系统内核到4.9后,切换到qvegas的源代码目录,编译,告警信息可以忽略 make #加载内核模块 insmod tcp_qvegas.ko lsmod | grep qvegas #查看可用的拥塞控制算法 sysctl net.ipv4.tcp_available_congestion_control #切换拥塞控制算法到qvegas sysctl -w net.ipv4.tcp_congestion_control=bbr #核实在用的拥塞控制算法 sysctl net.ipv4.tcp_congestion_control

2.1.4 KernelPCC部署

地址:https://github.com/giltu/KernelPCC

安装部署:

#升级系统内核到4.9后,编辑tcp_TA.c,替换NET_INC_STATS_BH为NET_INC_STATS,替换NET_ADD_STATS_BH为NET_ADD_STATS,保存。 #切换到KernelPCC的源代码目录,编译,告警信息可以忽略 make #加载内核模块 insmod tcp_TA.ko lsmod | grep TA #查看可用的拥塞控制算法 sysctl net.ipv4.tcp_available_congestion_control #切换拥塞控制算法到TA sysctl -w net.ipv4.tcp_congestion_control=TA #核实在用的拥塞控制算法 sysctl net.ipv4.tcp_congestion_control

注意:代码中的name即为算法名称.


(3) 小结

  1. 各阻塞控制算法在低延迟和低丢包率的情况下表现最优,其中bbr的下载性能最好
  2. 随着延时的增加,各下载软件的下载性能也随之降低。其中bbr和zetatcp在高延时的网络环境下表现良好,bbr>zetatcp。
  3. 随着丢包率的增加,各下载软件的下载性能也随着降低。其中zetatcp和bbr在高丢包的网络环境下表现良好。
  4. 如果是高延时和高丢包环境下,zetatcp表现良好。

3. 双边加速

常用的双边加速有kcptun,finalspeed以及UDPspeeder等。

3.1 部署

3.1.1 kcptun

地址:https://github.com/xtaci/kcptun

安装部署:

#直接下载二进制文件 https://github.com/xtaci/kcptun/releases #KCP 客户端 ./client_linux_amd64 -r “KCP_SERVER_IP:4000” -l “:8388” -mode fast2 #KCP 服务段 ./server_linux_amd64 -t “TARGET_IP:8388” -l “:4000” -mode fast2

上面命令会给8388端口建立端口转发,具体数据流如下

应用-> KCP 客户端(8388/tcp) -> KCP 服务端(4000/udp) -> 目标服务器端(8388/tcp)

将原始链接封装进隧道

应用 -> 目的服务器 (8388/tcp)

3.1.2 finalspeed

地址:https://github.com/d1sm/finalspeed

安装部署:该地址已经暂停更新,根据页面信息已经改是闭源改为商业产品了。可以使用第三方提供的一键安装包(安装的是之前开源的方案)。

3.1.3 UDPspeeder

地址:https://github.com/wangyu-/UDPspeeder

安装部署:

#下载编译好的二进制文件,解压到本地和服务器的任意目录。 https://github.com/wangyu-/UDPspeeder/releases #在server端运行: ./speederv2 -s -l0.0.0.0:4096 -r127.0.0.1:7777  -f20:10 -k “passwd” #在client端运行: ./speederv2 -c -l0.0.0.0:3333 -r x.x.x.x:4096 -f20:10 -k “passwd”

现在client和server之间建立起了tunnel。想要连接x.x.x.x:7777,只需要连接 127.0.0.1:3333。来回的所有的udp流量会被加速。

默认情况下只能加速udp流量,如果是其他协议的流量需要配合vpn之类的使用。

小结

  1. 其中正常下载的下载性能在低延时和低丢包率的网络环境下最好。
  2. 随着延时的增加,各下载软件的下载性能也随之降低。其中kcptun和finalspeed在高延时的网络环境下表现良好。
  3. 随着丢包率的增加,各下载软件的下载性能也随着降低。其中kcptun和finalspeed在高延时的网络环境下表现良好。
  4. 如果是高延时和高丢包环境下,kcptun表现良好。

4. 总结

上面是笔者选取了几款单边加速和双边加速软件进行实际测试的结果。不知道是不是双边加速参数调整的问题,测试的结果显示双边加速的优化效果大都不及单边加速(也有可能是因为测试的文件是采用多次压缩的问题,无法发挥双边加速的数据压缩特性)。

注意:双边加速大多都有采用多发的策略,如果部署双边加速,一定要留意服务器是否按照流量进行收费。

测试显示大多加速软件(包括单双边)都有其一定的适用范围:

  1. 对于低延时低丢包率的网络情况,不采用任何加速或者使用bbr或者zetatcp加速比较ok。
  2. 中等丢包率(10%左右)使用bbr无疑是最好的选择。
  3. 高丢包率(>20%)高延时(>100ms)的网络环境下,使用zetatcp或者双边加速kcptun比较合适。尤其是zetatcp和双边加速kcptun在延时100ms,丢包率50%的情况下都能发出会良好的下载加速效果,实在是让人印象深刻。
---------------------------

udpspeederV2+udp2raw 串联加速简明教程


在 @wangyu- 的帮助下,历经九九八十一劫难终于成功串联udpspeederV2+udp2raw。为方便后来者少走我走过的弯路写下这个简明教程供大家参考。以下设置全是基于游戏的应用场景参数,如需要其他的应用场景请自行参考“使用经验”中的参数进行修改。

本脚本无自动启动如需要请自行配置
Step 1
udpspeederV2服务器端配置(centos7,64位)

安装好后,输入以下参数进行配置

  • ./udpspeeder/speederv2_amd64 -s -l0.0.0.0:28900 -r127.0.0.1:你的SS端口 -f2:4 -k "密码自定义" --mode 0 -q1

出现以下提示为成功
123

Step 2
udp2raw服务器端配置

安装好后,输入以下参数进行配置

  • ./udp2raw/udp2raw_amd64 -s -l0.0.0.0:28901 -r127.0.0.1:28900 -a -k "密码自定义" --raw-mode faketcp

出现以下提示为成功
234

Step 3
udpspeederV2客户端配置(梅林路由器)
888888

udp2raw客户端配置(梅林路由器)
66666666

Step 4 (不同linux发行版所需的操作可能略有不同,可以先不做这一步)
添加脚本命令到开机自启动运行
vi /etc/rc.d/rc.local
然后加入以下命令
/udpspeeder/speederv2_amd64 -s -l0.0.0.0:28900 -r127.0.0.1:你的SS端口 -f2:4 -k "密码自定义" --mode 0 -q1 &
/udp2raw/udp2raw_amd64 -s -l0.0.0.0:28901 -r127.0.0.1:28900 -a -k "密码自定义" --raw-mode faketcp &

systemctl status rc-local.service
检查服务是否启动正常

## 到此基本全部结束。记得查看涉及到的端口在防火墙中是否有设置好!


from https://github.com/wangyu-/udp2raw-tunnel/issues/104

----------------------------------------------------


udp2raw UDPspeeder OpenVPN原生运行在windows macOS上加速全流量(附OpenVPN控制udp2raw和UDPspeeder的方法)


原理图

(图本身分辨率很高,如果看不清楚,请单独打开图片查看)

配置OpenVPN

在VPS(linux系统)和本地安装好OpenVPN,并准备好证书和配置文件。 启动OpenVPN server端,Client先不要启动。

OpenVPN配置文件

Server端
local 0.0.0.0
port 7777
proto udp
dev tun

ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt
cert /etc/openvpn/easy-rsa/2.0/keys/server.crt
key /etc/openvpn/easy-rsa/2.0/keys/server.key
dh /etc/openvpn/easy-rsa/2.0/keys/dh1024.pem

server 10.111.2.0 255.255.255.0
ifconfig 10.111.2.1 10.111.2.6

client-to-client
duplicate-cn
keepalive 10 60

max-clients 50

persist-key
persist-tun

status /etc/openvpn/openvpn-status.log

verb 3
mute 20

comp-lzo no   #this option is deprecated since openvpn2.4. For 2.4 and above, use "compress" instead
#compress

fragment 1200       ##### very important    you can turn it up a bit. but, the lower the safer
mssfix 1200         ##### very important

sndbuf 2000000      ##### important
rcvbuf 2000000      ##### important
txqueuelen 4000     ##### suggested

replay-window 2000  ##### suggested
client端
client
dev tun100
proto udp

remote 127.0.0.1 3333
resolv-retry infinite 
nobind 
persist-key 
persist-tun  

ca ./ca.crt
cert ./client.crt
key ./client.key

keepalive 3 20
verb 3
mute 20

comp-lzo no   #this option is deprecated since openvpn2.4. For 2.4 and above, use "compress" instead
#compress

fragment 1200       ##### very important    you can turn it up a bit. but, the lower the safer
mssfix 1200         ##### very important

sndbuf 2000000      ##### important
rcvbuf 2000000      ##### important

replay-window 2000  ##### suggested

route 44.55.66.77 255.255.255.255 net_gateway
redirect-gateway def1
dhcp-option DNS 8.8.8.8
block-outside-dns          ### For non-Windows user delete this line
#route 0.0.0.0 128.0.0.0
#route 128.0.0.0 128.0.0.0

在服务端添加iptables规则 开启ipforward

iptables -t nat -A POSTROUTING -s 10.111.0.0/16 ! -d 10.111.0.0/16 -j MASQUERADE
echo 1 >/proc/sys/net/ipv4/ip_forward

运行udp2raw 和udpspeeder

在vps端运行

 ./speederv2 -s -l0.0.0.0:20000 -r127.0.0.1:7777 -f10:10 --mode 0
./udp2raw -s -l0.0.0.0:20001 -r 127.0.0.1:20000  --raw-mode faketcp  -a -k passwd

在本地运行

udp2raw_mp.exe -c -r44.55.66.77:20001 -l 127.0.0.1:8855 --raw-mode easyfaketcp -k passwd  #或者添加防火墙规则后用faketcp模式
speederv2.exe -c -l0.0.0.0:3333 -r127.0.0.1:8855 -f10:10 --mode 0 --report 10
note

本地是linux系统的用户用如下命令运行udp2raw:

./udp2raw_mp -c -r44.55.66.77:20001 -l 127.0.0.1:8855 --raw-mode faketcp -k passwd -a  

完成

用openvpn client +前面准备好的配置文件,运行,不出意外即可连上server。本地所有流量tcp/udp/icmp都会被udp2raw和UDPspeeder加速。

(但是注意你本地到VPS的流量默认是不走OpenVPN+udp2raw+UDPspeeder的,如果走了OpenVPN会产生环路)


from https://github.com/wangyu-/udp2raw-multiplatform/wiki/udp2raw-UDPspeeder-OpenVPN%E5%8E%9F%E7%94%9F%E8%BF%90%E8%A1%8C%E5%9C%A8windows-macOS%E4%B8%8A%E5%8A%A0%E9%80%9F%E5%85%A8%E6%B5%81%E9%87%8F


附录:

在win系统上OpenVPN客户端支持openvpn连接前和断开后启动脚本,利用这一点,我们设置udp2raw和UDPspeeder脚本来控制其运行和关闭,这样就省去了另外启动关闭udp2raw和UDPspeeder的麻烦了。

假设你的vpn配置文件名为UDPspeeder.ovpn,我们在同一文件夹下创建UDPspeeder_pre.bat和UDPspeeder_down.bat两个批处理(_pre.bat和_down.bat前面的名称一定要和.ovpn前面相同),UDPspeeder_pre.bat内容为

udp2raw_mp.exe -c -r44.55.66.77:20001 -l 127.0.0.1:8855 –raw-mode easyfaketcp -k passwd|speederv2.exe -c -l0.0.0.0:3333 -r127.0.0.1:8855 -f10:10 –mode 0 –report 10

UDPspeeder_down.bat内容为

taskkill -f -im speederv2.exe -im udp2raw_mp.exe

注意要保证udp2raw_mp.exe和speederv2.exe两个文件和上面的三个文件在同一文件夹下(以上内容要根据自己的实际情况变动)。

设置后管理员权限启动OpenVPN客户端连接UDPspeeder即可(点击连接后openvpn会首先调用UDPspeeder_pre.bat脚本来运行udp2raw_mp.exe和speederv2.exe,会等一小段时间,等udp2raw_mp.exe和speederv2.exe运行正常后会弹出连接VPN的界面;断开VPN连接后openvpn会调用UDPspeeder_down.bat脚本来关闭udp2raw_mp.exe和speederv2.exe)。

这里使用了udp2raw和UDPspeeder改变了openvpn数据包也不那么容易被发现了,不过还是建议使用http://www.pivpn.io/此脚本来搭建OpenVPN抗干扰能力强而且OpenVPN2.4的新功能都能用上。

-----------------

UDPSpeeder+Udp2raw使用教程,并配合SSTap加速网络游戏


说明:UDPSpeeder很是一个双边加速工具,本身是加速UDP流量,但也可以加速TCP/UDP/ICMP,而网络游戏也是走的UDP,我们可以用来配合SSTap来最大改善我们的游戏体验,近期作者发布windows版本客户端,使用更加方便了,这里就大概的讲下方法.

简介

UDPspeeder作用是给udp流量加冗余和纠错(RS code),牺牲一定的流量(通常可小于0.5倍),让网络达到接近零丢包。 可以单独加速udp,或配合vpn加速全流量(tcp/udp/icmp)。 最佳的适用场景是加速游戏,也可加速在线视频和网页浏览。

udp2raw不是加速器,只是一个帮助你绕过UDP限制的工具,作用是把udp流量混淆成tcp流量,可以突破udp流量限制或Udp QOS,极大提升稳定性。可以配合kcptun加速tcp,或配合UDPspeeder加速udp,防止各种限速断流。

说明

这里分别说下Udp2raw配置和UDPSpeeder配置,及其串联使用方法。且Udp2raw和UDPspeeder不配合V皮N的情况下只能转发UDP。对于55R等来讲,转发UDP的同时也需要转发TCP,不然UDP功能无法使用,这里会配合tinyPortMapper一起使用。

本文只讲结合SSTap的玩法,也适用ssr,如果你还没有搭建ssr,可以使用下面的方法一键搭建

  1. wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ssr.sh && chmod +x ssr.sh && bash ssr.sh

还有更多玩法可以去下面留的Github项目地址进行研究,有问题请去Issues栏提问,作者很热情,会很快回答你。

配置Udp2raw

1、VPS服务器配置
首先需要在VPS上下载服务端并解压Udp2raw,地址:点击进入,使用命令:

  1. #目前最新版本20180225.0,如果以后有更新的话,方法基本一样
  2. wget https://github.com/wangyu-/udp2raw-tunnel/releases/download/20180225.0/udp2raw_binaries.tar.gz
  3. tar zxvf udp2raw_binaries.tar.gz

此时假设你服务器ip为44.55.66.77,有一个服务监听在udp 7777端口上,比如55R,运行如下命令:

  1. ./udp2raw_amd64 -s -l0.0.0.0:4096 -r 127.0.0.1:7777 -a -k "passwd" --raw-mode faketcp

如果关闭SSH客户端,Udp2raw会停止运行,建议配合nohup或screen保持后台运行,

2、Win客户端配置
首先下载并安装winpcap,地址:https://www.winpcap.org/install/default.htm
也可使用winpcap,据说性能更好一些,但是安装时一定要把”开启winpcap的兼容模式”打勾。地址:https://nmap.org/npcap/。

下载Udp2raw客户端并解压,地址:点击进入。建议解压后直接放到C盘C:\Users\Administrator文件夹。

然后点击Win+R,然后输入cmd,运行命令:

  1. udp2raw_mp_nolibnet.exe -c -l0.0.0.0:3333 -r44.55.66.77:4096 -k "passwd" --raw-mode easy-faketcp
  2. #如果你的udp2raw文件在其它盘,比如D盘的xx文件夹,则需要先运行命令
  3. cd /d d:\xx

然后别关掉CMD界面。

这时候基本就算完成了。 现在在Windows上访问本机的3333即相当于访问VPS的7777端口,通过udp2raw的所有流量都会被混淆成tcp。

配置UDPSpeeder

其实方法和Udp2raw差不多,这里就不仔细讲了,只说个大概。

1、VPS服务器配置
先下载UDPSpeeder服务端并解压,使用命令:

  1. wget https://github.com/wangyu-/UDPspeeder/releases/download/20180522.0/speederv2_binaries.tar.gz
  2. tar zxvf speederv2_binaries.tar.gz

此时假设你服务器ip为44.55.66.77,有一个服务监听在udp 7777端口上,比如55R,运行如下命令:

  1. #此为游戏场景的推荐设置
  2. ./speederv2_amd64 -s -l0.0.0.0:4096 -r127.0.0.1:7777 -k "passwd" -f2:4 --timeout 1

如果关闭SSH客户端,UDPSpeeder会停止运行,同样建议配合nohup或screen保持后台运行。
2、Win客户端配置
客户端下载地址和上面一样,点击进入。下载speederv2_windows.zip文件,并解压到C盘C:\Users\Administrator文件夹。
然后点击Win+R,然后输入cmd,运行命令:

  1. speederv2.exe -c -l0.0.0.0:3333 -r44.55.66.77:4096 -k "passwd" -f2:4 --timeout 1

然后别关掉CMD界面。

UDPSpeeder+Udp2raw串联

本文所讲的方法就是使用UDPSpeeder+Udp2raw串联,配合SSTap加速优化网游,这里就大概的讲下方法。

SSTap建立使用SS的socks5代理,SS再将TCP和UDP流量分别转发到对应的软件,即tinyportmapper接收TCP并转发到SS服务端,udpspeeder接收UDP并转发到udpspeeder服务端,udpspeeder服务端再转发到SS服务端。


图中的端口是我演示使用的端口,在下面的教程中将使用这些端口演示。你可以使用自己SS的端口,把使用到此端口的位置都对应改好即可。

1、VPS服务器配置


  1. wget https://github.com/wangyu-/udp2raw-tunnel/releases/download/20190716.test.0/udp2raw_binaries.tar.gz
  2. wget https://github.com/wangyu-/UDPspeeder/releases/download/20190121.0/speederv2_binaries.tar.gz
  3. tar zxvf speederv2_binaries.tar.gz
  4. tar zxvf udp2raw_binaries.tar.gz

假设你服务器ip为44.55.66.77,有一个服务监听在udp 2333端口上,比如55R,运行如下命令:

  1. #监听端口填对,其它端口不一定要依次挨着,只要首尾对应就行
  2. nohup ./speederv2_amd64 -s -l0.0.0.0:9091 -r127.0.0.1:2333 -f2:4 --mode 0 --timeout 0 >speeder.log 2>&1 &
  3. nohup ./udp2raw_amd64 -s -l0.0.0.0:9090 -r127.0.0.1:9091 -k "passwd" --raw-mode faketcp -a >udp2raw.log 2>&1 &

运行以上命令后使用ps -aux查看是否运行成功,如果运行失败使用kill pid结束进程.
使用nohup –v(两个减号)查看是否安装nohup,如果没有安装使用yum install nohup安装即可,你也可以使用Screen后台运行。

2、Win客户端配置
UDPSpeeder和Udp2raw客户端文件下载:UDPSpeeder、Udp2raw,下载后都解压到C盘C:\Users\Administrator文件夹。
然后点击Win+R,然后输入cmd,运行命令:

  1. udp2raw.exe -c -l0.0.0.0:9079 -r44.55.66.77:9090 -k "passwd" --raw-mode faketcp
  2. speederv2.exe -c -l0.0.0.0:1076 -r127.0.0.1:9079 --mode 0 -f2:4 --timeout 1

可以双开CMD界面分别运行2条命令。

TCP端口转发

只转发UDP在55R上是用不了UDP功能,这里还需要转发下TCP,在VPS上先安装BBR加速TCP。

  1. #使用秋水的脚本
  2. wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh && chmod +x bbr.sh && ./bbr.sh

然后在电脑上,下载Win版的tinyPortMapper,下载tinymapper_windows.zip然后解压到C盘C:\Users\Administrator文件夹。
依然点击Win+R,然后输入cmd,运行命令:

  1. #使用本地的1025端口转发服务器的1025端口,记得转发的TCP的端口和上面的UDP端口一致。
  2. tinymapper.exe -l 0.0.0.0:1076 -r 44.55.66.77:1025 -t

好了,这里差不多配置完了,差不多总共需要开2个SSH窗口,3个CMD窗口。

最后贴上客户端始终在后台运行的命令start.bat

  1. @ECHO OFF
  2. %1 start mshta vbscript:createobject("wscript.shell").run("""%~0"" ::",0)(window.close)&&exit
  3.  
  4. start /b udp2raw.exe -c -l0.0.0.0:9079 -r34.92.72.227:9090 -k "passwd" --raw-mode faketcp
  5. start /b speederv2.exe -c -l0.0.0.0:1076 -r127.0.0.1:9079 -f2:4 --mode 0 --timeout 0
  6. start /b tinymapper.exe -l0.0.0.0:1076 -rxx.xx.xx.xx:2333 -t

结束进程的脚本stop.bat如下

  1. @ECHO OFF
  2.  
  3. taskkill /im speederv2.exe /f
  4. taskkill /im udp2raw.exe /f
  5. taskkill /im tinymapper.exe /f
  6.  
  7. ping -n 2 127.1 >nul

其中,xx.xx.xx.xx是服务器ip,后面2333根据自己的需求修改端口。

配置SSTap

首先查看使用教程:SSTap:可以用ssr进行海外游戏加速,记得55R服务器IP填127.0.0.1,端口填转的端口,比如本文的1076,其他参数一模一样。

  • UDPspeeder项目地址:https://github.com/wangyu-/UDPspeeder
  • Udp2raw项目地址:https://github.com/wangyu-/udp2raw-tunnel
  • tinymapper项目地址:https://github.com/wangyu-/tinyPortMapper




No comments:

Post a Comment