

Kcptun 基于 KCP 协议的 UDP 隧道,是一个非常简单和快速的隧道,它可以将 TCP 流转换...
source link: https://www.toolsbook.org/2023/12/kcptun-kcp-udp-tcp-kcpudp.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Kcptun 基于 KCP 协议的 UDP 隧道,是一个非常简单和快速的隧道,它可以将 TCP 流转换为 KCP+UDP 流,降低延时,增加吞吐量
本博客曾经发布了通过 Finalspeed 加速 Shadowsocks 的教程,大家普遍反映能达到一个非常不错的速度。Finalspeed 虽好,就是内存占用稍高,不适合服务器内存本来就小的用户;而且现在 Finalspeed 停止维护,就需要寻找一个能替代 Finalspeed 的工具。
今天我就给大家介绍这么一个能替代 Finalspeed 的项目 — Kcptun。
Kcptun 介绍
Kcptun 是一个非常简单和快速的,基于 KCP 协议的 UDP 隧道,它可以将 TCP 流转换为 KCP+UDP 流。而 KCP 是一个快速可靠协议,能以比 TCP 浪费 10%-20% 的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。
Kcptun 是 KCP 协议的一个简单应用,可以用于任意 TCP 网络程序的传输承载,以提高网络流畅度,降低掉线情况。由于 Kcptun 使用 Go 语言编写,内存占用低(经测试,在 64M 内存服务器上稳定运行),而且适用于所有平台,甚至 Arm 平台。
Kcptun 工作示意图:
KCP 协议:https://github.com/skywind3000/kcp
Kcptun 项目地址:https://github.com/xtaci/kcptun
以下为 Kcptun 的相关项目,如果有兴趣,可以了解一下。
1.Kcp-server:https://github.com/clangcn/kcp-server
Kcp-server 是在 Kcptun 的基础上,添加了配置文件的支持,并简化了安装过程,一条命令即可配置完毕。
如果你是小白,而且看了后面的教程也看不懂的话,推荐直接使用 Kcp-server 吧,就是更新较原版略慢。
2.Shadowsocks-Plus:https://github.com/shadowsocks-plus/shadowsocks-plus
基于 Shadowsocks Go 版本,加入了以下特性:
- 启动后降低权限至 nobody , 增强安全性;
- 与 kcptun 集成,配合相应客户端可加速传输;
- 网页控制面板。
部署 Kcptun
2016.08.19 添加客户端可视化配置工具 Kcptun-GUI
2016.08.13 发布一键安装脚本 https://blog.kuoruan.com/110.html
2016.08.06 添加 Kcptun 可视化运行工具和 Android 使用说明。
2016.06.27 v20160627 发布,新参数 - nocomp,需要在两端同时使用以禁止压缩传输。
2016.06.17 添加客户端开机自启批处理,重写软件启动 vbs 脚本。
现在博主编写的一键安装脚本已公开发布测试,支持 Kcptun 一键安装、更新、卸载、配置,欢迎测试使用:Kcptun Server 一键安装脚本
以下为手动配置方式:
本教程以 CentOS 6.5 64 位为例。
首先下载 Kcptun,可以到 GitHub 上获取最新版:
用 Xshell 或者 Putty 登陆服务器,下载 Kcptun 的预编译版:
mkdir /root/kcptun cd /root/kcptun wget https://github.com/xtaci/kcptun/releases/download/v20160816/kcptun-linux-amd64-20160816.tar.gz tar -zxf kcptun-linux-amd64-*.tar.gz |
注:请根据你的系统下载对应版本。32 位系统下载 kcptun-linux-386-*.tar.gz,64 位系统下载 kcptun-linux-amd64-*.tar.gz
解压之后有两个文件:client_linux_amd64 和 server_linux_amd64,一个用于服务器,一个用于客户端。
这个项目目前还没有 init 脚本,也还不支持配置文件,于是我写了两个简单的 sh 脚本,用于启动和关闭服务端。请在服务端程序相同目录下新建两个文件 start.sh 和 stop.sh。
创建 start.sh
vi /root/kcptun/start.sh |
写入以下内容:
#!/bin/bash cd /root/kcptun/ ./server_linux_amd64 -l ":29900" -t "127.0.0.1:8388" -key test -mode fast2 > kcptun.log 2>&1 & echo "Kcptun started." |
server_linux_amd64 对应服务端文件名,请对应修改。
- -l 表示 Kcptun 的服务端监听端口,用于接收外部请求和发送数据,默认:29900,请选一个你喜欢的端口;
- -t 表示要加速的地址,由于 Kcptun 和 Shadowsocks 在同一服务器,地址填写 127.0.0.1,而 8388 为 Shadowsocks 端口;
- -key 是 Kcptun 的验证密钥,服务端和本地必须一致才能通过验证,请自行设置(可省略)默认:it’s a secrect,这里自定义为了 test;
- -mode 为加速模式,默认 fast,这里使用 fast2。
响应速度:
fast3 > [fast2] > fast > normal > default
有效载荷比:
default > normal > fast > [fast2] > fast3
中间 mode 参数比较均衡,总之就是越快越浪费带宽(根据设置,可能会浪费数倍流量),请自行斟酌。推荐模式 fast2。
可用的参数请使用 ./server_linux_amd64 -h 查看:
$ ./server_darwin_amd64 -h NAME: kcptun - kcptun server USAGE: server_darwin_amd64 [global options] command [command options] [arguments...] VERSION: 20160811 COMMANDS: help, h Shows a list of commands or help for one command GLOBAL OPTIONS: --listen value, -l value kcp server listen address (default: ":29900") --target value, -t value target server address (default: "127.0.0.1:12948") --key value key for communcation, must be the same as kcptun client (default: "it's a secrect") [$KCPTUN_KEY] --crypt value methods for encryption: aes, tea, xor, none (default: "aes") --mode value mode for communication: fast3, fast2, fast, normal (default: "fast") --mtu value set MTU of UDP packets, suggest 'tracepath' to discover path mtu (default: 1350) --sndwnd value set send window size(num of packets) (default: 1024) --rcvwnd value set receive window size(num of packets) (default: 1024) --nocomp disable compression --datashard value set reed-solomon erasure coding - datashard (default: 10) --parityshard value set reed-solomon erasure coding - parityshard (default: 3) --dscp value set DSCP(6bit) (default: 0) --help, -h show help --version, -v print the version |
更深层次的参数调整需要理解 KCP 协议,并通过 “隐藏参数” 调整。巭孬嫑乱动
下面是作者给的配置参数样例,适用大部分 ADSL 接入(非对称上下行)的参数(实验环境电信 100M ADSL)。其它带宽请按比例调整,比如 50M ADSL,把 CLIENT 的 -sndwnd -rcvwnd 减掉一半,SERVER 不变。
服务端: -mtu 1400 -sndwnd 2048 -rcvwnd 2048 -mode fast2 客户端: -mtu 1400 -sndwnd 256 -rcvwnd 2048 -mode fast2 -dscp 46 |
在不丢包的情况下,有最大 - rcvwnd 个数据包在网络上正在向你传输,以平均数据包大小 avgsize 计算,在任意时刻,有:
network_cap = rcvwnd*avgsize
数据流向你,这个值再除以 ping 值 (rtt),等于最大带宽使用量。
max_bandwidth = network_cap/rtt = rcvwnd*avgsize/rtt
举例,设 rcvwnd = 1024, avgsize = 1KB, rtt = 400ms,则:
max_bandwidth = 1024 * 1KB / 400ms = 2.5MB/s ~= 25Mbps
(注:以上计算不包括前向纠错的数据量)
前向纠错是最大带宽量的一个固定比例增加:
max_bandwidth_fec = max_bandwidth*(datashard+parityshard)/datashard
举例,设 datashard = 10 , partiyshard = 3,则:
max_bandwidth_fec = max_bandwidth * (10 + 3) /10 = 1.3*max_bandwidth = 1.3 * 25Mbps = 32.5Mbps
看不懂?那就别管它,你只要会简易自我调优方法就够了:
- 同时在两端逐步增大 client rcvwnd 和 server sndwnd;
- 尝试下载,观察如果带宽利用率(服务器+客户端两端都要观察)接近物理带宽则停止,否则跳转到第一步。
基本原则:SERVER 的发送速率不能超过 ADSL 下行带宽,否则只会浪费您的服务器带宽。
下面开始创建启动软件所需要用到的一些文件,都是 vi 的基础操作,我不写具体的编辑保存命令了,不会的可以自己搜索一下。
创建 stop.sh
vi /root/kcptun/stop.sh |
写入以下内容:
#!/bin/bash echo "Stopping Kcptun..." PID=`ps -ef | grep server_linux_amd64 | grep -v grep | awk '{print $2}'` if [[ "" != "$PID" ]]; then echo "killing $PID" kill -9 $PID echo "Kcptun stoped." |
创建 restart.sh
#!/bin/bash cd /root/kcptun/ sh stop.sh echo "Restarting Kcptun..." sh start.sh |
然后可以启动服务端:
sh /root/kcptun/start.sh |
/root/kcptun/kcptun.log 为日志信息。
监听日志信息可以使用:
tail -f /root/kcptun/kcptun.log |
停止服务端请使用:
sh /root/kcptun/stop.sh |
stop.sh: [[: not found |
如果使用如下命令:
ls -l /bin/sh lrwxrwxrwx 1 root root 4 Dec 28 2015 /bin/sh -> dash |
可以看到 sh 指向了 dash,而 dash 是不认识 “[[” 的。为了解决这个问题,可以将默认使用的 shell 更换为 bash:
ln -sf /bin/bash /bin/sh |
切换回去请使用:
ln -sf /bin/dash /bin/sh |
重启服务端:
sh /root/kcptun/restart.sh |
添加开机启动:
Centos:
chmod +x /etc/rc.d/rc.local;echo "sh /root/kcptun/start.sh" >> /etc/rc.d/rc.local |
Ubuntu/Debian:
chmod +x /etc/rc.local;echo "sh /root/kcptun/start.sh" >> /etc/rc.local |
如果你有任何问题,欢迎加入我们的 QQ 群寻求帮助:43391448
配置客户端
以本地 Windows 64 位系统为例,首先下载 Kcptun 的 Windows 版本。
我这里先新建一个文件夹,命名为 Kcptun,然后下载:
https://github.com/xtaci/kcptun/releases/download/v20160816/kcptun-windows-amd64-20160816.tar.gz |
解压到文件夹下。
当前,Kcptun 已经有可视化配置工具了,你可以自行选择使用。如果不想用工具,可以往后翻,使用传统的文件启动方式。
1. 来自 “逗比根据地” 的 Kcptun tools。由于软件是易语言编写的,可能会被杀毒软件报毒,请各位自行查毒。
软件说明:http://www.dou-bi.com/ss-jc37/
2016.08.17 V1.0.3 发布
软件下载地址:https://pan.baidu.com/s/1i5HdlVv
2.KcptunGUI,来自 “诸神的黄昏”。
源码地址:https://git.oschina.net/ragnaroks/KcptunGUI
软件下载:https://git.oschina.net/ragnaroks/KcptunGUI/releases
注意:客户端和服务端参数必须一致的有:
- datashard
- parityshard
- nocomp
- crypt
以下为手动创建启动文件的方法:
由于 Kcptun 是控制台程序,所以我选择使用 vbs 脚本,来达到后台运行的目的。
新建 run.vbs
Dim RunKcptun Set fso = CreateObject("Scripting.FileSystemObject") Set WshShell = WScript.CreateObject("WScript.Shell") '获取文件路径 currentPath = fso.GetFile(Wscript.ScriptFullName).ParentFolder.Path & "\" '软件运行参数 exeConfig = "client_windows_amd64.exe -l :12948 -r 10.10.10.10:29900 -key test -mode fast2" '日志文件 logFile = "kcptun.log" '拼接命令行 cmdLine = "cmd /c "& currentPath & exeConfig &" > "& currentPath & logFile &" 2>&1" '启动软件 WshShell.Run cmdLine, 0, False '等待 1 秒 'WScript.Sleep 1000 '打印运行命令 'Wscript.echo cmdLine Set WshShell = Nothing Set fso = Nothing '退出脚本 WScript.quit |
本地监听端口为 12948;服务器 IP 地址 10.10.10.10 端口 29900;验证密钥和服务端一致。其他参数说明见上面服务端配置的说明。
v20160616 新增参数:-conn,使用多线程连接。可尝试添加 -conn 4 以使用 4 线程连接服务器。
新建 stop.bat
taskkill /f /im client_windows_amd64.exe |
然后双击 run.vbs 运行程序,使用 stop.bat 来停止程序,kcptun.log 为输出的日志信息。
开机启动配置:
新建 startUp.bat:
@echo off title Kcptun 开机启动设置 mode con cols=50 lines=20 color A echo. echo. Kcptun 启动项设置 echo. echo. 此批处理可以将 Kcptun 客户端添加到开机启动 echo. echo. 请将该文件放到 run.vbs 相同目录后运行 echo. echo. 查看说明:https://blog.kuoruan.com/102.html echo. set /p ST= 输入 y 添加开机启动,输入 n 取消开机启动: if /I "%ST%"=="y" goto addStartup if /I "%ST%"=="n" goto delStartup :addStartup reg add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v "Kcptun Client" /t REG_SZ /d "\"%~dp0run.vbs\"" /F>NUL :delStartup reg delete "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v "kcptun Client" /F>NUL 2>NUL |
上面的配置过程中出现了多个端口,我在这里画个图,方便各位理解各端口的作用(点击看大图):
Shadowsocks 客户端配置
在客户端中新建服务器:
- 服务器 IP 填写本机:127.0.0.1
- 服务器端口填写:12948
正确填写你的 Shadowsocks 密码,加密方式,协议和混淆方式。
切换到该服务器上,测试是否正确运行。
我用的服务器是搬瓦工 512M 内存,费利蒙机房,以此测试加速效果。
- 按结论看,Kcptun 的加速效果略逊于 Finalspeed,估计需要细调配置。
- 刚运行 Finalspeed 时,内存占用就达到了 9.1% 也就是接近 47M;而此时 Kcptun 占用 0.4%,也就是 2M 左右。
- YouTube 1440p 满跑情况下,FInalspeed 最高内存占用 15.4%,接近 79M;而此时 Kcptun 占用 3% 左右,即 15.5M。
- 速度方面,Finalspeed 最大速度达到了 10000 Kbps +,Kcptun 6000+ Kbps。
以上结论为本人测试所得,仅作为参考;实际情况请自行测试,如有纰漏,欢迎指出。
多人同时使用
如果想多人使用同一个服务器并同时使用 Kcptun 加速,经博主测试,需要满足以下两个条件:
- 启动多个 Kcptun 服务端,并使用不同的端口,你可以将 start.sh 拷贝一份,然后修改其中的端口;
- 各个 Kcptun 加速不同的 Shadowsocks 服务端端口,也就是 Shadowsocks 也需要开多端口。
Android 上使用
请看这篇文章:Shadowsocks-Android 客户端上的 KCP 配置说明
在路由器上使用
如果需要在路由器上使用 Kcptun,首先你得有个智能路由器,然后能进入 shell。
编译好的客户端文件在这里下载:
https://github.com/bettermanbao/openwrt-kcptun/releases
小米路由器、极路由等一大批国产智能路由器都是 MT7620 的芯片,请下载 ramips 版本。
http://git.oschina.net/ragnaroks/KcptunGUI
Comments
Popular posts from this blog
IOS小火箭/Shadowsocks无需AppleID即可在线安装!
苹果手机/IOS/IPAD如何离线安装小火箭Shadowrocket.IPA文件?
利用Cloudflare等免费CDN翻墙的科学上网方法 — V2Ray Cloudflare
Recommend
-
196
Disclaimer: kcptun maintains a single website — github.com/xtaci/kcptun. Any websites other than github.com/xt...
-
58
-
103
基于 HTML5 的 3D 工控隧道案例
-
9
用隧道协议实现不同dubbo集群间的透明通信 前言 笔者最近完成了一个非常有意思的隧道机制(已在产线运行),可以让注册到不同zookeeper之间的dubbo集群之间能够正常进行通信。如下图所示:
-
7
现在,Docker 已经成为了一个非常主流的虚拟化技术,它集合了 Linux 中的许多虚拟化技术,如 Namespace、cgroup 和 AUFS 等等,所以我们可以使用 Docker 搭建一个开箱即用的虚拟化容器。但是,Docker 网路在很多时候依旧不能满足应用场景中的需求,这就需要我们...
-
11
cloudApp 基于 K8S 的云应用平台 cloud-app是基于k8s的简单易用的云应用平台,借助它可以快速安装部署各种应用,或者一键安装helm chart包,大幅提升k8s应用部署的效率。注意cloud-app的定位是应用的安装部署等操作,不是k8s的管理界面。...
-
6
网件R7800 SS + ChinaDNS + KcpTun实现YouTuBe 4K流畅体验 发表 2018-11-25 | 更新: 2019-09-04 | 分类 网络 | 阅读: | 字数: 2,552由于出口...
-
5
This site can’t be reached blog.zhengi.me’s server IP address could not be found. ...
-
7
V2EX › 分享创造 分享一个基于 TCP 的动态隧道代理服务
-
9
udp2raw+udpspeeder+kcptun+shadowsocks加速游戏配置 | VPS小白 VPS小白 >
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK