Home > 网络编程 > KCP同 UDT/ENET的性能比较

KCP同 UDT/ENET的性能比较

February 18th, 2016 Leave a comment Go to comments

如果不丢包那么 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   204

enet: 10:51.21
1563   1520    1470    1482    1438    1454    1412    1637    1588    1540

我当年主要测试了 KCP和 TCP/UDT的比较,扫了一眼 libenet觉得协议实现中规中矩,缺乏很多现代传输协议的技术,所以并没有详细测试。而 asio-kcp的作者同时给出了KCP/enet/udt三者的详细比较,为更多犹豫选择使用那一套的人提供了更多指引。

Categories: 网络编程 Tags: ,
  1. l
    February 22nd, 2016 at 16:43 | #1

    TT打字的下载链接不能访问了,能再补一个吗?

  2. February 23rd, 2016 at 11:40 | #2

    @l
    不好意思,已经修复

  3. nemo
    February 29th, 2016 at 13:16 | #3

    您好,有人把KCP和ASIO结合起来了,那KCP有没有可能和libuv结合?

  4. s
    March 2nd, 2016 at 12:46 | #4

    @nemo
    同求

  5. March 6th, 2016 at 23:52 | #5

    @nemo
    @nemo, @s,可以同libuv结合,见项目wiki上:同现有tcp服务器结合。

  6. nemo
    March 11th, 2016 at 13:55 | #6

    @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层面享受异步的好处,实现更高的吞吐。…………^^ 请指教

  7. March 12th, 2016 at 13:19 | #7

    @nemo
    我自己是纯udp实现连接握手和会话管理的,后面接kcp实现传输,提出tcp+udp+kcp的混合方案是因为这样做简单,比你自己实现会话握手简单的多,和同步还是异步没有关系,协议实现也无关同步还是异步,就像tcp协议栈的实现,这是核心逻辑,同步异步只是协议外的用户接口实现,没什么关系。

  8. March 12th, 2016 at 13:20 | #8

    @nemo
    这个两用说明足够你用libev写一个tcp+kcp的双连接会话管理了。

  9. nemo
    March 12th, 2016 at 17:55 | #9

    @skywind
    看来不是一个层次的^^

    我换个角度请教您吧,我现在需要一套C语言下可靠高效顺序性的流传输机制,原有TCP在跨国传输上表现不佳,您的建议是TCP+KCP混合实现更有适应性(主要是中国国情),这个我认可,可是我要封一套这样的接口,又怕自己的理解不深刻做得不好,您能否封装和维护一套接口简单易于推广的库?这样对KCP的推广也很有裨益,毕竟用起来简单,速度又快。如果您有这样的想法,我用行动赞助500元。

  1. No trackbacks yet.