Compare commits

..
157 Commits
Author SHA1 Message Date
xtaci 0afdefb26b print nocomp 2016-06-27 10:31:45 +08:00
xtaci d15bede44c Merge branch 'master' of https://github.com/xtaci/kcptun 2016-06-27 10:28:49 +08:00
xtaci d97ba4c499 add snappy compression to connection 2016-06-27 10:28:24 +08:00
Daniel FuandGitHub 8ee35e13e3 Update README.md 2016-06-26 13:48:42 +08:00
Daniel FuandGitHub b60f359079 Update README.md 2016-06-26 13:43:28 +08:00
xtaci 230d1f4924 update png 2016-06-25 14:00:46 +08:00
xtaci 2178e1ec5c update 2016-06-25 12:55:07 +08:00
Daniel FuandGitHub cc5ba0ed97 Update README.md 2016-06-25 10:14:36 +08:00
Daniel FuandGitHub 74ddf68026 Add files via upload 2016-06-24 13:01:22 +08:00
Daniel FuandGitHub e4eea23681 Update README.md 2016-06-24 12:59:01 +08:00
Daniel FuandGitHub a12b0ec4f5 Add files via upload 2016-06-24 12:57:19 +08:00
Daniel FuandGitHub fb9fcf27b4 Add files via upload 2016-06-24 12:48:22 +08:00
Daniel FuandGitHub 96e91bdfa1 Update README.md 2016-06-24 12:43:37 +08:00
Daniel FuandGitHub 0d42b4d33a Update README.md 2016-06-23 17:13:48 +08:00
Daniel FuandGitHub 2d70c7f2a7 Update README.md 2016-06-22 18:14:01 +08:00
Daniel FuandGitHub aaa3ac9aaa Update README.md 2016-06-22 18:13:01 +08:00
xtaci 160bfd068d golint 2016-06-22 17:41:40 +08:00
xtaci afec250d4c fix print 2016-06-22 17:08:13 +08:00
xtaci 65c6c049fa Forward Error Correction methods Upgraded to Reed-Solomon Code 2016-06-22 16:54:08 +08:00
xtaci 694ebe22d5 update travis.yml 2016-06-21 19:58:16 +08:00
xtaci 90b24143ba update travis.yml 2016-06-21 19:55:37 +08:00
xtaci f9f408d641 update 2016-06-21 19:52:08 +08:00
xtaci 02598db6a0 update 2016-06-21 19:50:13 +08:00
xtaci 96d816c6c4 update 2016-06-21 19:25:24 +08:00
xtaci 05ea181b9f update travis.yml 2016-06-21 19:23:30 +08:00
Daniel FuandGitHub f3b6d66ba9 Update README.md 2016-06-21 17:20:37 +08:00
Daniel FuandGitHub 42c89c85d4 Add files via upload 2016-06-21 17:19:45 +08:00
Daniel FuandGitHub 5922f3a101 Add files via upload 2016-06-21 16:22:54 +08:00
Daniel FuandGitHub 4409fc3ce4 Update README.md 2016-06-21 16:18:47 +08:00
Daniel FuandGitHub e1e0bf98c3 Update README.md 2016-06-21 16:08:09 +08:00
Daniel FuandGitHub faa093858e Add files via upload 2016-06-21 16:04:10 +08:00
xtaci b398657ffe Merge branch 'master' of https://github.com/xtaci/kcptun 2016-06-21 14:40:32 +08:00
xtaci 7dc5376427 add coveralls 2016-06-21 14:40:07 +08:00
Daniel FuandGitHub 576088c625 Update README.md 2016-06-21 14:28:50 +08:00
Daniel FuandGitHub 2655e30025 Update README.md 2016-06-21 13:26:09 +08:00
xtaci 30e82f95ee add .travis.yml 2016-06-21 13:24:57 +08:00
Daniel FuandGitHub 702c6a10cc Update README.md 2016-06-20 12:48:09 +08:00
Daniel FuandGitHub eb5d2ebd83 Update README.md 2016-06-20 12:39:17 +08:00
Daniel FuandGitHub b173fc328d Update README.md 2016-06-20 12:35:08 +08:00
xtaci b4f8dc05aa fix a race condition on mulitple connections 2016-06-16 16:24:44 +08:00
xtaci 0abdcf1672 adjust type 2016-06-15 12:42:05 +08:00
xtaci 61252eeeae fix overflow 2016-06-15 12:40:21 +08:00
xtaci 2065a3eb42 fix 2016-06-15 10:02:12 +08:00
xtaci 9f6bbce901 change default value 2016-06-14 23:00:53 +08:00
xtaci be37419c81 add support for establishing multiplex physical connections 2016-06-14 22:47:26 +08:00
xtaci b6c057acf6 add none encryption 2016-06-13 17:43:56 +08:00
xtaci b3c1b29362 add simple xor 2016-06-13 11:36:09 +08:00
xtaci b83fc9f2cb support BlockCrypt interface 2016-06-13 10:43:17 +08:00
xtaci e21c3ef047 fix 2016-06-13 10:41:01 +08:00
xtaci 64e17a1e1a support BlockCrypt interface 2016-06-13 10:25:26 +08:00
Daniel FuandGitHub 2606affaa1 Update README.md 2016-06-12 22:45:49 +08:00
Daniel FuandGitHub c71c1dabaa Update README.md 2016-06-12 22:33:13 +08:00
Daniel FuandGitHub 013557c785 Update README.md 2016-06-12 22:08:45 +08:00
Daniel FuandGitHub 91d31f0700 Update README.md 2016-06-11 23:09:17 +08:00
xtaci 2f0657c417 Merge branch 'master' of https://github.com/xtaci/kcptun 2016-06-10 21:43:09 +08:00
xtaci 1b24c8b887 optional cipher method 2016-06-10 21:41:55 +08:00
Daniel Fu b398980f6b Update README.md 2016-06-08 15:31:51 +08:00
Daniel Fu fb4f969580 Update README.md 2016-06-08 10:12:30 +08:00
Daniel Fu 779ebaace9 Add files via upload 2016-06-07 13:34:48 +08:00
Daniel Fu 2f326580f0 Add files via upload 2016-06-07 13:31:08 +08:00
Daniel Fu 3477196a67 Update README.md 2016-06-06 20:18:45 +08:00
Daniel Fu e1aa9eecc6 Update README.md 2016-06-06 20:15:24 +08:00
Daniel Fu e0a2a413c9 Update README.md 2016-06-06 20:14:05 +08:00
xtaci 4c3c41f8d4 set default dscp value to 0 2016-06-04 18:05:33 +08:00
Daniel Fu 873ae40da8 Update README.md 2016-06-04 11:10:31 +08:00
Daniel Fu 2609d75729 Update README.md 2016-06-04 11:08:10 +08:00
Daniel Fu 2ca0d39306 Update README.md 2016-06-04 11:07:22 +08:00
Daniel Fu 3f53280c84 Update README.md 2016-06-04 10:46:40 +08:00
Daniel Fu 9a5a3a2d8c Update README.md 2016-06-04 10:11:58 +08:00
Daniel Fu 2e989b4869 Update README.md 2016-06-04 10:02:48 +08:00
Daniel Fu 2aececab60 Update README.md 2016-06-04 09:56:32 +08:00
Daniel Fu c12f4fef0b Update README.md 2016-06-04 09:53:13 +08:00
Daniel Fu 096b889e57 Update README.md 2016-06-04 08:54:10 +08:00
Daniel Fu ad11f03a5c Add files via upload 2016-06-03 16:23:33 +08:00
xtaci 026c862226 update 2016-06-03 14:16:06 +08:00
Daniel Fu e56788c401 Add files via upload 2016-06-03 14:14:44 +08:00
Daniel Fu b64545e874 Add files via upload 2016-06-03 14:14:10 +08:00
Daniel Fu 3052d2a617 Add files via upload 2016-06-03 14:12:48 +08:00
xtaci 3243a14113 add hidden manual control of SetNoDelay parameters 2016-06-03 09:44:02 +08:00
xtaci c40cf88112 Merge branch 'master' of https://github.com/xtaci/kcptun 2016-06-02 21:59:27 +08:00
xtaci 2e7a709727 update upper limit of yamux window for 4k video 2016-06-02 21:58:49 +08:00
Daniel Fu 1278597aa2 Update README.md 2016-06-02 17:26:11 +08:00
Daniel Fu 12b7f2c41b Update README.md 2016-06-02 15:45:34 +08:00
xtaci d3d1148c05 use DialTimeout 2016-06-02 10:32:01 +08:00
Daniel Fu 02d48968e1 Add files via upload 2016-06-01 22:30:41 +08:00
xtaci 16b4eec5aa rollback 2016-06-01 15:01:04 +08:00
xtaci 2df5992b4f adjust param 2016-06-01 14:13:33 +08:00
xtaci 41358f41cc cond +build signal 2016-06-01 11:12:48 +08:00
xtaci 400993f22e send -SIGUSR1 to dump KCP snmp 2016-06-01 10:52:12 +08:00
xtaci 4d935d26a2 update default param 2016-05-31 21:39:31 +08:00
xtaci 99c4cb92b9 expose SetNoDelay 2016-05-31 21:37:17 +08:00
xtaci 444533d7ff add freebsd compile 2016-05-31 13:22:06 +08:00
xtaci dc2fb504be api rename 2016-05-31 10:27:20 +08:00
Daniel Fu 33fc58594c Add files via upload 2016-05-30 14:11:57 +08:00
Daniel Fu 79e61bbd64 Add files via upload 2016-05-30 14:10:57 +08:00
Daniel Fu d98981fe2e Add files via upload 2016-05-30 14:07:59 +08:00
Daniel Fu 703467772e Delete kcptun.jpg 2016-05-30 13:49:21 +08:00
Daniel Fu 9e93e6513b Update README.md 2016-05-30 13:49:00 +08:00
Daniel Fu 1f50278b92 Add files via upload 2016-05-30 13:48:19 +08:00
Daniel Fu b4c32d780d Update README.md 2016-05-29 17:22:08 +08:00
Daniel Fu 64fe3280cd Update README.md 2016-05-29 17:14:52 +08:00
Daniel Fu 0b5ac4a446 Update README.md 2016-05-29 17:14:04 +08:00
Daniel Fu 1ebb4b6b01 Update README.md 2016-05-29 17:11:06 +08:00
Daniel Fu 661b1d75dd Add files via upload 2016-05-29 17:10:07 +08:00
Daniel Fu fb8a855bd9 Delete kitty.jpg 2016-05-29 17:00:39 +08:00
Daniel Fu 9062d4c96f Update README.md 2016-05-29 16:59:23 +08:00
Daniel Fu a831e341e3 Update README.md 2016-05-29 16:58:07 +08:00
Daniel Fu d7b268557a Add files via upload 2016-05-29 16:57:23 +08:00
xtaci 0629ab556e update import path 2016-05-27 14:15:53 +08:00
xtaci 4d3aa0b43a update build script 2016-05-26 15:51:43 +08:00
xtaci 715b1e8ddb update build-release.sh 2016-05-26 15:37:01 +08:00
Daniel Fu 63582adb78 Add files via upload 2016-05-26 13:35:37 +08:00
Daniel Fu 3b63a66b5c Update README.md 2016-05-26 13:34:03 +08:00
Daniel Fu ddd1300622 Add files via upload 2016-05-26 13:32:19 +08:00
xtaci 0eab8c2c04 既定値改正-DSCP 2016-05-26 13:15:07 +08:00
xtaci 3677cbc254 Merge branch 'master' of https://github.com/xtaci/kcptun 2016-05-26 13:13:04 +08:00
xtaci e048af8217 既定値改正 2016-05-26 13:12:47 +08:00
Daniel Fu b09c06d702 Update README.md 2016-05-26 11:29:41 +08:00
Daniel Fu 0be724cb99 Update README.md 2016-05-26 11:24:09 +08:00
xtaci ed7a0273c8 optional -dscp 2016-05-25 11:17:43 +08:00
xtaci b24b5db01c expose acknodelay option 2016-05-24 21:03:48 +08:00
xtaci 81d959cf85 update 2016-05-23 15:05:08 +08:00
xtaci b4749f5f77 update 2016-05-23 14:53:15 +08:00
xtaci b3be11c6fd update para 2016-05-23 14:19:49 +08:00
xtaci 37861c401e disable yamux ping 2016-05-23 12:25:07 +08:00
xtaci 3a335ac6db lower ping interval for NAT 2016-05-23 11:33:05 +08:00
xtaci 1c1f229cf8 reduce window 2016-05-21 23:31:45 +08:00
xtaci 43cf6d79f0 adjust ping to keep udp nat 2016-05-21 21:39:06 +08:00
xtaci 034d0f1b45 Merge branch 'master' of https://github.com/xtaci/kcptun 2016-05-21 14:54:43 +08:00
xtaci e8779394a6 update keepalive interval 2016-05-21 14:54:17 +08:00
Daniel Fu 1bd2a2ed23 Update README.md 2016-05-21 10:30:47 +08:00
xtaci 674a89f14f fully remove tuncrypt option, implement your own TLS instead 2016-05-21 10:15:54 +08:00
xtaci 89569c2f77 print fec 2016-05-20 22:40:02 +08:00
xtaci 7a89fcf55b update 2016-05-20 20:44:05 +08:00
xtaci dc1c71fbe3 Merge branch 'master' of https://github.com/xtaci/kcptun 2016-05-20 18:25:14 +08:00
xtaci 311e8c12e6 add fec support 2016-05-20 18:24:50 +08:00
Daniel Fu 76ab196896 Update README.md 2016-05-19 13:03:47 +08:00
Daniel Fu 24301b3439 Update README.md 2016-05-19 13:02:45 +08:00
Daniel Fu fac523783a Update README.md 2016-05-19 12:37:13 +08:00
Daniel Fu 6c5f0e69f5 Update README.md 2016-05-19 12:33:02 +08:00
Daniel Fu 7c0c8585a7 Add files via upload 2016-05-19 11:25:39 +08:00
xtaci 10b9086cc5 update init param 2016-05-18 12:21:40 +08:00
xtaci a79537f9c6 adjust rcvwnd to relatively *SAFE* download bandwidth 2016-05-17 16:49:26 +08:00
Daniel Fu caeba21983 Update README.md 2016-05-17 14:18:17 +08:00
Daniel Fu dc55b833e1 Update README.md 2016-05-17 10:47:16 +08:00
xtaci 212475da5f update parameters 2016-05-17 10:28:16 +08:00
xtaci 2f1f2e2420 Merge branch 'master' of https://github.com/xtaci/kcptun 2016-05-15 20:19:26 +08:00
xtaci 37f9a54d47 update -h 2016-05-15 20:18:48 +08:00
Daniel Fu 415762db23 Update README.md 2016-05-15 00:09:04 +08:00
Daniel Fu 924af51f5d Update README.md 2016-05-15 00:05:22 +08:00
Daniel Fu eab6b2fae6 Update README.md 2016-05-14 23:44:36 +08:00
Daniel Fu 85bda086c9 Update README.md 2016-05-14 18:11:43 +08:00
xtaci 2d0feed5dc modify ldflags to reduce executable size 2016-05-14 17:17:42 +08:00
Daniel Fu 1769371b7d Update README.md 2016-05-14 16:13:04 +08:00
Daniel Fu 6c0e9b3b91 Update README.md 2016-05-14 16:06:46 +08:00
Daniel Fu 60e4201d2a Update README.md 2016-05-14 16:00:47 +08:00
xtaci 8b61a91ef0 commit message 2016-05-14 15:54:59 +08:00
14 changed files with 163 additions and 728 deletions
-13
View File
@@ -1,13 +0,0 @@
Before firing issue, make sure you figured out the following common questions.
PLEASE DO SEARCH FIRST.
1. Check your ```-key xxx``` for at least 3 times, ***MAKE SURE*** both sides share the same secret.
2. ```-nocomp, -datashard, -parityshard, -key, -crypt``` ***must be the same*** on both side.
3. Did you correctly set the ***-target*** on the server side?
4. ***MAKE SURE*** ```telnet target port``` on your server successful(don't ask me why couldn't).
5. Does your ***firewall allows UDP*** communications? (including your ISP Cable-Modem)
6. Are you using the **same version** for both client & server
7. Are you using the **latest release**?
8. Which **OS** do you use?
9. Which end for this issue related to, **client or server**?
+3 -5
View File
@@ -1,8 +1,6 @@
FROM golang:alpine
FROM golang:latest
MAINTAINER xtaci <daniel820313@gmail.com>
RUN apk update && \
apk upgrade && \
apk add git
RUN go get github.com/xtaci/kcptun/client && go get github.com/xtaci/kcptun/server
RUN go get github.com/xtaci/kcptun/client
RUN go get github.com/xtaci/kcptun/server
EXPOSE 29900/udp
EXPOSE 12948
-240
View File
@@ -1,240 +0,0 @@
# <img src="logo.png" alt="kcptun" height="60px" />
[![Release][13]][14] [![Powered][17]][18] [![MIT licensed][11]][12] [![Build Status][3]][4] [![Go Report Card][5]][6] [![Downloads][15]][16] [![Gitter][19]][20] [![Docker][1]][2]
[1]: https://images.microbadger.com/badges/image/xtaci/kcptun.svg
[2]: https://microbadger.com/images/xtaci/kcptun
[3]: https://travis-ci.org/xtaci/kcptun.svg?branch=master
[4]: https://travis-ci.org/xtaci/kcptun
[5]: https://goreportcard.com/badge/github.com/xtaci/kcptun
[6]: https://goreportcard.com/report/github.com/xtaci/kcptun
[7]: https://img.shields.io/badge/license-MIT-blue.svg
[8]: https://raw.githubusercontent.com/xtaci/kcptun/master/LICENSE.md
[9]: https://img.shields.io/github/stars/xtaci/kcptun.svg
[10]: https://github.com/xtaci/kcptun/stargazers
[11]: https://img.shields.io/badge/license-MIT-blue.svg
[12]: LICENSE.md
[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=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://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:
![kcptun](kcptun.png)
***kcptun is based on [kcp-go](https://github.com/xtaci/kcp-go)***
### *QuickStart* :lollipop:
```
Server Side: ./server_linux_amd64 -t "127.0.0.1:1080" -l ":4000" -mode fast2 // forwarding to local port 1080
Client Side: ./client_darwin_amd64 -r "SERVERIP:4000" -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:
Help output under MacOS X:
```
$ ./client_darwin_amd64 -h
NAME:
kcptun - kcptun client
USAGE:
client_darwin_amd64 [global options] command [command options] [arguments...]
VERSION:
20160820
COMMANDS:
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--localaddr value, -l value local listen address (default: ":12948")
--remoteaddr value, -r value kcp server address (default: "vps:29900")
--key value pre-shared secret for client and server (default: "it's a secrect") [$KCPTUN_KEY]
--crypt value aes, aes-128, aes-192, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, xor, none (default: "aes")
--mode value profiles: fast3, fast2, fast, normal (default: "fast")
--conn value set num of UDP connections to server (default: 1)
--mtu value set maximum transmission unit of UDP packets (default: 1350)
--sndwnd value set send window size(num of packets) (default: 128)
--rcvwnd value set receive window size(num of packets) (default: 1024)
--datashard value set reed-solomon erasure coding - datashard (default: 10)
--parityshard value set reed-solomon erasure coding - parityshard (default: 3)
--dscp value set DSCP(6bit) (default: 0)
--nocomp disable compression
--help, -h show help
--version, -v print the version
$ ./server_darwin_amd64 -h
NAME:
kcptun - kcptun server
USAGE:
server_darwin_amd64 [global options] command [command options] [arguments...]
VERSION:
20160820
COMMANDS:
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--listen value, -l value kcp server listen address (default: ":29900")
--target value, -t value target server address (default: "127.0.0.1:12948")
--key value pre-shared secret for client and server (default: "it's a secrect") [$KCPTUN_KEY]
--crypt value aes, aes-128, aes-192, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, xor, none (default: "aes")
--mode value profiles: fast3, fast2, fast, normal (default: "fast")
--mtu value set maximum transmission unit of UDP packets (default: 1350)
--sndwnd value set send window size(num of packets) (default: 1024)
--rcvwnd value set receive window size(num of packets) (default: 1024)
--datashard value set reed-solomon erasure coding - datashard (default: 10)
--parityshard value set reed-solomon erasure coding - parityshard (default: 3)
--dscp value set DSCP(6bit) (default: 0)
--nocomp disable compression
--help, -h show help
--version, -v print the version
```
### *Applications* :lollipop:
1. Real-time gaming.
2. Cross-ISP data exchange in PRC.
3. Other lossy network.
### *Parameters* :lollipop:
***Both sides must agree on the following parameters:***
* datashard
* parityshard
* nocomp
* key
* crypt
other parameters can be set independently.
*How to optimize*
> Step 1Increase client rcvwnd & server sndwnd simultaneously & gradually。
> Step 2Try download something and observer, if the bandwidth usage is close the limit then stop, otherwise goto step 1.
***NOTICE: if too much retranmission happens, it's quite possible the windows are too large***
### *Security* :lollipop:
No matter what encryption you are using for application layer, if you specify ```-crypt none``` to kcptun,
the header will be ***PLAINTEXT*** to everyone; I suggest ```-crypt aes-128``` for encryption at least .
NOTICE: ```-crypt xor``` is also insecure, do not use this unless you know what you are doing.
### *Memory Control* :lollipop:
Routers, mobile devices are sensitive to memory consumption; by setting GOGC environment(eg: GOGC=20) will lower memory consumption.
Reference: https://blog.golang.org/go15gc
### *Traffic Control* :lollipop:
***Intended audience : for those server's bandwidth is quite limited.***
Example: To limit outgoing bandwidth to 32mbit/s on server.
```
root@kcptun:~# cat tc.sh
tc qdisc del dev eth0 root
tc qdisc add dev eth0 root handle 1: htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 32mbit
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 10 fw flowid 1:1
iptables -t mangle -A POSTROUTING -o eth0 -j MARK --set-mark 10
root@kcptun:~#
```
### *DSCP* :lollipop:
Differentiated services or DiffServ is a computer networking architecture that specifies a simple, scalable and coarse-grained mechanism for classifying and managing network traffic and providing quality of service (QoS) on modern IP networks. DiffServ can, for example, be used to provide low-latency to critical network traffic such as voice or streaming media while providing simple best-effort service to non-critical services such as web traffic or file transfers.
DiffServ uses a 6-bit differentiated services code point (DSCP) in the 8-bit differentiated services field (DS field) in the IP header for packet classification purposes. The DS field and ECN field replace the outdated IPv4 TOS field.[1]
setting each side with ```-dscp value```.
### *Embeded Mode* :lollipop:
Latency:
*fast3 >* ***[fast2]*** *> fast > normal > default*
Payload Ratio:
*default > normal > fast >* ***[fast2]*** *> fast3*
Parameters in middle is balanced for latency & payload ratio, the faster you get the more wasteful you are.
Manual control is supported with hidden parameters, you must understand KCP protocol before doing this.
```
-mode manual -nodelay 1 -resend 2 -nc 1 -interval 20
```
I suggest fast2 for high-loss network, normal for low-loss network.
### *Forward Error Correction* :lollipop:
In coding theory, the ReedSolomon code belongs to the class of non-binary cyclic error-correcting codes. The ReedSolomon code is based on univariate polynomials over finite fields.
It is able to detect and correct multiple symbol errors. By adding t check symbols to the data, a ReedSolomon code can detect any combination of up to t erroneous symbols, or correct up to ⌊t/2⌋ symbols. As an erasure code, it can correct up to t known erasures, or it can detect and correct combinations of errors and erasures. Furthermore, ReedSolomon codes are suitable as multiple-burst bit-error correcting codes, since a sequence of b + 1 consecutive bit errors can affect at most two symbols of size b. The choice of t is up to the designer of the code, and may be selected within wide limits.
![reed-solomon](rs.png)
Setting parameters of RS-Code with ```-datashard 10 -parityshard 3```
### *Snappy Stream Compression* :lollipop:
> Snappy is a compression/decompression library. It does not aim for maximum
> compression, or compatibility with any other compression library; instead,
> it aims for very high speeds and reasonable compression. For instance,
> compared to the fastest mode of zlib, Snappy is an order of magnitude faster
> for most inputs, but the resulting compressed files are anywhere from 20% to
> 100% bigger.
> Reference: http://google.github.io/snappy/
disable compression by setting ```-nocomp``` on both side.
> Tips: Turning off compression may reduce latency.
### *SNMP* :lollipop:
```go
// Snmp defines network statistics indicator
type Snmp struct {
BytesSent uint64 // payload bytes sent
BytesReceived uint64
MaxConn uint64
ActiveOpens uint64
PassiveOpens uint64
CurrEstab uint64
InErrs uint64
InCsumErrors uint64 // checksum errors
InSegs uint64
OutSegs uint64
OutBytes uint64 // udp bytes sent
RetransSegs uint64
FastRetransSegs uint64
EarlyRetransSegs uint64
LostSegs uint64
RepeatSegs uint64
FECRecovered uint64
FECErrs uint64
FECSegs uint64 // fec segments received
}
```
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.
### *Donations* :dollar:
![donate](donate.png)
All donations to this project will be used on the R&D of [gonet/2](http://gonet2.github.io/).
### *References* :paperclip:
1. https://github.com/skywind3000/kcp -- KCP - A Fast and Reliable ARQ Protocol.
2. https://github.com/klauspost/reedsolomon -- Reed-Solomon Erasure Coding in Go.
3. https://en.wikipedia.org/wiki/Differentiated_services -- DSCP.
4. http://google.github.io/snappy/ -- A fast compressor/decompressor.
5. https://www.backblaze.com/blog/reed-solomon/ -- Reed-Solomon Explained.
6. http://www.qualcomm.cn/products/raptorq -- RaptorQ Forward Error Correction Scheme for Object Delivery.
7. https://en.wikipedia.org/wiki/PBKDF2 -- Key stretching.
8. http://blog.appcanary.com/2016/encrypt-or-compress.html -- Should you encrypt or compress first?
9. https://github.com/hashicorp/yamux -- Connection multiplexing library.
10. https://tools.ietf.org/html/rfc6937 -- Proportional Rate Reduction for TCP.
11. https://tools.ietf.org/html/rfc5827 -- Early Retransmit for TCP and Stream Control Transmission Protocol (SCTP).
12. http://http2.github.io/ -- What is HTTP/2?
13. http://www.lartc.org/ -- Linux Advanced Routing & Traffic Control
+49 -212
View File
@@ -1,199 +1,48 @@
# <img src="logo.png" alt="kcptun" height="60px" />
[![Release][13]][14] [![Powered][17]][18] [![MIT licensed][11]][12] [![Build Status][3]][4] [![Go Report Card][5]][6] [![Downloads][15]][16] [![Gitter][19]][20] [![Docker][1]][2]
[1]: https://images.microbadger.com/badges/image/xtaci/kcptun.svg
[2]: https://microbadger.com/images/xtaci/kcptun
[![GoDoc][1]][2] [![Build Status][3]][4] [![Go Report Card][5]][6] [![Coverage Statusd][7]][8]
[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
[4]: https://travis-ci.org/xtaci/kcptun
[5]: https://goreportcard.com/badge/github.com/xtaci/kcptun
[6]: https://goreportcard.com/report/github.com/xtaci/kcptun
[7]: https://img.shields.io/badge/license-MIT-blue.svg
[8]: https://raw.githubusercontent.com/xtaci/kcptun/master/LICENSE.md
[11]: https://img.shields.io/badge/license-MIT-blue.svg
[12]: LICENSE.md
[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=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://badges.gitter.im/xtaci/kcptun.svg
[20]: https://gitter.im/xtaci/kcptun?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge
[5]: https://goreportcard.com/badge/xtaci/kcptun
[6]: https://goreportcard.com/report/xtaci/kcptun
[7]: https://coveralls.io/repos/github/xtaci/kcptun/badge.svg?branch=master
[8]: https://coveralls.io/github/xtaci/kcptun?branch=master
***[kcp-go](https://github.com/xtaci/kcp-go)协议测试小工具 :zap: [官方下载地址](https://github.com/xtaci/kcptun/releases/latest):zap:***
TCP流转换为KCP+UDP流,:zap:***[下载地址](https://github.com/xtaci/kcptun/releases/latest)***:zap:工作示意图:
![kcptun](kcptun.png)
[English Readme](README.en.md)
***kcptun是[kcp](https://github.com/xtaci/kcp-go)协议的一个简单应用,可以用于任意tcp网络程序的传输承载,以提高在丢包环境下的网络流畅度。***
_采用极简设计,客户端+服务器源码总共400行,方便用户自己扩展_
### *快速设定* :lollipop:
```
服务器: ./server_linux_amd64 -t "127.0.0.1:8388" -l ":4000" -mode fast2 // 转发到服务器的本地8388端口
客户端: ./client_darwin_amd64 -r "服务器IP地址:4000" -l ":8388" -mode fast2 // 监听客户端的本地8388端口
注: 服务器端需要有服务监听8388端口
服务器: ./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端口
```
### *速度对比* :lollipop:
<img src="fast.png" alt="fast.com" height="256px" />
* 测速网站: https://fast.com
* 接入: 100M ADSL
* WIFI: 5GHz TL-WDR3320
### *使用の方法* :lollipop:
![client](client.png)
![server](server.png)
### *使用方法* :lollipop:
在Mac OS X El Capitan下的帮助输出:
### *适用范围限定* :lollipop:
1. 实时网络游戏的数据传输
2. 跨运营商的流量传输
3. 其他高丢包通信链路的TCP承载
### *推荐参数* :lollipop:
```
$ ./client_darwin_amd64 -h
NAME:
kcptun - kcptun client
USAGE:
client_darwin_amd64 [global options] command [command options] [arguments...]
VERSION:
20160820
COMMANDS:
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--localaddr value, -l value local listen address (default: ":12948")
--remoteaddr value, -r value kcp server address (default: "vps:29900")
--key value pre-shared secret for client and server (default: "it's a secrect") [$KCPTUN_KEY]
--crypt value aes, aes-128, aes-192, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, xor, none (default: "aes")
--mode value profiles: fast3, fast2, fast, normal (default: "fast")
--conn value set num of UDP connections to server (default: 1)
--mtu value set maximum transmission unit of UDP packets (default: 1350)
--sndwnd value set send window size(num of packets) (default: 128)
--rcvwnd value set receive window size(num of packets) (default: 1024)
--datashard value set reed-solomon erasure coding - datashard (default: 10)
--parityshard value set reed-solomon erasure coding - parityshard (default: 3)
--dscp value set DSCP(6bit) (default: 0)
--nocomp disable compression
--help, -h show help
--version, -v print the version
$ ./server_darwin_amd64 -h
NAME:
kcptun - kcptun server
USAGE:
server_darwin_amd64 [global options] command [command options] [arguments...]
VERSION:
20160820
COMMANDS:
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--listen value, -l value kcp server listen address (default: ":29900")
--target value, -t value target server address (default: "127.0.0.1:12948")
--key value pre-shared secret for client and server (default: "it's a secrect") [$KCPTUN_KEY]
--crypt value aes, aes-128, aes-192, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, xor, none (default: "aes")
--mode value profiles: fast3, fast2, fast, normal (default: "fast")
--mtu value set maximum transmission unit of UDP packets (default: 1350)
--sndwnd value set send window size(num of packets) (default: 1024)
--rcvwnd value set receive window size(num of packets) (default: 1024)
--datashard value set reed-solomon erasure coding - datashard (default: 10)
--parityshard value set reed-solomon erasure coding - parityshard (default: 3)
--dscp value set DSCP(6bit) (default: 0)
--nocomp disable compression
--help, -h show help
--version, -v print the version
适用大部分ADSL接入(非对称上下行)的参数(实验环境电信100M ADSL)
SERVER: -mtu 1400 -sndwnd 2048 -rcvwnd 2048 -mode fast2
CLIENT: -mtu 1400 -sndwnd 256 -rcvwnd 2048 -mode fast2 -dscp 46
其它带宽请按比例降低窗口,比如50M ADSL,把CLIENT的 -sndwnd -rcvwnd减掉一半,SERVER不变
```
### *参数调整* :lollipop:
***两端参数必须一致的有:***
* datashard
* parityshard
* nocomp
* key
* crypt
其余为两边可独立设定的参数
*简易自我调优方法*
> 第一步:同时在两端逐步增大client rcvwnd和server sndwnd;
> 第二步:尝试下载,观察如果带宽利用率(服务器+客户端两端都要观察)接近物理带宽则停止,否则跳转到第一步。
***注意:产生大量重传时,一定是窗口偏大了***
*带宽计算公式*
```
在不丢包的情况下,有最大-rcvwnd 个数据包在网络上正在向你传输,以平均数据包大小avgsize计算,在任意时刻,有:
network_cap = rcvwnd*avgsize
数据流向你,这个值再除以ping值(rtt),等于最大带宽使用量。
max_bandwidth = network_cap/rtt = rcvwnd*avgsize/rtt
举例,设rcvwnd = 1024, avgsize = 1KB, rtt = 400ms,则:
max_bandwidth = 1024 * 1KB / 400ms = 2.5MB/s ~= 25Mbps
(注:以上计算不包括前向纠错的数据量)
前向纠错是最大带宽量的一个固定比例增加:
max_bandwidth_fec = max_bandwidth*(datashard+parityshard)/datashard
举例,设datashard = 10 , partiyshard = 3,则:
max_bandwidth_fec = max_bandwidth * (10 + 3) /10 = 1.3*max_bandwidth 1.3 * 25Mbps = 32.5Mbps
```
### *安全* :lollipop:
无论你上层如何加密,如果```-crypt none```,那么协议头部都是***明文***的,建议至少采用```-crypt aes-128```加密。
注意: ```-crypt xor``` 也是不安全的,除非你知道你在做什么。
### *内存控制* :lollipop:
路由器,手机等嵌入式设备通常对内存用量敏感,通过调节环境变量GOGC(例如GOGC=20)后启动client,可以降低内存使用。
参考:https://blog.golang.org/go15gc
### *流量控制* :lollipop:
***必要性: 针对流量敏感的服务器,做双保险。***
> 基本原则: SERVER的发送速率不能超过ADSL下行带宽,否则只会浪费您的服务器带宽。
在server通过linux tc,可以限制服务器发送带宽。
举例: 用linux tc限制server发送带宽为32mbit/s:
```
root@kcptun:~# cat tc.sh
tc qdisc del dev eth0 root
tc qdisc add dev eth0 root handle 1: htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 32mbit
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 10 fw flowid 1:1
iptables -t mangle -A POSTROUTING -o eth0 -j MARK --set-mark 10
root@kcptun:~#
```
其中eth0为网卡,有些服务器为ens3,有些为p2p1,通过ifconfig查询修改。
*巭孬嫑乱动*
### *DSCP* :lollipop:
DSCP差分服务代码点(Differentiated Services Code Point),IETF于1998年12月发布了Diff-ServDifferentiated Service)的QoS分类标准。它在每个数据包IP头部的服务类别TOS标识字节中,利用已使用的6比特和未使用的2比特,通过编码值来区分优先级。
常用DSCP值可以参考[Wikipedia DSCP](https://en.wikipedia.org/wiki/Differentiated_services#Commonly_used_DSCP_values),至于有没有用,完全取决于数据包经过的设备。
通过 ```-dscp ``` 参数指定dscp值,两端可分别设定。
### *前向纠错* :lollipop:
前向纠错采用Reed Solomon纠删码, 它的基本原理如下: 给定n个数据块d1, d2,…, dn,n和一个正整数m, RS根据n个数据块生成m个校验块, c1, c2,…, cm。 对于任意的n和m, 从n个原始数据块和m 个校验块中任取n块就能解码出原始数据, 即RS最多容忍m个数据块或者校验块同时丢失。
![reed-solomon](rs.png)
通过参数```-datashard 10 -parityshard 3``` 在两端同时设定。
### *Snappy数据流压缩* :lollipop:
> Snappy is a compression/decompression library. It does not aim for maximum
> compression, or compatibility with any other compression library; instead,
> it aims for very high speeds and reasonable compression. For instance,
> compared to the fastest mode of zlib, Snappy is an order of magnitude faster
> for most inputs, but the resulting compressed files are anywhere from 20% to
> 100% bigger.
> Reference: http://google.github.io/snappy/
通过参数 ```-nocomp``` 在两端同时设定以关闭压缩。
> 提示: 关闭压缩可能会降低延迟。
常用DSCP值可以参考[Wikipedia DSCP](https://en.wikipedia.org/wiki/Differentiated_services#Commonly_used_DSCP_values),至于有没有用,完全取决于数据包经过的设备。
### *内置模式* :lollipop:
响应速度:
@@ -205,7 +54,13 @@ DSCP差分服务代码点(Differentiated Services Code Point),IETF于1998
```
-mode manual -nodelay 1 -resend 2 -nc 1 -interval 20
```
高丢包率的网络建议采用fast2, 低丢包率的网络,建议采用normal。
### *前向纠错* :lollipop:
前向纠错采用Reed Solomon纠删码, 它的基本原理如下: 给定n个数据块d1, d2,…, dn,n和一个正整数m, RS根据n个数据块生成m个校验块, c1, c2,…, cm。 对于任意的n和m, 从n个原始数据块和m 个校验块中任取n块就能解码出原始数据, 即RS最多容忍m个数据块或者校验块同时丢失。
![reed-solomon](rs.png)
通过```-datashard 10 -parityshard 3``` 可以调整Reed Solomon参数。
### *SNMP* :lollipop:
```go
@@ -236,39 +91,21 @@ type Snmp struct {
使用```kill -SIGUSR1 pid``` 可以在控制台打印出SNMP信息,通常用于精细调整***当前链路的有效载荷比***。
观察```RetransSegs,FastRetransSegs,LostSegs,OutSegs```这几者的数值比例,用于参考调整```-mode manual,fec```的参数。
### *故障排除* :lollipop:
> Q: 客户端和服务器端***皆无*** ```stream opened```信息。
> A: 连接客户端程序的端口设置错误。
> Q: 客户端有 ```stream opened```信息,服务器端没有。
> A: 连接服务器的端口设置错误,或者被防火墙拦截。
> Q: 客户端服务器***皆有*** ```stream opened```信息,但无法通信。
> A: 上层软件的设定错误。
### *性能对比* :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
```
### *免责申明* :warning:
用户以各种方式使用本软件(包括但不限于修改使用、直接使用、通过第三方使用)的过程中,不得以任何方式利用本软件直接或间接从事违反中国法律、以及社会公德的行为。软件的使用者需对自身行为负责,因使用软件引发的一切纠纷,由使用者承担全部法律及连带责任。作者不承担任何法律及连带责任。
对免责声明的解释、修改及更新权均属于作者本人所有。
### *捐赠* :dollar:
![donate](donate.png)
对该项目的捐款将用于[gonet/2](http://gonet2.github.io/)游戏服务器框架的研发。
```特别感谢: 郑H立, 南D风, Li, 七q, 凌J,昶,Les*ables, Ky*n, 噼**啦, 等,名字已做特殊处理。```
### *参考资料* :paperclip:
1. https://github.com/skywind3000/kcp -- KCP - A Fast and Reliable ARQ Protocol.
2. https://github.com/klauspost/reedsolomon -- Reed-Solomon Erasure Coding in Go.
3. https://en.wikipedia.org/wiki/Differentiated_services -- DSCP.
4. http://google.github.io/snappy/ -- A fast compressor/decompressor.
5. https://www.backblaze.com/blog/reed-solomon/ -- Reed-Solomon Explained.
6. http://www.qualcomm.cn/products/raptorq -- RaptorQ Forward Error Correction Scheme for Object Delivery.
7. https://en.wikipedia.org/wiki/PBKDF2 -- Key stretching.
8. http://blog.appcanary.com/2016/encrypt-or-compress.html -- Should you encrypt or compress first?
9. https://github.com/hashicorp/yamux -- Connection multiplexing library.
10. https://tools.ietf.org/html/rfc6937 -- Proportional Rate Reduction for TCP.
11. https://tools.ietf.org/html/rfc5827 -- Early Retransmit for TCP and Stream Control Transmission Protocol (SCTP).
12. http://http2.github.io/ -- What is HTTP/2?
13. http://www.lartc.org/LARTC-zh_CN.GB2312.pdf -- Linux Advanced Routing & Traffic Control
+4 -5
View File
@@ -12,7 +12,6 @@ fi
VERSION=`date -u +%Y%m%d`
LDFLAGS="-X main.VERSION=$VERSION -s -w"
GCFLAGS="-B"
OSES=(linux darwin windows freebsd)
ARCHS=(amd64 386)
@@ -23,8 +22,8 @@ for os in ${OSES[@]}; do
then
suffix=".exe"
fi
env CGO_ENABLED=0 GOOS=$os GOARCH=$arch go build -ldflags "$LDFLAGS" -gcflags "$GCFLAGS" -o client_${os}_${arch}${suffix} github.com/xtaci/kcptun/client
env CGO_ENABLED=0 GOOS=$os GOARCH=$arch go build -ldflags "$LDFLAGS" -gcflags "$GCFLAGS" -o server_${os}_${arch}${suffix} github.com/xtaci/kcptun/server
env GOOS=$os GOARCH=$arch go build -ldflags "$LDFLAGS" -o client_${os}_${arch}${suffix} github.com/xtaci/kcptun/client
env GOOS=$os GOARCH=$arch go build -ldflags "$LDFLAGS" -o server_${os}_${arch}${suffix} github.com/xtaci/kcptun/server
if $UPX; then upx -9 client_${os}_${arch}${suffix} server_${os}_${arch}${suffix};fi
tar -zcf kcptun-${os}-${arch}-$VERSION.tar.gz client_${os}_${arch}${suffix} server_${os}_${arch}${suffix}
$MD5 kcptun-${os}-${arch}-$VERSION.tar.gz
@@ -34,8 +33,8 @@ done
# ARM
ARMS=(5 6 7)
for v in ${ARMS[@]}; do
env CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=$v go build -ldflags "$LDFLAGS" -gcflags "$GCFLAGS" -o client_linux_arm$v github.com/xtaci/kcptun/client
env CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=$v go build -ldflags "$LDFLAGS" -gcflags "$GCFLAGS" -o server_linux_arm$v github.com/xtaci/kcptun/server
env GOOS=linux GOARCH=arm GOARM=$v go build -ldflags "$LDFLAGS" -o client_linux_arm$v github.com/xtaci/kcptun/client
env GOOS=linux GOARCH=arm GOARM=$v go build -ldflags "$LDFLAGS" -o server_linux_arm$v github.com/xtaci/kcptun/server
done
if $UPX; then upx -9 client_linux_arm* server_linux_arm*;fi
tar -zcf kcptun-linux-arm-$VERSION.tar.gz client_linux_arm* server_linux_arm*
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

+61 -146
View File
@@ -7,22 +7,19 @@ import (
"math/rand"
"net"
"os"
"runtime"
"time"
"golang.org/x/crypto/pbkdf2"
"github.com/golang/snappy"
"github.com/hashicorp/yamux"
"github.com/urfave/cli"
kcp "github.com/xtaci/kcp-go"
"github.com/xtaci/yamux"
"github.com/xtaci/kcp-go"
)
var (
// VERSION is injected by buildflags
VERSION = "SELFBUILD"
// SALT is use for pbkdf2 key expansion
SALT = "kcp-go"
SALT = "kcp-go"
)
type compStream struct {
@@ -88,10 +85,6 @@ func checkError(err error) {
func main() {
rand.Seed(int64(time.Now().Nanosecond()))
if VERSION == "SELFBUILD" {
// add more log flags for debugging
log.SetFlags(log.LstdFlags | log.Lshortfile)
}
myApp := cli.NewApp()
myApp.Name = "kcptun"
myApp.Usage = "kcptun client"
@@ -110,33 +103,28 @@ func main() {
cli.StringFlag{
Name: "key",
Value: "it's a secrect",
Usage: "pre-shared secret between client and server",
Usage: "key for communcation, must be the same as kcptun server",
EnvVar: "KCPTUN_KEY",
},
cli.StringFlag{
Name: "crypt",
Value: "aes",
Usage: "aes, aes-128, aes-192, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, xor, none",
Usage: "methods for encryption: aes, tea, xor, none",
},
cli.StringFlag{
Name: "mode",
Value: "fast",
Usage: "profiles: fast3, fast2, fast, normal",
Usage: "mode for communication: fast3, fast2, fast, normal",
},
cli.IntFlag{
Name: "conn",
Value: 1,
Usage: "set num of UDP connections to server",
},
cli.IntFlag{
Name: "autoexpire",
Value: 0,
Usage: "set auto expiration time(in seconds) for a single UDP connection, 0 to disable",
Usage: "establish N physical connections as specified by 'conn' to server",
},
cli.IntFlag{
Name: "mtu",
Value: 1350,
Usage: "set maximum transmission unit for UDP packets",
Usage: "set MTU of UDP packets, suggest 'tracepath' to discover path mtu",
},
cli.IntFlag{
Name: "sndwnd",
@@ -148,6 +136,10 @@ func main() {
Value: 1024,
Usage: "set receive window size(num of packets)",
},
cli.BoolFlag{
Name: "nocomp",
Usage: "disable compression",
},
cli.IntFlag{
Name: "datashard",
Value: 10,
@@ -159,19 +151,14 @@ func main() {
Usage: "set reed-solomon erasure coding - parityshard",
},
cli.BoolFlag{
Name: "acknodelay",
Usage: "flush ack immediately when a packet is received",
Hidden: true,
Name: "acknodelay",
Usage: "flush ack immediately when a packet is received",
},
cli.IntFlag{
Name: "dscp",
Value: 0,
Usage: "set DSCP(6bit)",
},
cli.BoolFlag{
Name: "nocomp",
Usage: "disable compression",
},
cli.IntFlag{
Name: "nodelay",
Value: 0,
@@ -192,23 +179,14 @@ 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 {
myApp.Action = func(c *cli.Context) {
log.Println("version:", VERSION)
addr, err := net.ResolveTCPAddr("tcp", c.String("localaddr"))
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")
@@ -224,138 +202,75 @@ 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)
case "aes-128":
block, _ = kcp.NewAESBlockCrypt(pass[:16])
case "aes-192":
block, _ = kcp.NewAESBlockCrypt(pass[:24])
case "blowfish":
block, _ = kcp.NewBlowfishBlockCrypt(pass)
case "twofish":
block, _ = kcp.NewTwofishBlockCrypt(pass)
case "cast5":
block, _ = kcp.NewCast5BlockCrypt(pass[:16])
case "3des":
block, _ = kcp.NewTripleDESBlockCrypt(pass[:24])
case "xtea":
block, _ = kcp.NewXTEABlockCrypt(pass[:16])
case "salsa20":
block, _ = kcp.NewSalsa20BlockCrypt(pass)
default:
crypt = "aes"
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")
autoexpire := c.Int("autoexpire")
log.Println("listening on:", listener.Addr())
log.Println("encryption:", crypt)
log.Println("encryption:", c.String("crypt"))
log.Println("nodelay parameters:", nodelay, interval, resend, nc)
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)
log.Println("autoexpire:", autoexpire)
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"))
config := &yamux.Config{
AcceptBacklog: 256,
EnableKeepAlive: true,
KeepAliveInterval: 30 * time.Second,
ConnectionWriteTimeout: 10 * time.Second,
MaxStreamWindowSize: uint32(sockbuf),
LogOutput: os.Stderr,
}
createConn := func() *yamux.Session {
kcpconn, err := kcp.DialWithOptions(remoteaddr, block, datashard, parityshard)
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"))
checkError(err)
kcpconn.SetStreamMode(true)
kcpconn.SetNoDelay(nodelay, interval, resend, nc)
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)
}
kcpconn.SetWindowSize(c.Int("sndwnd"), c.Int("rcvwnd"))
kcpconn.SetMtu(c.Int("mtu"))
kcpconn.SetACKNoDelay(c.Bool("acknodelay"))
kcpconn.SetDSCP(c.Int("dscp"))
// stream multiplex
config := &yamux.Config{
AcceptBacklog: 256,
EnableKeepAlive: true,
KeepAliveInterval: 30 * time.Second,
ConnectionWriteTimeout: 30 * time.Second,
MaxStreamWindowSize: 16777216,
LogOutput: os.Stderr,
}
var session *yamux.Session
if nocomp {
if c.Bool("nocomp") {
session, err = yamux.Client(kcpconn, config)
} else {
session, err = yamux.Client(newCompStream(kcpconn), config)
}
checkError(err)
runtime.SetFinalizer(session, func(s *yamux.Session) {
s.Close()
})
return session
}
numconn := uint16(conn)
muxes := make([]struct {
session *yamux.Session
ttl time.Time
}, numconn)
for k := range muxes {
muxes[k].session = createConn()
muxes[k].ttl = time.Now().Add(time.Duration(autoexpire) * time.Second)
numconn := uint16(c.Int("conn"))
var muxes []*yamux.Session
for i := uint16(0); i < numconn; i++ {
muxes = append(muxes, createConn())
}
rr := uint16(0)
for {
p1, err := listener.AcceptTCP()
if err := p1.SetReadBuffer(sockbuf); err != nil {
log.Println("TCP SetReadBuffer:", err)
}
if err := p1.SetWriteBuffer(sockbuf); err != nil {
log.Println("TCP SetWriteBuffer:", err)
}
checkError(err)
idx := rr % numconn
OPEN_P2:
// do auto expiration
if autoexpire > 0 && time.Now().After(muxes[idx].ttl) {
log.Println("autoexpired")
muxes[idx].session = createConn()
muxes[idx].ttl = time.Now().Add(time.Duration(autoexpire) * time.Second)
}
// do session open
p2, err := muxes[idx].session.Open()
mux := muxes[rr%numconn]
p2, err := mux.Open()
if err != nil { // yamux failure
muxes[idx].session = createConn()
muxes[idx].ttl = time.Now().Add(time.Duration(autoexpire) * time.Second)
goto OPEN_P2
log.Println(err)
p1.Close()
mux.Close()
muxes[rr%numconn] = createConn()
continue
}
go handleClient(p1, p2)
rr++
+1 -1
View File
@@ -8,7 +8,7 @@ import (
"os/signal"
"syscall"
kcp "github.com/xtaci/kcp-go"
"github.com/xtaci/kcp-go"
)
func init() {
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

+44 -105
View File
@@ -12,16 +12,14 @@ import (
"golang.org/x/crypto/pbkdf2"
"github.com/golang/snappy"
"github.com/hashicorp/yamux"
"github.com/urfave/cli"
kcp "github.com/xtaci/kcp-go"
"github.com/xtaci/yamux"
"github.com/xtaci/kcp-go"
)
var (
// VERSION is injected by buildflags
VERSION = "SELFBUILD"
// SALT is use for pbkdf2 key expansion
SALT = "kcp-go"
SALT = "kcp-go"
)
type compStream struct {
@@ -53,34 +51,36 @@ func newCompStream(conn net.Conn) *compStream {
}
// handle multiplex-ed connection
func handleMux(conn io.ReadWriteCloser, target string, config *yamux.Config) {
func handleMux(conn io.ReadWriteCloser, target string) {
// stream multiplex
mux, err := yamux.Server(conn, config)
var mux *yamux.Session
config := &yamux.Config{
AcceptBacklog: 256,
EnableKeepAlive: true,
KeepAliveInterval: 30 * time.Second,
ConnectionWriteTimeout: 30 * time.Second,
MaxStreamWindowSize: 16777216,
LogOutput: os.Stderr,
}
m, err := yamux.Server(conn, config)
if err != nil {
log.Println(err)
return
}
mux = m
defer mux.Close()
for {
p1, err := mux.Accept()
if err != nil {
log.Println(err)
return
}
sockbuf := int(config.MaxStreamWindowSize)
p2, err := net.DialTimeout("tcp", target, 5*time.Second)
if err != nil {
log.Println(err)
return
}
if err := p2.(*net.TCPConn).SetReadBuffer(sockbuf); err != nil {
log.Println("TCP SetReadBuffer:", err)
}
if err := p2.(*net.TCPConn).SetWriteBuffer(sockbuf); err != nil {
log.Println("TCP SetWriteBuffer:", err)
}
go handleClient(p1, p2)
}
}
@@ -113,10 +113,6 @@ func handleClient(p1, p2 io.ReadWriteCloser) {
func main() {
rand.Seed(int64(time.Now().Nanosecond()))
if VERSION == "SELFBUILD" {
// add more log flags for debugging
log.SetFlags(log.LstdFlags | log.Lshortfile)
}
myApp := cli.NewApp()
myApp.Name = "kcptun"
myApp.Usage = "kcptun server"
@@ -135,23 +131,23 @@ func main() {
cli.StringFlag{
Name: "key",
Value: "it's a secrect",
Usage: "pre-shared secret between client and server",
Usage: "key for communcation, must be the same as kcptun client",
EnvVar: "KCPTUN_KEY",
},
cli.StringFlag{
Name: "crypt",
Value: "aes",
Usage: "aes, aes-128, aes-192, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, xor, none",
Usage: "methods for encryption: aes, tea, xor, none",
},
cli.StringFlag{
Name: "mode",
Value: "fast",
Usage: "profiles: fast3, fast2, fast, normal",
Usage: "mode for communication: fast3, fast2, fast, normal",
},
cli.IntFlag{
Name: "mtu",
Value: 1350,
Usage: "set maximum transmission unit for UDP packets",
Usage: "set MTU of UDP packets, suggest 'tracepath' to discover path mtu",
},
cli.IntFlag{
Name: "sndwnd",
@@ -163,6 +159,10 @@ func main() {
Value: 1024,
Usage: "set receive window size(num of packets)",
},
cli.BoolFlag{
Name: "nocomp",
Usage: "disable compression",
},
cli.IntFlag{
Name: "datashard",
Value: 10,
@@ -174,19 +174,14 @@ func main() {
Usage: "set reed-solomon erasure coding - parityshard",
},
cli.BoolFlag{
Name: "acknodelay",
Usage: "flush ack immediately when a packet is received",
Hidden: true,
Name: "acknodelay",
Usage: "flush ack immediately when a packet is received",
},
cli.IntFlag{
Name: "dscp",
Value: 0,
Usage: "set DSCP(6bit)",
},
cli.BoolFlag{
Name: "nocomp",
Usage: "disable compression",
},
cli.IntFlag{
Name: "nodelay",
Value: 0,
@@ -207,18 +202,8 @@ 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 {
myApp.Action = func(c *cli.Context) {
log.Println("version:", VERSION)
nodelay, interval, resend, nc := c.Int("nodelay"), c.Int("interval"), c.Int("resend"), c.Int("nc")
switch c.String("mode") {
@@ -232,91 +217,45 @@ 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 crypt {
switch c.String("crypt") {
case "tea":
block, _ = kcp.NewTEABlockCrypt(pass[:16])
case "xor":
block, _ = kcp.NewSimpleXORBlockCrypt(pass)
case "none":
block, _ = kcp.NewNoneBlockCrypt(pass)
case "aes-128":
block, _ = kcp.NewAESBlockCrypt(pass[:16])
case "aes-192":
block, _ = kcp.NewAESBlockCrypt(pass[:24])
case "blowfish":
block, _ = kcp.NewBlowfishBlockCrypt(pass)
case "twofish":
block, _ = kcp.NewTwofishBlockCrypt(pass)
case "cast5":
block, _ = kcp.NewCast5BlockCrypt(pass[:16])
case "3des":
block, _ = kcp.NewTripleDESBlockCrypt(pass[:24])
case "xtea":
block, _ = kcp.NewXTEABlockCrypt(pass[:16])
case "salsa20":
block, _ = kcp.NewSalsa20BlockCrypt(pass)
default:
crypt = "aes"
block, _ = kcp.NewAESBlockCrypt(pass)
}
datashard, parityshard := c.Int("datashard"), c.Int("parityshard")
lis, err := kcp.ListenWithOptions(c.String("listen"), block, datashard, parityshard)
lis, err := kcp.ListenWithOptions(c.String("listen"), block, c.Int("datashard"), c.Int("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:", crypt)
log.Println("encryption:", c.String("crypt"))
log.Println("nodelay parameters:", nodelay, interval, resend, nc)
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)
}
config := &yamux.Config{
AcceptBacklog: 256,
EnableKeepAlive: true,
KeepAliveInterval: 30 * time.Second,
ConnectionWriteTimeout: 10 * time.Second,
MaxStreamWindowSize: uint32(sockbuf),
LogOutput: os.Stderr,
}
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"))
for {
if conn, err := lis.AcceptKCP(); err == nil {
if conn, err := lis.Accept(); err == nil {
log.Println("remote address:", conn.RemoteAddr())
conn.SetStreamMode(true)
conn.SetNoDelay(nodelay, interval, resend, nc)
conn.SetMtu(mtu)
conn.SetWindowSize(sndwnd, rcvwnd)
conn.SetACKNoDelay(acknodelay)
conn.SetKeepAlive(keepalive)
conn.SetMtu(c.Int("mtu"))
conn.SetWindowSize(c.Int("sndwnd"), c.Int("rcvwnd"))
conn.SetACKNoDelay(c.Bool("acknodelay"))
conn.SetDSCP(c.Int("dscp"))
if nocomp {
go handleMux(conn, target, config)
if c.Bool("nocomp") {
go handleMux(conn, c.String("target"))
} else {
go handleMux(newCompStream(conn), target, config)
go handleMux(newCompStream(conn), c.String("target"))
}
} else {
log.Println(err)
+1 -1
View File
@@ -8,7 +8,7 @@ import (
"os/signal"
"syscall"
kcp "github.com/xtaci/kcp-go"
"github.com/xtaci/kcp-go"
)
func init() {