kcptun基于KCP协议的UDP隧道 - 将TCP流转换为KCP+UDP流播放IPTV

适用于低延迟高速率要求的应用,据说传输效率可以加倍X2+

有什么用

通过UDP隧道,加速端到端的远程传输(点对点p2p传输,封装为UDP的KCP数据)

Kcptun 是一个简单和快速的,基于 KCP 协议的 UDP 隧道,它可以将 TCP 流转换为 KCP+UDP 流。

怎么用

部署和配置简单

讲一种例子:

  1. 远程/远距离客户端的某一个应用,需要访问服务的网段内的某个特定TCP服务(比如游戏或IPTV)。
  2. 通过启动远程客户端的路由器#1上的kcptun client(监听本地端口,然后指定服务器IP和端口,加密信息),这个kcptun客户端监听的端口就是本地应用要连接使用的端口。
  3. 去连接服务器(从路由器#2的端口转发)的特定kcp server(监听服务器端口,然后指定发往本地特定服务[TCP服务的IP地址和端口])
  4. 这样加密并封装过的整条链路就建立在UDP上了,据说传输效率可以加倍X2+

以下是两个使用docker应用kcptun的实例

实际用例1:

https://hub.docker.com/r/lowid/kcptun

如果按要封装的服务是服务器上的socks代理:

server side (kcp+socks) compose file

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
kcp-server:
image: lowid/kcptun:v20170329
command:
--listen :29900
--target dante-server:1080
--mode fast2
ports:
- "30003:29900/udp"
environment:
- KCPTUN_KEY=your_password
links:
- dante-server
restart: always

dante-server:
image: vimagick/dante
expose:
- "1080"
volumes:
- ./sockd.conf:/etc/sockd.conf
restart: always

server side sockd.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
debug: 0
logoutput: stderr
internal: 0.0.0.0 port = 1080
external: eth0
socksmethod: username none
clientmethod: none
user.privileged: root
user.unprivileged: nobody

client pass {
from: 0.0.0.0/0 port 1-65535 to: 0.0.0.0/0
log: error
}

socks pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
#socksmethod: username
log: error
}

client side compose file

1
2
3
4
5
6
7
8
9
10
11
12
client:
image: lowid/kcptun:v20170329
entrypoint: client_linux_amd64
command:
--localaddr :12948
--remoteaddr server_ip_address:30003
--mode fast2
ports:
- "12948:12948/tcp"
environment:
- KCPTUN_KEY=your_password
restart: always

实际用例2:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ docker pull chenhw2/kcptun

$ docker run -d \
-e "ARGS=server -t 10.0.0.1:80" \
-p 29900:29900/udp \
chenhw2/kcptun


#客户端
$ docker run -d \
-e "ARGS=client -r [kcp_server]:29900" \
-p 12948:12948/tcp \
chenhw2/kcptun

相关内容

实现方法

放弃docker的方式。

KCP Server:

1
./server_linux_amd64 -t "192.168.6.243:8012" -l ":29900" -mode fast3 -nocomp -dscp 46 --key op.carlzeng.top --crypt salsa20

说明:这个29900端口的服务,由于是配置在特定的服务器上(不是在公网IP的主路由器上),所以需要在公网IP的主路由上做一个端口映射(实现:把外网的29900 udp数据入世地转发到这台特定的服务器相同端口上)

1
2
3
4
5
6
#配置在K2P的Padavan界面的

KCP Client: ./client_darwin_amd64 -r "KCP_SERVER_IP:29900" -l ":8012" -mode fast3 -nocomp -autoexpire 900 -sockbuf 16777217 -dscp 46

/opt/bin/kcptun -r "@@@.@@@.@@@.@@@:29900" -l ":88012" -key op.carlzeng.top -crypt salsa20 -mode fast3 -dscp 46 -autoexpire 900 -nocomp

一张图看透整个流程

kcptun整个流程实例

使用了特殊的测试方式,用frp穿透到另外一处播放;

实测体验:高清很顺畅,4K还是有卡顿的;

TODO:等待下一步在客户端的局域网播放测试

这样KCP传输以后,按报告上说是传输延迟减半,速率加倍*2+;有待于进一步实践考验

20240121 放弃这个方案

kcptun部署案例:
https://c.carlzeng.top:3/iptvKcptun-123-1-8388-V20240121.m3u

旧的DIYP配置:
https://c.carlzeng.top:3/tv

Perfect Player
https://c.carlzeng.top:3/kcpzl
    配置yourls对应了https://c.carlzeng.top:3/iptvKcptun-123-1-8388-V20240121.m3u

2:16pm 感觉zl移动客户端的配置文件没问题,比如 
http://192.168.123.1:8388/rtp/239.3.1.129:8008
想要检查服务端NAS中的server_linux_amd64执行情况,重启
2:28pm 启动NAS中的KCPTUN server,4K依旧卡。
2:33pm 4K播放,卡!kcptun方案  —— 淘汰

对比Perfect Player的 原始配置:
    https://c.carlzeng.top:3/tvm3u
2:39pm 体验这个直接的互联网上http udpxy:速度和kcptun差不多。
4K测试台,反而不怎么卡;直观体验甚至可以说比kcptun以后的播放4K更流畅。

结论:保留原先这个Perfect Player的配置(直接互联网上访问udprxy)https://c.carlzeng.top:3/tvm3u

2:48pm
修改DIYP的配置为:
https://c.carlzeng.top:3/tvm
这个m移动的配置里面,有对所有北京频道的优化,添加首个为hby的udpxy地址。

方案三:直接本地组播(移动宽带)播放

思考

如果单单是用于播放IPTV,加速远程m3u8的播放内容的话;这个方案还要往前在走一步,

  • 在手机端也下载kcptun-linux-arm64-20231012.tar.gz 在手机端运行./client_linux_arm64 配合上参数(见上方已实例测试过)就可以加速播放远程的IPTV或直播
  • 在android盒子端下载kcptun-linux-arm64-20231012.tar.gz,并运行./client_linux_arm64 配合上参数(见上方已实例测试过)就可以加速播放远程的IPTV或直播或游戏…

灵感来源

教程、项目地址: https://github.com/xtaci/kcptun/

【MC开服教程-3】用KCPTUN给你的服务器加个速