KCPTun是一个使用UDP来实现网络加速传输速度的开源软件。
KCPTun网络结构
Kcptun结构图
TCP协议是可靠的数据流传输协议。简单来说,如果数据传输过程中发生了丢包,TCP协议会重新发送相应数据包,如果数据包到达顺序与发送顺序不一致,TCP协议会进行数据包重组,即:TCP协议可以通过控制帧来保证数据流的传输顺序和正确性。但TCP协议的控制机制比较复杂,在线路质量差导致丢包率极高时,传输效率就会指数级下降。
UDP协议是数据报协议,由于比TCP简单得多,传输效率和延迟率都要优于TCP协议,但UDP协议不是可靠的传输协议,不能保证数据正确与可达,所以只能应用在一些对单个数据包的正确与可达不是要求很严格(比如:IM)、但对数据传输延迟率有很高要求(比如:视频流或者多人在线游戏)的场合。
有没有一种传输协议既可信又能保证传输效率呢?这就是R-UDP:可信UDP协议,一种在UDP协议基础上增加了部分TCP的控制逻辑来保证数据正确完整的协议。目前已经有很多可用库(rUDP、enet等等),虽然没有成为像TCP/UDP这样的标准协议,但已经广泛运用到了大型多人在线游戏等领域。KCPTun就是利用这种机制实现UDP可靠传输(KCP over UDP),来大幅加速网络传输效率的。
网络测试
丢包率/网络延时测试:
ping -n 100 www.baidu.com,windows –n/linux -c
总结:
在丢包率比较大的情况下加速才比较明显,网络丢包率很小或者不丢包时反而会降低传输效率。
Kcptun网络加速
Kcptun
集成加速Shadowsocks
Windows&Linux64位版本
解压 tar -zxvf xxxx.tar.gz
WindowsClient客户端命令
client_windows_amd64 -r "172.245.210.123:61250" -l ":61240" -mode fast2
LinuxServer服务端命令
/home/soft/server_linux_amd64 -t "127.0.0.1:61240" -l ":61250" -mode fast2
速度
fast3 > fast2 > fast > normal > default
参数调试
// FEC关闭
-datashard 0 -parityshard 0
//调节发送/接受窗口
-sndwnd 2048 -rcvwnd 512
//高有效载荷
-mtu 1300 -sndwnd 2048 -rcvwnd 512 -datashard 0 -parityshard 0 -mode normal -nodelay 1 -resend 0 -nc 1 -interval 500
参数issue:
https://github.com/xtaci/kcptun/issues/251参数组合分享
https://github.com/xtaci/kcptun/issues/342增加SNMP信息
https://github.com/xtaci/kcptun/issues/329有效载荷
参数解析
* --nocomp true/false //是否压缩
* --localaddr value, -l value //本地地址
* --remoteaddr value, -r value // kcp server address
* //加密算法
* --crypt value // aes, aes-128, aes-192, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, xor, none (default: "aes")
* -crypt none //不加密
* --key value //加密密码?
* --mode value //模式 profiles: fast3, fast2, fast, normal (default: "fast")
* --conn value //设置服务器的UDP连接数(默认值:1)
* --autoexpire value //设置单个UDP连接的自动过期时间(以秒为单位),禁用0(默认值:0)
* --mtu value //设置UDP数据包的最大传输单元(默认值:1350)
* --sndwnd value //设置发送窗口大小(数据包数量)(默认值:128)
* --rcvwnd value //设置接收窗口大小(数据包数量)(默认值:512)
* --datashard value, --ds value //设置reed-solomon删除编码 - 数据库 (default: 10)
* --parityshard value, --ps value //设置reed-solomon擦除编码 - 奇偶校验分片(默认值:3)
* // fec占比parityshard/datashard parityshard=0关闭FEC
* --dscp value // set DSCP(6bit) (default: 0)
*常用值:https://en.wikipedia.org/wiki/Differentiated_services#Commonly_used_DSCP_values
* --snmplog value //收集snmp文件,了解golang的时间格式,如:./snmp-20060102.log
* --snmpperiod value // snmp collect period, in seconds (default: 60)
* --log value // specify a log file to output, default goes to stderr
* -c value // config from json file, which will override the command from shell
* --help, -h // show help
* --version, -v // print the version
*手动控制
* -mode manual -nodelay 1 -interval 20 -resend 2 -nc 1
* nodelay:是否启用节点模式,未启用0; 1启用。
* interval:协议内部工作间隔,以毫秒为单位,例如10毫秒或20毫秒。
* interval的作用是控制 flush 的时间间隔,主要控制 cpu 的耗用
* interval设的大些可以增加有效数据的载荷
* resend:快重传模式,0表示默认关闭,2可以设置(2个ACK跨度将导致直接重传)
* nc:是否关闭流量控制,0代表默认“不关闭”,1代表“关闭”。
*总结:
*场景:丢包率小/大延时网络场景
* FEC/MTU/发送-接收窗口参数对带宽影响大
* crypt/nocomp加密压缩影响性能及安全性
*手动控制参数影响小
* REF:
* https://github.com/xtaci/kcptun
* https://github.com/skywind3000/kcp/blob/master/README.en.md#protocol-configuration
官方资源
Ref: