xtaci / kcptun

A Quantum-Safe Secure Tunnel based on QPP, KCP, FEC, and N:M multiplexing.
MIT License
13.85k stars 2.53k forks source link

可否再封装下kcp-go及smux,用于单程序多client或多server应用 #250

Closed devcodewak closed 7 years ago

devcodewak commented 7 years ago

可否再深度封装下kcp-go及smux

原因: 两包中有全局变量,例如 kcp.xmitBuf 及 kcp.DefaultSnmp, 是通过 init() new 一次生成的。

单程序并发多client或多server应用时,引用两包,全局变量和全局函数,会破坏对象的封装性, 实测单程序并发多client应用,勉强可用。 如单程序并发多server时,几乎不可用。

如方便,请深度封装下两包,便于第三方使用,谢谢

xtaci commented 7 years ago

你可以PR

xtaci commented 7 years ago

可以在此讨论修改方式

devcodewak commented 7 years ago

multi版在一些场景下有一定的意义: 0) 包支持multi是基本的需求吧:) 1) vps server多应用走kcptun时,单程序省内存便于管理。 2) multi client在小内存路由器部署时,也可实现连多server。例如kcp到ss,ssr,socks5,gsnova的server。可冗余对比. 3) multi client及server, 双方可一次性配置对应的不同调优参数,在网络变化时,可快速选配比对选优。省时省力。 4) 像lantern已大规模部署kcp服务端,其客户端并发obfs4-kcp multi时,推测处于bug不稳定状态。

我个人能力有限,仅代码堆砌。 劳烦x大大出手,我这里仅能泛泛而谈。

1)外部调用接口最好不变。 第三方import的已很多应用,ss/gost/lantern等。 2)包括kcptun本身,也可Release multi版和single版。 single版兼容原命令行及json格式。 multi版server及client可能仅支持外部json配置了,例 multi.json 内容: [ {json1...}, {jsno2...}, {json3...} ]

以上仅供x大参考。

xtaci commented 7 years ago

multi可以由第三方提供

devcodewak commented 7 years ago

请教问下multi时几个问题: 1 xmitBuf sync.Pool 是线程安全的对象缓冲池,程序中Get用于申请临时缓冲区,Put用于丢弃释放。是否正确?

1.1 沿用该全局变量,应无冲突。不修改即可?

2 xmitBuf 如修改可封装到 KCP FEC UDPSession 对象中,是否有必要?

3 DefaultSnmp 全是原子api访问,在multi时,不修改即可?

4 DefaultSnmp, multi时不便显示多个,可屏蔽相关代码,暂不使snmp输出功能。

5 估计在我在改multi时,server端代码改的有问题,才至server端不稳定?

6 修改multi时,有何建议和注意项?

谢谢

xtaci commented 7 years ago

当然是线程安全的, xmitBuf本来是sess.go/fec.go/kcp.go独立拥有的,为了统一协调内存分配,才提出为全局变量。 你是要还原这个操作。

DefaultSNMP可以和session绑定,但snmp传统意义上是 /proc/net/snmp 是全局的,系统的,整体的统计。

xtaci commented 7 years ago

Per Session 的统计,可以单独提供一个stats对象。但目前没有想到明确的需求场景。因为动态调参被否定了。

devcodewak commented 7 years ago

明白了,谢,try it.

devcodewak commented 7 years ago

multi测ok,仅简单修改了config.go main.go signal.go, 如你所述,暂未修改kcp-go smux。

单进程多服务端,源码如下: (修改后缀为.zip) kcptunMultiiServer.zip.txt

交叉编译后,在arukas ubuntu docker上测试通过。 ./multiserver -c mulit.json 一次测试了四种配置, 最优: fast + FEC(10,3) 或 fast2 + FEC(0,0)

版本为161102,可与对应版本的客户端配合使用。