Compare commits

...
45 Commits
Author SHA1 Message Date
xtaci bf2abf14e7 change default socket buffer to 4MB(macOS default limit) 2016-08-08 10:50:46 +08:00
xtaci 2df3e6c438 optimize API 2016-08-08 10:41:42 +08:00
xtaciandGitHub ba4c93c3f5 Update README.md 2016-08-07 21:00:52 +08:00
xtaciandGitHub bc22f46065 Merge pull request #97 from buaazp/master
optmize cli flags for accept callback
2016-08-07 19:45:01 +08:00
招牌疯子 3fc15de95d optmize cli flags for accept callback
And use custom kcp package name for godef.
2016-08-07 14:09:58 +08:00
xtaci 6f9449bb10 rename api 2016-08-06 11:21:20 +08:00
xtaci c6cbfd307e change ping -> keepalive for nat keep-alive 2016-08-06 10:19:13 +08:00
xtaci d68792cb1a add hidden parameters -- ping 2016-08-05 22:46:11 +08:00
xtaci 117edce137 upd kcp-go api 2016-08-05 17:06:57 +08:00
xtaciandGitHub 990a5f7f87 Update README.md 2016-08-02 14:24:42 +08:00
xtaciandGitHub 19d7d74d59 Add files via upload 2016-08-01 12:44:41 +08:00
xtaci 31afe325ad Merge branch 'master' of https://github.com/xtaci/kcptun 2016-07-29 10:17:33 +08:00
xtaci ab7519c2d6 remove one unnecessary line 2016-07-29 10:17:14 +08:00
xtaciandGitHub d6da2e1ead Update README.en.md 2016-07-27 13:51:13 +08:00
xtaciandGitHub 4d5a3dd791 Update README.md 2016-07-27 13:49:01 +08:00
xtaciandGitHub 4a46d696b6 Update README.md 2016-07-27 13:41:31 +08:00
xtaciandGitHub 33d50dcd45 Update README.en.md 2016-07-26 23:26:23 +08:00
xtaciandGitHub 2b3f6dbabe Update README.md 2016-07-26 23:25:15 +08:00
xtaciandGitHub 448717fa1c Update README.md 2016-07-26 21:40:17 +08:00
xtaciandGitHub 887fba3381 Update README.md 2016-07-26 21:33:52 +08:00
xtaciandGitHub fb62d45df8 Update README.en.md 2016-07-26 16:10:29 +08:00
xtaciandGitHub cd1e2b4ff7 Update README.md 2016-07-26 16:09:08 +08:00
xtaci 5ee659dd41 improve network latency by introducing stream mode 2016-07-25 20:14:12 +08:00
xtaciandGitHub 1a596f55f4 Update README.en.md 2016-07-24 16:18:28 +08:00
xtaciandGitHub 889a904dca Update README.md 2016-07-24 16:18:09 +08:00
xtaciandGitHub 172dcf6481 Update README.en.md 2016-07-24 16:16:34 +08:00
xtaciandGitHub ff92c70b40 Add files via upload 2016-07-24 16:15:22 +08:00
xtaciandGitHub af1d28ae5a Update README.md 2016-07-24 16:09:06 +08:00
xtaciandGitHub 4a7d143c69 Update README.en.md 2016-07-24 16:04:58 +08:00
xtaciandGitHub 7ff69f16d5 Update README.md 2016-07-24 16:03:48 +08:00
xtaciandGitHub 7eb037c4dd Update README.md 2016-07-24 16:00:53 +08:00
xtaciandGitHub a87f6af812 Add files via upload 2016-07-24 15:58:35 +08:00
xtaciandGitHub 7574f9bfd3 Update README.md 2016-07-24 09:23:47 +08:00
xtaci d5b5cf683b update Dockerfile 2016-07-23 11:30:37 +08:00
xtaci fded353b68 update Dockerfile 2016-07-23 11:23:18 +08:00
xtaci 832dbed064 Merge branch 'master' of https://github.com/xtaci/kcptun 2016-07-23 11:18:48 +08:00
xtaci 4b660fa02c update 2016-07-23 11:18:29 +08:00
xtaciandGitHub 59e6ebee05 Update README.md 2016-07-23 11:10:55 +08:00
xtaciandGitHub c1a895426d Update README.md 2016-07-23 10:49:21 +08:00
xtaci ebdcc9ae8a Merge branch 'master' of https://github.com/xtaci/kcptun 2016-07-22 21:41:24 +08:00
xtaci 2c076f7a34 update Dockerfile to alpine 2016-07-22 21:25:29 +08:00
Daniel FuandGitHub a1a0fbd060 Update README.md 2016-07-21 20:25:43 +08:00
Daniel FuandGitHub bc4214e4a8 Update README.md 2016-07-21 12:27:00 +08:00
Daniel FuandGitHub 61e6dfe87b Update README.md 2016-07-21 12:26:00 +08:00
Daniel FuandGitHub 4448a2658d Add files via upload 2016-07-20 14:53:01 +08:00
11 changed files with 145 additions and 90 deletions
+4 -1
View File
@@ -1,5 +1,8 @@
FROM golang:latest
FROM golang:alpine
MAINTAINER xtaci <daniel820313@gmail.com>
RUN apk update && \
apk upgrade && \
apk add git
RUN go get github.com/xtaci/kcptun/client
RUN go get github.com/xtaci/kcptun/server
EXPOSE 29900/udp
+12 -18
View File
@@ -1,5 +1,5 @@
# <img src="logo.png" alt="kcptun" height="60px" />
[![GoDoc][1]][2] [![Release][13]][14] [![Powered][17]][18] [![Build Status][3]][4] [![Go Report Card][5]][6] [![Downloads][15]][16]
[![GoDoc][1]][2] [![Release][13]][14] [![Powered][17]][18] [![Build Status][3]][4] [![Go Report Card][5]][6] [![Downloads][15]][16] [![Gitter][19]][20]
[1]: https://godoc.org/github.com/xtaci/kcptun?status.svg
[2]: https://godoc.org/github.com/xtaci/kcptun
[3]: https://travis-ci.org/xtaci/kcptun.svg?branch=master
@@ -14,12 +14,12 @@
[12]: https://github.com/xtaci/kcptun/network
[13]: https://img.shields.io/github/release/xtaci/kcptun.svg
[14]: https://github.com/xtaci/kcptun/releases/latest
[15]: https://img.shields.io/github/downloads/xtaci/kcptun/total.svg?maxAge=2592000
[15]: https://img.shields.io/github/downloads/xtaci/kcptun/total.svg?maxAge=1800
[16]: https://github.com/xtaci/kcptun/releases
[17]: https://img.shields.io/badge/KCP-Powered-blue.svg
[18]: https://github.com/skywind3000/kcp
[19]: https://img.shields.io/docker/pulls/xtaci/kcptun.svg?maxAge=2592000
[20]: https://hub.docker.com/r/xtaci/kcptun/
[19]: https://badges.gitter.im/xtaci/kcptun.svg
[20]: https://gitter.im/xtaci/kcptun?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge
A tool for converting tcp stream into kcp+udp stream, :zap: ***[download address](https://github.com/xtaci/kcptun/releases/latest)***:zap:
@@ -33,6 +33,12 @@ Server Side: ./server_linux_amd64 -t "127.0.0.1:1080" -l ":554" -mode fast2 //
Client Side: ./client_darwin_amd64 -r "SERVERIP:554" -l ":1080" -mode fast2 // listening on port 1080
```
### *Performance* :lollipop:
<img src="fast.png" alt="fast.com" height="256px" />
* Speed tested with: https://fast.com
* WAN Link Speed: 100M ADSL
* WIFI: 5GHz TL-WDR3320
### *Usage* :lollipop:
![client](client.png)
![server](server.png)
@@ -106,6 +112,8 @@ Setting parameters of RS-Code with ```-datashard 10 -parityshard 3```
disable compression by setting ```-nocomp``` on both side.
> Tips: Turning off compression may reduce latency.
### *SNMP* :lollipop:
```go
// Snmp defines network statistics indicator
@@ -135,20 +143,6 @@ type Snmp struct {
Sending a signal by ```kill -SIGUSR1 pid``` will give SNMP information for KCPuseful for fine-grained adjustment.
Of which ```RetransSegs,FastRetransSegs,LostSegs,OutSegs``` is the most useful.
### *Performance* :lollipop:
```
root@vultr:~# iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 4.00 MByte (default)
------------------------------------------------------------
[ 4] local 172.7.7.1 port 5001 connected with 172.7.7.2 port 55453
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-18.0 sec 5.50 MBytes 2.56 Mbits/sec <-- connection via kcptun
[ 5] local 45.32.xxx.xxx port 5001 connected with 218.88.xxx.xxx port 17220
[ 5] 0.0-17.9 sec 2.12 MBytes 997 Kbits/sec <-- direct connnection via tcp
```
### *Donations* :dollar:
![donate](donate.png)
+18 -21
View File
@@ -1,5 +1,5 @@
# <img src="logo.png" alt="kcptun" height="60px" />
[![GoDoc][1]][2] [![Release][13]][14] [![Powered][17]][18] [![Build Status][3]][4] [![Go Report Card][5]][6] [![Downloads][15]][16]
[![GoDoc][1]][2] [![Release][13]][14] [![Powered][17]][18] [![Build Status][3]][4] [![Go Report Card][5]][6] [![Downloads][15]][16] [![Gitter][19]][20]
[1]: https://godoc.org/github.com/xtaci/kcptun?status.svg
[2]: https://godoc.org/github.com/xtaci/kcptun
[3]: https://travis-ci.org/xtaci/kcptun.svg?branch=master
@@ -18,18 +18,26 @@
[16]: https://github.com/xtaci/kcptun/releases
[17]: https://img.shields.io/badge/KCP-Powered-blue.svg
[18]: https://github.com/skywind3000/kcp
[19]: https://img.shields.io/docker/pulls/xtaci/kcptun.svg?maxAge=2592000
[20]: https://hub.docker.com/r/xtaci/kcptun/
***TCP端口加速器 :zap: [官方下载地址](https://github.com/xtaci/kcptun/releases/latest):zap:***
[19]: https://badges.gitter.im/xtaci/kcptun.svg
[20]: https://gitter.im/xtaci/kcptun?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge
***[kcp-go](https://github.com/xtaci/kcp-go)协议测试小工具 :zap: [官方下载地址](https://github.com/xtaci/kcptun/releases/latest):zap:***
![kcptun](kcptun.png)
[English Readme](README.en.md)
### *快速设定* :lollipop:
```
服务器: ./server_linux_amd64 -t "127.0.0.1:1080" -l ":554" -mode fast2 // 转发到本地1080端口
客户端: ./client_darwin_amd64 -r "服务器IP地址:554" -l ":1080" -mode fast2 // 监听本地1080端口
服务器: ./server_linux_amd64 -t "127.0.0.1:8388" -l ":554" -mode fast2 // 转发到服务器的本地8388端口
客户端: ./client_darwin_amd64 -r "服务器IP地址:554" -l ":8388" -mode fast2 // 监听客户端的本地8388端口
注: 服务器端需要有服务监听8388端口
```
### *速度对比* :lollipop:
<img src="fast.png" alt="fast.com" height="256px" />
* 测速网站: https://fast.com
* 接入: 100M ADSL
* WIFI: 5GHz TL-WDR3320
### *使用方法* :lollipop:
在Mac OS X El Capitan下的帮助输出:
@@ -118,6 +126,7 @@ DSCP差分服务代码点(Differentiated Services Code Point),IETF于1998
> Reference: http://google.github.io/snappy/
通过参数 ```-nocomp``` 在两端同时设定以关闭压缩。
> 提示: 关闭压缩可能会降低延迟。
### *内置模式* :lollipop:
响应速度:
@@ -159,20 +168,6 @@ type Snmp struct {
使用```kill -SIGUSR1 pid``` 可以在控制台打印出SNMP信息,通常用于精细调整***当前链路的有效载荷比***。
观察```RetransSegs,FastRetransSegs,LostSegs,OutSegs```这几者的数值比例,用于参考调整```-mode manual,fec```的参数。
### *性能对比* :lollipop:
```
root@vultr:~# iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 4.00 MByte (default)
------------------------------------------------------------
[ 4] local 172.7.7.1 port 5001 connected with 172.7.7.2 port 55453
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-18.0 sec 5.50 MBytes 2.56 Mbits/sec <-- connection via kcptun
[ 5] local 45.32.xxx.xxx port 5001 connected with 218.88.xxx.xxx port 17220
[ 5] 0.0-17.9 sec 2.12 MBytes 997 Kbits/sec <-- direct connnection via tcp
```
### *故障排除* :lollipop:
> Q: 客户端和服务器端***皆无*** ```stream opened```信息。
> A: 连接客户端程序的端口设置错误。
@@ -191,7 +186,9 @@ TCP window size: 4.00 MByte (default)
### *捐赠* :dollar:
![donate](donate.png)
对该项目的捐款将用于[gonet/2](http://gonet2.github.io/)游戏服务器框架的研发。
对该项目的捐款将用于[gonet/2](http://gonet2.github.io/)游戏服务器框架的研发。
> 特别感谢: 郑H立, 南D风, Li, 七q, 凌J,昶,Les*ables 等,名字已做特殊处理。
### *参考资料* :paperclip:
1. https://github.com/skywind3000/kcp -- KCP - A Fast and Reliable ARQ Protocol.
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 65 KiB

+60 -30
View File
@@ -14,7 +14,7 @@ import (
"github.com/golang/snappy"
"github.com/hashicorp/yamux"
"github.com/urfave/cli"
"github.com/xtaci/kcp-go"
kcp "github.com/xtaci/kcp-go"
)
var (
@@ -182,6 +182,16 @@ func main() {
Value: 0,
Hidden: true,
},
cli.IntFlag{
Name: "sockbuf",
Value: 4194304, // socket buffer size in bytes
Hidden: true,
},
cli.IntFlag{
Name: "keepalive",
Value: 10, // nat keepalive interval in seconds
Hidden: true,
},
}
myApp.Action = func(c *cli.Context) error {
log.Println("version:", VERSION)
@@ -189,7 +199,6 @@ func main() {
checkError(err)
listener, err := net.ListenTCP("tcp", addr)
checkError(err)
pass := pbkdf2.Key([]byte(c.String("key")), []byte(SALT), 4096, 32, sha1.New)
// kcp server
nodelay, interval, resend, nc := c.Int("nodelay"), c.Int("interval"), c.Int("resend"), c.Int("nc")
@@ -205,37 +214,59 @@ func main() {
nodelay, interval, resend, nc = 1, 10, 2, 1
}
crypt := c.String("crypt")
pass := pbkdf2.Key([]byte(c.String("key")), []byte(SALT), 4096, 32, sha1.New)
var block kcp.BlockCrypt
switch c.String("crypt") {
case "tea":
block, _ = kcp.NewTEABlockCrypt(pass[:16])
case "xor":
block, _ = kcp.NewSimpleXORBlockCrypt(pass)
case "none":
block, _ = kcp.NewNoneBlockCrypt(pass)
default:
block, _ = kcp.NewAESBlockCrypt(pass)
}
remoteaddr := c.String("remoteaddr")
datashard, parityshard := c.Int("datashard"), c.Int("parityshard")
mtu, sndwnd, rcvwnd := c.Int("mtu"), c.Int("sndwnd"), c.Int("rcvwnd")
nocomp, acknodelay := c.Bool("nocomp"), c.Bool("acknodelay")
dscp, sockbuf, keepalive, conn := c.Int("dscp"), c.Int("sockbuf"), c.Int("keepalive"), c.Int("conn")
log.Println("listening on:", listener.Addr())
log.Println("encryption:", c.String("crypt"))
log.Println("encryption:", crypt)
log.Println("nodelay parameters:", nodelay, interval, resend, nc)
log.Println("remote address:", c.String("remoteaddr"))
log.Println("sndwnd:", c.Int("sndwnd"), "rcvwnd:", c.Int("rcvwnd"))
log.Println("compression:", !c.Bool("nocomp"))
log.Println("mtu:", c.Int("mtu"))
log.Println("datashard:", c.Int("datashard"), "parityshard:", c.Int("parityshard"))
log.Println("acknodelay:", c.Bool("acknodelay"))
log.Println("dscp:", c.Int("dscp"))
log.Println("conn:", c.Int("conn"))
log.Println("remote address:", remoteaddr)
log.Println("sndwnd:", sndwnd, "rcvwnd:", rcvwnd)
log.Println("compression:", !nocomp)
log.Println("mtu:", mtu)
log.Println("datashard:", datashard, "parityshard:", parityshard)
log.Println("acknodelay:", acknodelay)
log.Println("dscp:", dscp)
log.Println("sockbuf:", sockbuf)
log.Println("keepalive:", keepalive)
log.Println("conn:", conn)
createConn := func() *yamux.Session {
var block kcp.BlockCrypt
switch c.String("crypt") {
case "tea":
block, _ = kcp.NewTEABlockCrypt(pass[:16])
case "xor":
block, _ = kcp.NewSimpleXORBlockCrypt(pass)
case "none":
block, _ = kcp.NewNoneBlockCrypt(pass)
default:
block, _ = kcp.NewAESBlockCrypt(pass)
}
kcpconn, err := kcp.DialWithOptions(c.String("remoteaddr"), block, c.Int("datashard"), c.Int("parityshard"))
kcpconn, err := kcp.DialWithOptions(remoteaddr, block, datashard, parityshard)
checkError(err)
kcpconn.SetStreamMode(true)
kcpconn.SetNoDelay(nodelay, interval, resend, nc)
kcpconn.SetWindowSize(c.Int("sndwnd"), c.Int("rcvwnd"))
kcpconn.SetMtu(c.Int("mtu"))
kcpconn.SetACKNoDelay(c.Bool("acknodelay"))
kcpconn.SetDSCP(c.Int("dscp"))
kcpconn.SetWindowSize(sndwnd, rcvwnd)
kcpconn.SetMtu(mtu)
kcpconn.SetACKNoDelay(acknodelay)
kcpconn.SetKeepAlive(keepalive)
if err := kcpconn.SetDSCP(dscp); err != nil {
log.Println("SetDSCP:", err)
}
if err := kcpconn.SetReadBuffer(sockbuf); err != nil {
log.Println("SetReadBuffer:", err)
}
if err := kcpconn.SetWriteBuffer(sockbuf); err != nil {
log.Println("SetWriteBuffer:", err)
}
// stream multiplex
config := &yamux.Config{
@@ -247,7 +278,7 @@ func main() {
LogOutput: os.Stderr,
}
var session *yamux.Session
if c.Bool("nocomp") {
if nocomp {
session, err = yamux.Client(kcpconn, config)
} else {
session, err = yamux.Client(newCompStream(kcpconn), config)
@@ -256,7 +287,7 @@ func main() {
return session
}
numconn := uint16(c.Int("conn"))
numconn := uint16(conn)
var muxes []*yamux.Session
for i := uint16(0); i < numconn; i++ {
muxes = append(muxes, createConn())
@@ -278,7 +309,6 @@ func main() {
go handleClient(p1, p2)
rr++
}
return nil
}
myApp.Run(os.Args)
}
+1 -1
View File
@@ -8,7 +8,7 @@ import (
"os/signal"
"syscall"
"github.com/xtaci/kcp-go"
kcp "github.com/xtaci/kcp-go"
)
func init() {
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 62 KiB

+49 -18
View File
@@ -14,7 +14,7 @@ import (
"github.com/golang/snappy"
"github.com/hashicorp/yamux"
"github.com/urfave/cli"
"github.com/xtaci/kcp-go"
kcp "github.com/xtaci/kcp-go"
)
var (
@@ -205,6 +205,16 @@ func main() {
Value: 0,
Hidden: true,
},
cli.IntFlag{
Name: "sockbuf",
Value: 4194304, // socket buffer size in bytes
Hidden: true,
},
cli.IntFlag{
Name: "keepalive",
Value: 10, // nat keepalive interval in seconds
Hidden: true,
},
}
myApp.Action = func(c *cli.Context) error {
log.Println("version:", VERSION)
@@ -220,9 +230,10 @@ func main() {
nodelay, interval, resend, nc = 1, 10, 2, 1
}
crypt := c.String("crypt")
pass := pbkdf2.Key([]byte(c.String("key")), []byte(SALT), 4096, 32, sha1.New)
var block kcp.BlockCrypt
switch c.String("crypt") {
switch crypt {
case "tea":
block, _ = kcp.NewTEABlockCrypt(pass[:16])
case "xor":
@@ -233,38 +244,58 @@ func main() {
block, _ = kcp.NewAESBlockCrypt(pass)
}
lis, err := kcp.ListenWithOptions(c.String("listen"), block, c.Int("datashard"), c.Int("parityshard"))
datashard, parityshard := c.Int("datashard"), c.Int("parityshard")
lis, err := kcp.ListenWithOptions(c.String("listen"), block, datashard, parityshard)
if err != nil {
log.Fatal(err)
}
mtu, sndwnd, rcvwnd := c.Int("mtu"), c.Int("sndwnd"), c.Int("rcvwnd")
nocomp, acknodelay := c.Bool("nocomp"), c.Bool("acknodelay")
dscp, sockbuf, keepalive := c.Int("dscp"), c.Int("sockbuf"), c.Int("keepalive")
target := c.String("target")
log.Println("listening on ", lis.Addr())
log.Println("encryption:", c.String("crypt"))
log.Println("encryption:", crypt)
log.Println("nodelay parameters:", nodelay, interval, resend, nc)
log.Println("sndwnd:", c.Int("sndwnd"), "rcvwnd:", c.Int("rcvwnd"))
log.Println("compression:", !c.Bool("nocomp"))
log.Println("mtu:", c.Int("mtu"))
log.Println("datashard:", c.Int("datashard"), "parityshard:", c.Int("parityshard"))
log.Println("acknodelay:", c.Bool("acknodelay"))
log.Println("dscp:", c.Int("dscp"))
log.Println("sndwnd:", sndwnd, "rcvwnd:", rcvwnd)
log.Println("compression:", !nocomp)
log.Println("mtu:", mtu)
log.Println("datashard:", datashard, "parityshard:", parityshard)
log.Println("acknodelay:", acknodelay)
log.Println("dscp:", dscp)
log.Println("sockbuf:", sockbuf)
log.Println("keepalive:", keepalive)
if err := lis.SetDSCP(dscp); err != nil {
log.Println("SetDSCP:", err)
}
if err := lis.SetReadBuffer(sockbuf); err != nil {
log.Println("SetReadBuffer:", err)
}
if err := lis.SetWriteBuffer(sockbuf); err != nil {
log.Println("SetWriteBuffer:", err)
}
for {
if conn, err := lis.Accept(); err == nil {
log.Println("remote address:", conn.RemoteAddr())
conn.SetStreamMode(true)
conn.SetNoDelay(nodelay, interval, resend, nc)
conn.SetMtu(c.Int("mtu"))
conn.SetWindowSize(c.Int("sndwnd"), c.Int("rcvwnd"))
conn.SetACKNoDelay(c.Bool("acknodelay"))
conn.SetDSCP(c.Int("dscp"))
conn.SetMtu(mtu)
conn.SetWindowSize(sndwnd, rcvwnd)
conn.SetACKNoDelay(acknodelay)
conn.SetKeepAlive(keepalive)
if c.Bool("nocomp") {
go handleMux(conn, c.String("target"))
if nocomp {
go handleMux(conn, target)
} else {
go handleMux(newCompStream(conn), c.String("target"))
go handleMux(newCompStream(conn), target)
}
} else {
log.Println(err)
}
}
return nil
}
myApp.Run(os.Args)
}
+1 -1
View File
@@ -8,7 +8,7 @@ import (
"os/signal"
"syscall"
"github.com/xtaci/kcp-go"
kcp "github.com/xtaci/kcp-go"
)
func init() {