envsh / toxtun

Tunnel TCP/UDP connections over the Tox protocol .
10 stars 2 forks source link

Build Status

toxtun

基于tox安全P2P网络的TCP tunnel实现。

功能特性

依赖包

go get -u github.com/envsh/go-toxcore
go get -u github.com/cyfdecyf/color
go get -u github.com/bitly/go-simplejson
go get -u github.com/GianlucaGuarini/go-observable
go get -u github.com/go-ini/ini
go get -u github.com/tatsushid/go-fastping
go get -u golang.org/x/net/icmp

安装

go get -u github.com/envsh/toxtun

或者,

git clone https://github.com/envsh/toxtun
cd toxtun
go build -v

启动服务端

toxtun server

启动客户端

编辑toxtun.ini配置文件,把启动server端时的toxid写入配置文件,

[server]
name = whttpd

[client]
toxtun1 = *:81:127.0.0.1:8181:A5A02FECA08E3EAC7E646B89C0507A8AAF9136E05DC756FF09F86230951820670F908F2E7719
toxtun2 = *:82:127.0.0.1:8282:6BA28AC06C1D57783FE017FA9322D0B356E61404C92155A04F64F3B19C75633E8BDDEFFA4856

注:目前只能使用第一个tunnel配置项。

启动客户端:

toxtun -config toxtun.ini client

TODOs

创建连接流程

每个连接分布一个KCP。所以,KCP创建需要一个协商过程。

关闭连接流程

协商KCP的conv机制

数据传输速度

KCP+tox(lossy packet)默认配置:100K+/s

开启KCP NoDelay模式后:560K/s (调整kcp update interval)

测试情况说明,youtube视频连续播放测试1天,传输视频数据3G。

详细统计数据

线程模型

由于有回调的事件模式,会涉及多线程的数据结构操作,因此要考虑线程同步问题,否则出现一些程序崩溃问题。

第一种,全部使用同一线程,其他线程的数据库通过channel传递到该事件处理线程(主线程)进行处理。

要注意,已经在同一线程中的操作不需要再通过channel发送事件,

这样更直接,也更不容易导致多channel的死锁问题。

客户端goroutine个数,main+tox+kcp+client*n+check connect timeout

服务端goroutine个数,main+tox+kcp+client*n

第二种,使用锁,对产生多线程操作冲突的代码通过锁来同步。(已弃用)

数据传输选型

虽然可以直接用tox的lossless packet,但仍旧要加一层KCP,因为toxnet可能暂时性掉线(offline)。

在这种情况下,如果有活动连接和数据包,则要考虑自己处理重发。

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request