Kcptun 用来在服务器和客户端之间建立 kcp 隧道的工具,采用 go 语言开发,直接按照系统架构下载对应的预编译包即可使用。

文件传输需求

了解 kcptun 完全是因为之前要给 $$ 手扶梯做加速,然而,今天碰到的需求是要与大洋彼岸的一台服务器之间传输大文件(单文件几个GB的视频)。直接在 tcp 下使用 rsync、scp 通过 ssh 协议传输,速度在 30~50 kb/s 左右,而且连接非常不稳定。

使用 kcptun 隧道

从 kcptun 的原理图可以知道,kcptun 就是在传统的 tcp 协议中间建立一个 kcp 连接(使用 udp 协议),让服务器和客户端之间可以通过 kcp 通道实现通信/数据传输。

根据我的需要,除了在配置 kcp 监听的 4000 端口外,另外再设置需要使用的 目标端口 就可以了。

服务器端

$ ./server_linux_amd64 -t ":22" -l ":4000" -mode fast3

-t 参数(--target)即目标服务所使用的端口,这个端口号很重要。

客户端

$ ./client_darwin_amd64 -r "KCP_SERVER_IP:4000" -l ":22" -mode fast3

KCP_SERVER_IP 替换成服务器的真实 IP,-l 用来设置与服务端目标端口所对应的本地端口,即使用这个端口号去访问服务器上的 -t 端口。

传文件

两端都运行起来,终端能看到连接状态的输出。因为这里开放的是 22 号 ssh 端口,直接 ssh 登陆测试一下:

$ ssh ubuntu@127.0.0.1

如果客户端 -l 设置了其他端口,ssh 连接时可以用 -p 参数指定设置的端口。

如果连接没问题,现在就可以用 scp 或 rsync 来传文件了:

$ rsync -P ubuntu@127.0.0.1:~/qcloud/abc.mp4 .

没错,服务器与客户端之间通过 kcptun 建立 kcp 隧道后,客户端直接使用 127.0.0.1 或 localhost 地址搭配 -l 参数指定的端口号与服务端进行通信。

通过 kcptun 隧道,文件传输速度提升到了 500 kb/s 左右,足足十倍,虽然还是不够快,但我已经很满意了。