如果不丢包那么 KCP(https://github.com/skywind3000/kcp)和 TCP性能差不多,KCP不会有任何优势,但是网络会卡,造成卡的原因就是丢包和抖动,有同学在内网这样好的环境下没有用任何丢包模拟直接跑,跑出来的数据是差不多的,但是放到公网上,放到3G/4G网络情况下,差距就很明显了,公网在高峰期有平均接近10%的丢包,wifi/3g/4g下更糟糕,这正是造成各种网络卡顿的元凶。
感谢 asio-kcp 的作者 zhangyuan 对 KCP 与 enet, udt做过的一次横向评测,结论如下:
- ASIO-KCP has good performace in wifi and phone network(3G, 4G).
- Extra using 20% ~ 50% network flow for speed improvement.
- The kcp is the first choice for realtime pvp game.
- The lag is less than 1 second when network lag happen. 3 times better than enet when lag happen.
- The enet is a good choice if your game allow 2 second lag.
- UDT is a bad idea. It always sink into badly situation of more than serval seconds lag. And the recovery is not expected.
- enet has the problem of lack of doc. And it has lots of functions that you may intrest. kcp’s doc is chinese. Good thing is the function detail which is writen in code is english. And you can use asio_kcp which is a good wrap.
- The kcp is a simple thing. You will write more code if you want more feature.
- UDT has a perfect doc. UDT may has more bug than others as I feeling.
具体见:横向比较 和 这里。截取一段在网络糟糕时,asio-kcp/enet的延迟数据:
worst network lag happen:
asio: 10:51.21
291 295 269 268 231 195 249 230 225 204enet: 10:51.21
1563 1520 1470 1482 1438 1454 1412 1637 1588 1540
我当年主要测试了 KCP和 TCP/UDT的比较,扫了一眼 libenet觉得协议实现中规中矩,缺乏很多现代传输协议的技术,所以并没有详细测试。而 asio-kcp的作者同时给出了KCP/enet/udt三者的详细比较,为更多犹豫选择使用那一套的人提供了更多指引。
TT打字的下载链接不能访问了,能再补一个吗?
@l
不好意思,已经修复
您好,有人把KCP和ASIO结合起来了,那KCP有没有可能和libuv结合?
@nemo
同求
@nemo
@nemo, @s,可以同libuv结合,见项目wiki上:同现有tcp服务器结合。
@skywind
我看了wiki:https://github.com/skywind3000/kcp/wiki/Cooperate-With-Tcp-Server,这貌似是个TCP+UDP两用的说明,不知道我说得对不对,我想表达的是,libuv自带的TCP比常规的同步的socket接口性能好就是因为异步IO,asio/libuv都是异步IO库,kcp本质是UDP通信算法库,我想要一个异步IO版本的KCP,让KCP在系统IO层面享受异步的好处,实现更高的吞吐。…………^^ 请指教
@nemo
我自己是纯udp实现连接握手和会话管理的,后面接kcp实现传输,提出tcp+udp+kcp的混合方案是因为这样做简单,比你自己实现会话握手简单的多,和同步还是异步没有关系,协议实现也无关同步还是异步,就像tcp协议栈的实现,这是核心逻辑,同步异步只是协议外的用户接口实现,没什么关系。
@nemo
这个两用说明足够你用libev写一个tcp+kcp的双连接会话管理了。
@skywind
看来不是一个层次的^^
我换个角度请教您吧,我现在需要一套C语言下可靠高效顺序性的流传输机制,原有TCP在跨国传输上表现不佳,您的建议是TCP+KCP混合实现更有适应性(主要是中国国情),这个我认可,可是我要封一套这样的接口,又怕自己的理解不深刻做得不好,您能否封装和维护一套接口简单易于推广的库?这样对KCP的推广也很有裨益,毕竟用起来简单,速度又快。如果您有这样的想法,我用行动赞助500元。