From 0d6a9580766702953c134b5c668c9b55906998d5 Mon Sep 17 00:00:00 2001 From: skywind3000 Date: Mon, 12 Aug 2019 15:56:50 +0800 Subject: [PATCH 01/16] update documents --- README.en.md | 1 + README.md | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/README.en.md b/README.en.md index cb32787..790423d 100644 --- a/README.en.md +++ b/README.en.md @@ -144,6 +144,7 @@ Both the use and configuration of the protocol is very simple, in most cases, af - [dog-tunnel](https://github.com/vzex/dog-tunnel): Network tunnel developed by GO, using KCP to greatly improve the transmission speed, and migrated a GO version of the KCP. - [v2ray](https://www.v2ray.com):Well-known proxy software, Shadowsocks replacement, integrated with kcp protocol after 1.17, using UDP transmission, no data packet features. - [HP-Socket](https://github.com/ldcsaa/HP-Socket): High Performance TCP/UDP/HTTP Communication Component. +- [frp](https://github.com/fatedier/frp): A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet. - [asio-kcp](https://github.com/libinzhangyuan/asio_kcp): Use the complete UDP network library of KCP, complete implementation of UDP-based link state management, session control and KCP protocol scheduling, etc. - [kcp-java](https://github.com/hkspirt/kcp-java):Implementation of Java version of KCP protocol. - [kcp-netty](https://github.com/szhnet/kcp-netty):Java implementation of KCP based on Netty. diff --git a/README.md b/README.md index 0e742c2..18da81d 100644 --- a/README.md +++ b/README.md @@ -141,11 +141,12 @@ TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的 - [kcptun](https://github.com/xtaci/kcptun): 基于 kcp-go做的高速远程端口转发(隧道) ,配合ssh -D,可以比 shadowsocks 更流畅的看在线视频。 - [dog-tunnel](https://github.com/vzex/dog-tunnel): GO开发的网络隧道,使用 KCP极大的改进了传输速度,并移植了一份 GO版本 KCP -- [v2ray](https://www.v2ray.com):著名代理软件,Shadowsocks 代替者,1.17后集成了 kcp协议,使用UDP传输,无数据包特征。 -- [HP-Socket](https://github.com/ldcsaa/HP-Socket):高性能网络通信框架 HP-Socket。 +- [v2ray](https://www.v2ray.com): 著名代理软件,Shadowsocks 代替者,1.17后集成了 kcp协议,使用UDP传输,无数据包特征。 +- [HP-Socket](https://github.com/ldcsaa/HP-Socket): 高性能网络通信框架 HP-Socket。 +- [frp](https://github.com/fatedier/frp): 高性能内网穿透的反向代理软件,可将将内网服务暴露映射到外网服务器。 - [asio-kcp](https://github.com/libinzhangyuan/asio_kcp): 使用 KCP的完整 UDP网络库,完整实现了基于 UDP的链接状态管理,会话控制,KCP协议调度等 -- [kcp-java](https://github.com/hkspirt/kcp-java):Java版本 KCP协议实现。 -- [kcp-netty](https://github.com/szhnet/kcp-netty):kcp的Java语言实现,基于netty。 +- [kcp-java](https://github.com/hkspirt/kcp-java): Java版本 KCP协议实现。 +- [kcp-netty](https://github.com/szhnet/kcp-netty): kcp的Java语言实现,基于netty。 - [java-kcp](https://github.com/l42111996/java-Kcp): JAVA版本KCP,基于netty实现(包含fec功能) - [kcp-go](https://github.com/xtaci/kcp-go): 高安全性的kcp的 GO语言实现,包含 UDP会话管理的简单实现,可以作为后续开发的基础库。 - [kcp-csharp](https://github.com/limpo1989/kcp-csharp): kcp的 csharp移植,同时包含一份回话管理,可以连接上面kcp-go的服务端。 From 362c49d5900f4697bb1dd3a082229e07125ba9e8 Mon Sep 17 00:00:00 2001 From: skywind3000 Date: Tue, 20 Aug 2019 14:57:03 +0800 Subject: [PATCH 02/16] new twitter --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 18da81d..dfbfa57 100644 --- a/README.md +++ b/README.md @@ -223,7 +223,7 @@ blog: http://www.skywind.me zhihu: https://www.zhihu.com/people/skywind3000 - +twitter: [https://twitter.com/skywind3000](https://twitter.com/skywind3000) ## Contributors From 6256055924e581eaaf5a4c177f031fe35c657319 Mon Sep 17 00:00:00 2001 From: myd7349 Date: Sat, 21 Sep 2019 14:24:04 +0800 Subject: [PATCH 03/16] improve CMakeLists.txt - add install target - add BUILD_TESTING option --- CMakeLists.txt | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d3a1dbd..a3b12b4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,11 +1,31 @@ -PROJECT(kcp) CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +project(kcp LANGUAGES C) + +include(CTest) +include(GNUInstallDirs) + add_library(kcp STATIC ikcp.c) -add_executable(kcp_test test.cpp) - - +install(FILES ikcp.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +install(TARGETS kcp + EXPORT kcp-targets + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} +) +install(EXPORT kcp-targets + FILE kcp-config.cmake + NAMESPACE kcp:: + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/kcp +) +if (BUILD_TESTING) + enable_language(CXX) + + add_executable(kcp_test test.cpp) + if(MSVC AND NOT (MSVC_VERSION LESS 1900)) + target_compile_options(kcp_test PRIVATE /utf-8) + endif() +endif () From e47e22b58307eab6a3a6aa950522ba0d606841b8 Mon Sep 17 00:00:00 2001 From: halx99 Date: Mon, 11 Nov 2019 21:53:04 +0800 Subject: [PATCH 04/16] fix warnings. --- ikcp.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ikcp.c b/ikcp.c index 2334fd6..ebc2fad 100644 --- a/ikcp.c +++ b/ikcp.c @@ -395,7 +395,7 @@ int ikcp_recv(ikcpcb *kcp, char *buffer, int len) fragment = seg->frg; if (ikcp_canlog(kcp, IKCP_LOG_RECV)) { - ikcp_log(kcp, IKCP_LOG_RECV, "recv sn=%lu", seg->sn); + ikcp_log(kcp, IKCP_LOG_RECV, "recv sn=%lu", (unsigned long)seg->sn); } if (ispeek == 0) { @@ -412,7 +412,7 @@ int ikcp_recv(ikcpcb *kcp, char *buffer, int len) // move available data from rcv_buf -> rcv_queue while (! iqueue_is_empty(&kcp->rcv_buf)) { - IKCPSEG *seg = iqueue_entry(kcp->rcv_buf.next, IKCPSEG, node); + seg = iqueue_entry(kcp->rcv_buf.next, IKCPSEG, node); if (seg->sn == kcp->rcv_nxt && kcp->nrcv_que < kcp->rcv_wnd) { iqueue_del(&seg->node); kcp->nrcv_buf--; @@ -753,7 +753,7 @@ int ikcp_input(ikcpcb *kcp, const char *data, long size) int flag = 0; if (ikcp_canlog(kcp, IKCP_LOG_INPUT)) { - ikcp_log(kcp, IKCP_LOG_INPUT, "[RI] %d bytes", size); + ikcp_log(kcp, IKCP_LOG_INPUT, "[RI] %d bytes", (int)size); } if (data == NULL || (int)size < (int)IKCP_OVERHEAD) return -1; @@ -814,7 +814,7 @@ int ikcp_input(ikcpcb *kcp, const char *data, long size) } if (ikcp_canlog(kcp, IKCP_LOG_IN_ACK)) { ikcp_log(kcp, IKCP_LOG_IN_DATA, - "input ack: sn=%lu rtt=%ld rto=%ld", sn, + "input ack: sn=%lu rtt=%ld rto=%ld", (unsigned long)sn, (long)_itimediff(kcp->current, ts), (long)kcp->rx_rto); } @@ -822,7 +822,7 @@ int ikcp_input(ikcpcb *kcp, const char *data, long size) else if (cmd == IKCP_CMD_PUSH) { if (ikcp_canlog(kcp, IKCP_LOG_IN_DATA)) { ikcp_log(kcp, IKCP_LOG_IN_DATA, - "input psh: sn=%lu ts=%lu", sn, ts); + "input psh: sn=%lu ts=%lu", (unsigned long)sn, (unsigned long)ts); } if (_itimediff(sn, kcp->rcv_nxt + kcp->rcv_wnd) < 0) { ikcp_ack_push(kcp, sn, ts); @@ -857,7 +857,7 @@ int ikcp_input(ikcpcb *kcp, const char *data, long size) // do nothing if (ikcp_canlog(kcp, IKCP_LOG_IN_WINS)) { ikcp_log(kcp, IKCP_LOG_IN_WINS, - "input wins: %lu", (IUINT32)(wnd)); + "input wins: %lu", (unsigned long)(wnd)); } } else { @@ -1075,7 +1075,7 @@ void ikcp_flush(ikcpcb *kcp) } if (needsend) { - int size, need; + int need; segment->ts = current; segment->wnd = seg.wnd; segment->una = kcp->rcv_nxt; @@ -1096,7 +1096,7 @@ void ikcp_flush(ikcpcb *kcp) } if (segment->xmit >= kcp->dead_link) { - kcp->state = -1; + kcp->state = (IUINT32)-1; } } } From 408fe809086daaa07ab53c984729b8a993cba056 Mon Sep 17 00:00:00 2001 From: skywind3000 Date: Wed, 8 Jan 2020 02:40:06 +0800 Subject: [PATCH 05/16] update doc --- README.md | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index dfbfa57..d083c35 100644 --- a/README.md +++ b/README.md @@ -201,13 +201,27 @@ TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的 - [Kcp a new low latency secure network stack](https://improbable.io/blog/kcp-a-new-low-latency-secure-network-stack) -# 项目历史 +# 关于作者 -See [Success Stories](https://github.com/skywind3000/kcp/wiki/Success-Stories). +我叫林伟,笔名韦易笑,写程序很多年,喜欢研究解决程序中的一些瓶颈问题,早年喜欢游戏开发,照着《VGA编程》来做游戏图形,读 Michael Abrash 的《图形程序开发人员指南》做软渲染器,喜欢鼓捣一些能够榨干 CPU 能够运行更快的代码,参加工作后,兴趣转移到服务端和网络相关的技术。 + +2007 年时做了几个传统游戏后开始研究快速动作游戏的同步问题,期间写过不少文章,算是国内比较早研究同步问题的人,然而发现不管怎么解决同步都需要在网络传输方面有所突破,于是开始花时间在网络传输这个领域上,尝试基于 UDP 实现一些保守的可靠协议,反照 BSD Lite 4.4 的代码实现一些类 TCP 协议,或者做个 P2P 的网络模块,实现个动态路由网络,而这个 KCP 协议基本算是自己做的好几个玩具中的一个。 + +Kcptun 的作者 xtaci 是我的大学同学,我俩都是学通信出身的,我们经常在一起研究如何进行传输优化。 + +# 关于协议 + +近年来,网络游戏和各类社交网络都在成几何倍数的增长,不管网络游戏还是各类互动社交网络,交互性和复杂度都在迅速提高,都需要在极短的时间内将数据同时投递给大量用户,因此传输技术自然变为未来制约发展的一个重要技术因素之一,而开源界里各种著名的传输协议,如 raknet/enet 之类,一发布都是整套协议栈一起发布,这种形式是不利于多样化的,我的项目只能选择用或者不用你,很难选择 “部分用你”,然而你一套协议栈设计的再好,是非常难以满足不同角度的各种需求的。 + +因此 KCP 的方式是把协议栈 “拆开”,让大家可以根据项目需求进行灵活的调整和组装,你可以下面加一层 reed solomon 的纠删码做 FEC,上面加一层类 RC4/Salsa20 做流加密,握手处再设计一套非堆成密钥交换,底层 UDP 传输层再做一套动态路由系统,同时探测多条路径,选最好路径进行传输。这些不同的 “协议单元” 可以像搭建积木一般根据需要自由组合,保证 “简单性” 和 “可拆分性”,这样才能灵活适配多变的业务需求,哪个模块不好,换了就是。 + +因此给大家一个可以自由组合的 “协议单元” ,胜过给大家一套完整成熟的 “协议栈”。 + +For more information, please see the [Success Stories](https://github.com/skywind3000/kcp/wiki/Success-Stories). # 欢迎捐赠 -![欢迎使用支付宝对该项目进行捐赠](https://raw.githubusercontent.com/skywind3000/kcp/master/images/donation.png) +![欢迎使用支付宝对该项目进行捐赠](images/donation.png) 欢迎使用支付宝手扫描上面的二维码,对该项目进行捐赠。捐赠款项将用于持续优化 KCP协议以及完善文档。 From 474b36b844dcec77fac20a3502bf4753f1b06c6d Mon Sep 17 00:00:00 2001 From: skywind3000 Date: Wed, 8 Jan 2020 02:44:50 +0800 Subject: [PATCH 06/16] polish doc --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d083c35..1162854 100644 --- a/README.md +++ b/README.md @@ -205,7 +205,7 @@ TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的 我叫林伟,笔名韦易笑,写程序很多年,喜欢研究解决程序中的一些瓶颈问题,早年喜欢游戏开发,照着《VGA编程》来做游戏图形,读 Michael Abrash 的《图形程序开发人员指南》做软渲染器,喜欢鼓捣一些能够榨干 CPU 能够运行更快的代码,参加工作后,兴趣转移到服务端和网络相关的技术。 -2007 年时做了几个传统游戏后开始研究快速动作游戏的同步问题,期间写过不少文章,算是国内比较早研究同步问题的人,然而发现不管怎么解决同步都需要在网络传输方面有所突破,于是开始花时间在网络传输这个领域上,尝试基于 UDP 实现一些保守的可靠协议,反照 BSD Lite 4.4 的代码实现一些类 TCP 协议,或者做个 P2P 的网络模块,实现个动态路由网络,而这个 KCP 协议基本算是自己做的好几个玩具中的一个。 +2007 年时做了几个传统游戏后开始研究快速动作游戏的同步问题,期间写过不少文章,算是国内比较早研究同步问题的人,然而发现不管怎么解决同步都需要在网络传输方面有所突破,于是开始花时间在网络传输这个领域上,尝试基于 UDP 实现一些保守的可靠协议,反照 BSD Lite 4.4 的代码实现一些类 TCP 协议,觉得比较有意思,又接着实现一些 P2P 和动态路由网相关的玩具,而这个 KCP 协议基本算是自己传输方面做的几个玩具中的一个。 Kcptun 的作者 xtaci 是我的大学同学,我俩都是学通信出身的,我们经常在一起研究如何进行传输优化。 From 73dfc248cf72199d60f7dbe6a2364e3e1e8de683 Mon Sep 17 00:00:00 2001 From: skywind3000 Date: Wed, 8 Jan 2020 15:55:29 +0800 Subject: [PATCH 07/16] update README.md --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 1162854..eb40120 100644 --- a/README.md +++ b/README.md @@ -203,19 +203,19 @@ TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的 # 关于作者 -我叫林伟,笔名韦易笑,写程序很多年,喜欢研究解决程序中的一些瓶颈问题,早年喜欢游戏开发,照着《VGA编程》来做游戏图形,读 Michael Abrash 的《图形程序开发人员指南》做软渲染器,喜欢鼓捣一些能够榨干 CPU 能够运行更快的代码,参加工作后,兴趣转移到服务端和网络相关的技术。 +我叫林伟,笔名韦易笑,写程序很多年,喜欢研究解决程序中的一些瓶颈问题,早年喜欢游戏开发,照着《VGA编程》来做游戏图形,读 Michael Abrash 的《图形程序开发人员指南》做软渲染器,喜欢摆弄一些能够榨干 CPU 能够运行更快的代码,参加工作后,兴趣转移到服务端和网络相关的技术。 2007 年时做了几个传统游戏后开始研究快速动作游戏的同步问题,期间写过不少文章,算是国内比较早研究同步问题的人,然而发现不管怎么解决同步都需要在网络传输方面有所突破,于是开始花时间在网络传输这个领域上,尝试基于 UDP 实现一些保守的可靠协议,反照 BSD Lite 4.4 的代码实现一些类 TCP 协议,觉得比较有意思,又接着实现一些 P2P 和动态路由网相关的玩具,而这个 KCP 协议基本算是自己传输方面做的几个玩具中的一个。 -Kcptun 的作者 xtaci 是我的大学同学,我俩都是学通信出身的,我们经常在一起研究如何进行传输优化。 +Kcptun 的作者 xtaci 是我的大学同学,我俩都是学通信的,经常在一起研究如何进行传输优化。 # 关于协议 -近年来,网络游戏和各类社交网络都在成几何倍数的增长,不管网络游戏还是各类互动社交网络,交互性和复杂度都在迅速提高,都需要在极短的时间内将数据同时投递给大量用户,因此传输技术自然变为未来制约发展的一个重要技术因素之一,而开源界里各种著名的传输协议,如 raknet/enet 之类,一发布都是整套协议栈一起发布,这种形式是不利于多样化的,我的项目只能选择用或者不用你,很难选择 “部分用你”,然而你一套协议栈设计的再好,是非常难以满足不同角度的各种需求的。 +近年来,网络游戏和各类社交网络都在成几何倍数的增长,不管网络游戏还是各类互动社交网络,交互性和复杂度都在迅速提高,都需要在极短的时间内将数据同时投递给大量用户,因此传输技术自然变为未来制约发展的一个重要因素,而开源界里各种著名的传输协议,如 raknet/enet 之类,一发布都是整套协议栈一起发布,这种形式是不利于多样化的,我的项目只能选择用或者不用你,很难选择 “部分用你”,然而你一套协议栈设计的再好,是非常难以满足不同角度的各种需求的。 -因此 KCP 的方式是把协议栈 “拆开”,让大家可以根据项目需求进行灵活的调整和组装,你可以下面加一层 reed solomon 的纠删码做 FEC,上面加一层类 RC4/Salsa20 做流加密,握手处再设计一套非堆成密钥交换,底层 UDP 传输层再做一套动态路由系统,同时探测多条路径,选最好路径进行传输。这些不同的 “协议单元” 可以像搭建积木一般根据需要自由组合,保证 “简单性” 和 “可拆分性”,这样才能灵活适配多变的业务需求,哪个模块不好,换了就是。 +因此 KCP 的方式是把协议栈 “拆开”,让大家可以根据项目需求进行灵活的调整和组装,你可以下面加一层 reed solomon 的纠删码做 FEC,上面加一层类 RC4/Salsa20 做流加密,握手处再设计一套非对称密钥交换,底层 UDP 传输层再做一套动态路由系统,同时探测多条路径,选最好路径进行传输。这些不同的 “协议单元” 可以像搭建积木一般根据需要自由组合,保证 “简单性” 和 “可拆分性”,这样才能灵活适配多变的业务需求,哪个模块不好,换了就是。 -因此给大家一个可以自由组合的 “协议单元” ,胜过给大家一套完整成熟的 “协议栈”。 +未来传输方面的解决方案必然是根据应用深度定制的,因此给大家一个可以自由组合的 “协议单元” ,方便大家集成在自己的协议栈中。 For more information, please see the [Success Stories](https://github.com/skywind3000/kcp/wiki/Success-Stories). From 25e809ad42fc96f37f793c50ff428f591eee9840 Mon Sep 17 00:00:00 2001 From: skywind3000 Date: Wed, 8 Jan 2020 16:02:17 +0800 Subject: [PATCH 08/16] commit new README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index eb40120..66940f3 100644 --- a/README.md +++ b/README.md @@ -205,7 +205,7 @@ TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的 我叫林伟,笔名韦易笑,写程序很多年,喜欢研究解决程序中的一些瓶颈问题,早年喜欢游戏开发,照着《VGA编程》来做游戏图形,读 Michael Abrash 的《图形程序开发人员指南》做软渲染器,喜欢摆弄一些能够榨干 CPU 能够运行更快的代码,参加工作后,兴趣转移到服务端和网络相关的技术。 -2007 年时做了几个传统游戏后开始研究快速动作游戏的同步问题,期间写过不少文章,算是国内比较早研究同步问题的人,然而发现不管怎么解决同步都需要在网络传输方面有所突破,于是开始花时间在网络传输这个领域上,尝试基于 UDP 实现一些保守的可靠协议,反照 BSD Lite 4.4 的代码实现一些类 TCP 协议,觉得比较有意思,又接着实现一些 P2P 和动态路由网相关的玩具,而这个 KCP 协议基本算是自己传输方面做的几个玩具中的一个。 +2007 年时做了几个传统游戏后开始研究快速动作游戏的同步问题,期间写过不少文章,算是国内比较早研究同步问题的人,然而发现不管怎么解决同步都需要在网络传输方面有所突破,后来离开游戏转行互联网后也发现不少领域有这方面的需求,于是开始花时间在网络传输这个领域上,尝试基于 UDP 实现一些保守的可靠协议,反照 BSD Lite 4.4 的代码实现一些类 TCP 协议,觉得比较有意思,又接着实现一些 P2P 和动态路由网相关的玩具,而这个 KCP 协议基本算是自己传输方面做的几个玩具中的一个。 Kcptun 的作者 xtaci 是我的大学同学,我俩都是学通信的,经常在一起研究如何进行传输优化。 @@ -215,7 +215,7 @@ Kcptun 的作者 xtaci 是我的大学同学,我俩都是学通信的,经常 因此 KCP 的方式是把协议栈 “拆开”,让大家可以根据项目需求进行灵活的调整和组装,你可以下面加一层 reed solomon 的纠删码做 FEC,上面加一层类 RC4/Salsa20 做流加密,握手处再设计一套非对称密钥交换,底层 UDP 传输层再做一套动态路由系统,同时探测多条路径,选最好路径进行传输。这些不同的 “协议单元” 可以像搭建积木一般根据需要自由组合,保证 “简单性” 和 “可拆分性”,这样才能灵活适配多变的业务需求,哪个模块不好,换了就是。 -未来传输方面的解决方案必然是根据应用深度定制的,因此给大家一个可以自由组合的 “协议单元” ,方便大家集成在自己的协议栈中。 +未来传输方面的解决方案必然是根据使用场景深度定制的,因此给大家一个可以自由组合的 “协议单元” ,方便大家集成在自己的协议栈中。 For more information, please see the [Success Stories](https://github.com/skywind3000/kcp/wiki/Success-Stories). From 6514e149c5e5d1f8b70450b178b057856ee038fb Mon Sep 17 00:00:00 2001 From: skywind3000 Date: Wed, 8 Jan 2020 16:03:30 +0800 Subject: [PATCH 09/16] update doc --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 66940f3..156ce7b 100644 --- a/README.md +++ b/README.md @@ -205,7 +205,7 @@ TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的 我叫林伟,笔名韦易笑,写程序很多年,喜欢研究解决程序中的一些瓶颈问题,早年喜欢游戏开发,照着《VGA编程》来做游戏图形,读 Michael Abrash 的《图形程序开发人员指南》做软渲染器,喜欢摆弄一些能够榨干 CPU 能够运行更快的代码,参加工作后,兴趣转移到服务端和网络相关的技术。 -2007 年时做了几个传统游戏后开始研究快速动作游戏的同步问题,期间写过不少文章,算是国内比较早研究同步问题的人,然而发现不管怎么解决同步都需要在网络传输方面有所突破,后来离开游戏转行互联网后也发现不少领域有这方面的需求,于是开始花时间在网络传输这个领域上,尝试基于 UDP 实现一些保守的可靠协议,反照 BSD Lite 4.4 的代码实现一些类 TCP 协议,觉得比较有意思,又接着实现一些 P2P 和动态路由网相关的玩具,而这个 KCP 协议基本算是自己传输方面做的几个玩具中的一个。 +2007 年时做了几个传统游戏后开始研究快速动作游戏的同步问题,期间写过不少文章,算是国内比较早研究同步问题的人,然而发现不管怎么解决同步都需要在网络传输方面有所突破,后来离开游戏转行互联网后也发现不少领域有这方面的需求,于是开始花时间在网络传输这个领域上,尝试基于 UDP 实现一些保守的可靠协议,反照 BSD Lite 4.4 的代码实现一些类 TCP 协议,觉得比较有意思,又接着实现一些 P2P 和动态路由网相关的玩具。KCP 协议诞生于 2011 年,基本算是自己传输方面做的几个玩具中的一个。 Kcptun 的作者 xtaci 是我的大学同学,我俩都是学通信的,经常在一起研究如何进行传输优化。 From bfc2e502df5ad8122c8290b9a94636e300196a70 Mon Sep 17 00:00:00 2001 From: skywind3000 Date: Sat, 11 Jan 2020 00:36:05 +0800 Subject: [PATCH 10/16] update --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 156ce7b..d8634fb 100644 --- a/README.md +++ b/README.md @@ -209,6 +209,8 @@ TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的 Kcptun 的作者 xtaci 是我的大学同学,我俩都是学通信的,经常在一起研究如何进行传输优化。 +喜欢本项目请关注我的:[twitter](https://twitter.com/skywind3000) 和 [zhihu](https://www.zhihu.com/people/skywind3000)。 + # 关于协议 近年来,网络游戏和各类社交网络都在成几何倍数的增长,不管网络游戏还是各类互动社交网络,交互性和复杂度都在迅速提高,都需要在极短的时间内将数据同时投递给大量用户,因此传输技术自然变为未来制约发展的一个重要因素,而开源界里各种著名的传输协议,如 raknet/enet 之类,一发布都是整套协议栈一起发布,这种形式是不利于多样化的,我的项目只能选择用或者不用你,很难选择 “部分用你”,然而你一套协议栈设计的再好,是非常难以满足不同角度的各种需求的。 @@ -219,6 +221,7 @@ Kcptun 的作者 xtaci 是我的大学同学,我俩都是学通信的,经常 For more information, please see the [Success Stories](https://github.com/skywind3000/kcp/wiki/Success-Stories). + # 欢迎捐赠 ![欢迎使用支付宝对该项目进行捐赠](images/donation.png) @@ -235,7 +238,7 @@ Gitter 群:https://gitter.im/skywind3000/KCP blog: http://www.skywind.me -zhihu: https://www.zhihu.com/people/skywind3000 +zhihu: twitter: [https://twitter.com/skywind3000](https://twitter.com/skywind3000) From 6bd25130cb61b7af0bfa385bd7914afdfba3afb1 Mon Sep 17 00:00:00 2001 From: skywind3000 Date: Sat, 11 Jan 2020 00:37:24 +0800 Subject: [PATCH 11/16] update --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index d8634fb..30af566 100644 --- a/README.md +++ b/README.md @@ -234,13 +234,11 @@ For more information, please see the [Success Stories](https://github.com/skywin 欢迎关注 KCP交流群:364933586(QQ群号),KCP集成,调优,网络传输以及相关技术讨论 + Gitter 群:https://gitter.im/skywind3000/KCP blog: http://www.skywind.me -zhihu: - -twitter: [https://twitter.com/skywind3000](https://twitter.com/skywind3000) ## Contributors From c87144969e05ce114b112dca29d1c9674e7c8698 Mon Sep 17 00:00:00 2001 From: skywind3000 Date: Sat, 11 Jan 2020 00:38:53 +0800 Subject: [PATCH 12/16] update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 30af566..314e704 100644 --- a/README.md +++ b/README.md @@ -209,7 +209,7 @@ TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的 Kcptun 的作者 xtaci 是我的大学同学,我俩都是学通信的,经常在一起研究如何进行传输优化。 -喜欢本项目请关注我的:[twitter](https://twitter.com/skywind3000) 和 [zhihu](https://www.zhihu.com/people/skywind3000)。 +喜欢本项目欢迎关注我的:[twitter](https://twitter.com/skywind3000) 和 [zhihu](https://www.zhihu.com/people/skywind3000)。 # 关于协议 From 2acf5a39c767003cc491094cfc17aa80982abb16 Mon Sep 17 00:00:00 2001 From: JackBoosY Date: Thu, 16 Jan 2020 00:13:36 -0800 Subject: [PATCH 13/16] Add vcpkg installation instructions --- README.en.md | 12 ++++++++++++ README.md | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/README.en.md b/README.en.md index 790423d..26a63c8 100644 --- a/README.en.md +++ b/README.en.md @@ -47,6 +47,18 @@ There are two kinds of ARQ model responses: UNA (All packets before this number KCP normal mode uses the same fair concession rules as TCP, i.e., the send window size is determined by: four factors including the size of the send cache, the size of the receive buffer at the receiving end, packet loss concession and slow start. However, when sending small data with high timeliness requirement, it is allowed to select skipping the latter two steps through configuration, and use only the first two items to control the transmission frequency, sacrificing some of the fairness and bandwidth utilization, in exchange for the effect of smooth transmission even when BT is opened. +# Quick install + +You can download and install kcp using the [vcpkg](https://github.com/Microsoft/vcpkg) dependency manager: + + git clone https://github.com/Microsoft/vcpkg.git + cd vcpkg + ./bootstrap-vcpkg.sh + ./vcpkg integrate install + ./vcpkg install kcp + +The kcp port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository. + # Basic Usage 1. Create KCP object: diff --git a/README.md b/README.md index 314e704..5dac352 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,18 @@ TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的 KCP正常模式同TCP一样使用公平退让法则,即发送窗口大小由:发送缓存大小、接收端剩余接收缓存大小、丢包退让及慢启动这四要素决定。但传送及时性要求很高的小数据时,可选择通过配置跳过后两步,仅用前两项来控制发送频率。以牺牲部分公平性及带宽利用率之代价,换取了开着BT都能流畅传输的效果。 +# 快速安装 + +您可以使用[vcpkg](https://github.com/Microsoft/vcpkg)库管理器下载并安装kcp: + + git clone https://github.com/Microsoft/vcpkg.git + cd vcpkg + ./bootstrap-vcpkg.sh + ./vcpkg integrate install + ./vcpkg install kcp + +vcpkg中的kcp库由Microsoft团队成员和社区贡献者保持最新状态。如果版本过时,请在vcpkg存储库上[创建问题或请求请求](https://github.com/Microsoft/vcpkg)。 + # 基本使用 1. 创建 KCP对象: From cd8c0da05ff154fbea9118bd64247f0896225b91 Mon Sep 17 00:00:00 2001 From: JackBoosY Date: Thu, 16 Jan 2020 00:17:29 -0800 Subject: [PATCH 14/16] Fix typo --- README.en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.en.md b/README.en.md index 26a63c8..5513838 100644 --- a/README.en.md +++ b/README.en.md @@ -47,7 +47,7 @@ There are two kinds of ARQ model responses: UNA (All packets before this number KCP normal mode uses the same fair concession rules as TCP, i.e., the send window size is determined by: four factors including the size of the send cache, the size of the receive buffer at the receiving end, packet loss concession and slow start. However, when sending small data with high timeliness requirement, it is allowed to select skipping the latter two steps through configuration, and use only the first two items to control the transmission frequency, sacrificing some of the fairness and bandwidth utilization, in exchange for the effect of smooth transmission even when BT is opened. -# Quick install +# Quick Install You can download and install kcp using the [vcpkg](https://github.com/Microsoft/vcpkg) dependency manager: From 62a0cc14182634dc7c56ba5de985b6456872a1c9 Mon Sep 17 00:00:00 2001 From: JackBoosY Date: Thu, 16 Jan 2020 01:50:07 -0800 Subject: [PATCH 15/16] fix typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5dac352..7e6de5d 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的 ./vcpkg integrate install ./vcpkg install kcp -vcpkg中的kcp库由Microsoft团队成员和社区贡献者保持最新状态。如果版本过时,请在vcpkg存储库上[创建问题或请求请求](https://github.com/Microsoft/vcpkg)。 +vcpkg中的kcp库由Microsoft团队成员和社区贡献者保持最新状态。如果版本过时,请在vcpkg存储库上[创建issue或提出PR](https://github.com/Microsoft/vcpkg)。 # 基本使用 From cf683713cb34e320aefa9b788e2c8c6550786d9d Mon Sep 17 00:00:00 2001 From: skywind3000 Date: Mon, 20 Jan 2020 16:24:16 +0800 Subject: [PATCH 16/16] fixed: incorrect log channel --- ikcp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ikcp.c b/ikcp.c index ebc2fad..246b08c 100644 --- a/ikcp.c +++ b/ikcp.c @@ -813,7 +813,7 @@ int ikcp_input(ikcpcb *kcp, const char *data, long size) } } if (ikcp_canlog(kcp, IKCP_LOG_IN_ACK)) { - ikcp_log(kcp, IKCP_LOG_IN_DATA, + ikcp_log(kcp, IKCP_LOG_IN_ACK, "input ack: sn=%lu rtt=%ld rto=%ld", (unsigned long)sn, (long)_itimediff(kcp->current, ts), (long)kcp->rx_rto);