logo.png

kcptun为何物?

Kcptun 是一个非常简单和快速的,基于 KCP 协议的 UDP 隧道,它可以将 TCP 流转换为 KCP+UDP 流。而 KCP 是一个快速可靠协议,能以比 TCP 浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。

Kcptun 是 KCP 协议的一个简单应用,可以用于任意 TCP 网络程序的传输承载,以提高网络流畅度,降低掉线情况。由于 Kcptun 使用 Go 语言编写,内存占用低(经测试,在64M内存服务器上稳定运行),而且适用于所有平台,甚至 Arm 平台。

Kcptun相关项目地址:

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

https://github.com/shadowsocks/kcptun/releases

https://github.com/dfdragon/kcptun_gclient/releases



KCP协议简介

        KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者自己定义下层数据包的发送方式,以 callback的方式提供给 KCP。 连时钟都需要外部传递进来,内部不会有任何一次系统调用。

        整个协议只有 ikcp.h, ikcp.c两个源文件,可以方便的集成到用户自己的协议栈中。也许你实现了一个P2P,或者某个基于 UDP的协议,而缺乏一套完善的ARQ可靠协议实现,那么简单的拷贝这两个文件到现有项目中,稍微编写两行代码,即可使用。

技术特性

        TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的是充分利用带宽。而 KCP是为流速设计的(单个数据包从一端发送到一端需要多少时间),以10%-20%带宽浪费的代价换取了比 TCP快30%-40%的传输速度。TCP信道是一条流速很慢,但每秒流量很大的大运河,而KCP是水流湍急的小激流。KCP有正常模式和快速模式两种,通过以下策略达到提高流速的结果:

相关项目地址:

https://github.com/skywind3000/kcp

https://link.jianshu.com/?t=https://github.com/dfdragon/kcptun_gclient/releases




废话不多少,下面开始配置实战环境如下:


SS-服务器: CentOS Linux release 7.5.1804 (Core) x64

连接客户端:windows 10 pro x64




加速原理图


一、下载Kcptun服务端

#下载地址:https://github.com/xtaci/kcptun/releases
#注意:我这里下载的是kcptun-linux-amd64-20181114.tar.gz,根据你当前的系统环境选择!
#进入SS服务器
#注意:当前我是在CentOS操作系统下。

mkdir /root/kcptun
cd /root/kcptun
wget https://github.com/xtaci/kcptun/releases/download/v20181114/kcptun-linux-amd64-20181114.tar.gz
tar -zxvf kcptun-linux-amd64-20181114.tar.gz

SS服务器只需要运行server_linux_amd64



1.创建启动脚本

vim /root/kcptun/kcptun.sh

2.粘贴以下内容

#!/bin/bash
cd /root/kcptun/
./server_linux_amd64 -l :6666 -t xx.xx.xx.xx:8080 -key test -mtu 1400 -sndwnd 2048 -rcvwnd 2048 -mode fast2 > kcptun.log 2>&1 &
echo "开始运行Kcptun"

3.解释下:

-l :6666              //监听本地端口,待会我们从windows 10 x64 客户端需要连接此端口。
xx.xx.xx.xx:8080         //当前SS服务器部署好的SS连接IP与端口
key test               //为Kcptun你的验证密钥,这里为test,可以自己写,其他参数先不做介绍,可自行--help

4.关闭服务

killall server_linux_amd64

5.启动Kcptun

sh /root/kcptun/kcptun.sh

6.查看端口是否起来

[root@host2 kcptun]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      678/sshd            
tcp6       0      0 :::8080                 :::*                    LISTEN      3874/python         
tcp6       0      0 :::22                   :::*                    LISTEN      678/sshd            
udp        0      0 127.0.0.1:323           0.0.0.0:*                           456/chronyd         
udp        0      0 0.0.0.0:68              0.0.0.0:*                           1224/dhclient       
udp        0      0 0.0.0.0:40307           0.0.0.0:*                           3874/python         
udp6       0      0 :::6666                 :::*                                21830/./server_linu 
udp6       0      0 ::1:323                 :::*                                456/chronyd         
udp6       0      0 :::8080                 :::*                                3874/python     

#发现UDP 6666端口已经启动监听
#服务已经启动,至此服务端配置完毕
#######接下来,我们到windows 10 客户端#####

二、客户端Kcptun配置

#下载地址:https://github.com/xtaci/kcptun/releases/download/v20181114/kcptun-windows-amd64-20181114.tar.gz
#注意:当前我是在windows10 64位操作系统下。
#下载后解压到一个指定的文件夹内,。在此文件夹内创建文本文件,改名为run.bat,内容如下:
client_windows_amd64.exe -l :8080 -r xxx.xx.xx.xx:6666 -key test -mtu 1400 -sndwnd 256 -rcvwnd 2048 -mode fast2 -dscp 46 >kcptun.log


1.解释下

-l :8080                 //监听本地端口,待会我们从shadowsocks 客户端需要连接此端口。
xxx.xx.xx.xx:6666        //为刚刚在SS服务器IP,及监听的UDP6666端口。
key test                 //为Kcptun你的验证密钥,这里为test 服务端配置好的,其他参数先不做介绍,可自行--help

2.启动

双击打开run.bat 即可


接下来我们在设置下shadowsocks:

服务器IP为127.0.0.1

服务器端口为8080

密码为你的ss密码(和原来你用ss时候的密码一样)




三、加速前后效果对比


1.加速前


2.加速后


可以看到效果非常明显!速度快到起飞。





四、知识扩展

1.开机自动启动,后台运行等

#SS服务器开即自动启动Kcptun服务

echo "sh /root/kcptun/kcptun.sh" >> /etc/rc.local
#windown 10 
#windown 10
#windown 10 后台运行脚本,放到Kcptun目录下,保存为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 :8080 -r xxx.xxx.xxx.xx:6666 -key test -mtu 1400 -sndwnd 256 -rcvwnd 2048 -mode fast2 -dscp 46"
'日志文件
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

2.安卓手机端Kcptun插件

https://github.com/shadowsocks/kcptun-android/releases

#下载apk安装后,打开ss,启动插件(相当Kcptun客户端),
#连接地址为SS服务器IP的Kcptun端口:6666
#下面参数与win10客户端想对应即可。
key=test;mtu=1400;sndwnd=256;rcvwnd=2048;mode=fast2;dscp=46

kcptun.tar.gz