写点什么

KCP 协议应用详解:为速度而生的可靠传输协议

  • 2025-09-02
    北京
  • 本文字数:1882 字

    阅读完需:约 6 分钟

一、概述

在当今互联网应用中,实时性和流畅性至关重要,尤其是在网络游戏、视频会议和在线直播等场景中。传统的 TCP 协议虽然提供可靠的数据传输,但其复杂的拥塞控制机制和重传策略会导致较高的延迟,难以满足实时应用的需求。而 UDP 协议虽然速度快,但缺乏可靠性,数据包丢失和乱序问题会影响应用体验。

二、为什么需要引入 KCP

在介绍 KCP 前,我们先回顾下 TCP 和 UDP 的特性


TCP 主要保障链接可靠性,但是对传送效率不做保证。


UDP 传送效率最大,但是对传输可靠性无法保证。



那么怎么才能做到既要保证可靠性又保证传输效率呢

三、KCP 简介

这个时候 KCP 协议应运而生,它旨在弥补 TCP 和 UDP 的不足,在保证可靠性的前提下,提供更低的延迟和更高的传输效率。


KCP 协议简介


KCP(KCP Protocol)是一种基于 UDP 的可靠传输协议,由国内开发者 skywind3000 于 2014 年开源。它借鉴了 TCP 协议的可靠传输机制,例如确认应答、超时重传、流量控制等,但对其进行了精简和优化,使其更适合实时应用场景。


KCP 协议的特点


•低延迟: KCP 协议采用更激进的重传策略,减少数据包重传的等待时间,从而降低延迟。


•高吞吐量: KCP 协议可以根据网络状况动态调整发送速率,充分利用网络带宽,提高传输效率。


•可靠性: KCP 协议提供可靠的传输机制,确保数据包按序到达,并支持选择性重传,只重传丢失的数据包。


•灵活性: KCP 协议提供丰富的配置选项,可以根据应用场景调整参数,例如延迟、吞吐量和可靠性之间的权衡。


KCP 协议的工作原理


KCP 协议在 UDP 的基础上实现了类似 TCP 的可靠传输机制,主要包括以下几个方面:


1.确认应答(ACK): 接收方收到数据包后,会发送 ACK 确认包给发送方,告知已成功接收。


2.超时重传: 发送方发送数据包后,会启动定时器,如果在规定时间内没有收到 ACK 确认包,则会重传该数据包。


3.流量控制: KCP 协议使用滑动窗口机制进行流量控制,防止发送方发送过多数据导致接收方缓冲区溢出。


4.拥塞控制: KCP 协议采用简单的拥塞控制算法,根据网络状况调整发送速率,避免网络拥塞。


KCP 协议的应用场景


KCP 协议凭借其低延迟、高吞吐量和可靠性的特点,广泛应用于各种实时性要求较高的场景,例如:


•移动场景: KCP 协议可以降低移动场景延迟,提高移动应用流畅度,为玩家提供更好的移动场景体验。(王者荣耀,机器人实时控制)


•视频会议: KCP 协议可以减少视频卡顿和延迟,保证视频会议的流畅进行。


•在线直播: KCP 协议可以降低直播延迟,提高直播的实时性和互动性。


•物联网: KCP 协议可以应用于物联网设备之间的数据传输,提高数据传输的效率和可靠性。



KCP 协议的优缺点


优点:


•低延迟


•高吞吐量


•可靠性高


•灵活可配置


缺点:


•实现复杂度高于 UDP


•需要额外的带宽开销


•对网络抖动敏感


四、如何使用

https://github.com/xtaci/kcptun


// 初始化 kcp对象,conv为一个表示会话编号的整数,和tcp的 conv一样,通信双// 方需保证 conv相同,相互的数据包才能够被认可,user是一个给回调函数的指针ikcpcb *kcp = ikcp_create(conv, user);
复制代码


   // KCP的下层协议输出函数,KCP需要发送数据时会调用它// buf/len 表示缓存和长度// user指针为 kcp对象创建时传入的值,用于区别多个 KCP对象int udp_output(const char *buf, int len, ikcpcb *kcp, void *user){  ....}// 设置回调函数kcp->output = udp_output;
复制代码


// 以一定频率调用 ikcp_update来更新 kcp状态,并且传入当前时钟(毫秒单位)// 如 10ms调用一次,或用 ikcp_check确定下次调用 update的时间不必每次调用ikcp_update(kcp, millisec);
复制代码


// 收到一个下层数据包(比如UDP包)时需要调用:ikcp_input(kcp, received_udp_packet, received_udp_size);
复制代码

五、总结

针对移动场景下,特别是到服务器的延迟无法稳定在 2ms 内,消息收发 RTT 无法一直稳定在 3ms 的情况下。


均可以引入 KCP 替换 TCP,实现 1RTT 消息收发。缩短用户测 app 的响应时间


目前已经引入 KCP 优化用户体验的商业如下


•原神:米哈游的《原神》使用 KCP 降低游戏消息的传输耗时,提升操作的体验。


•SpatialOS: 大型多人分布式游戏服务端引擎,BigWorld 的后继者,使用 KCP 加速数据传输。


•西山居:使用 KCP 进行游戏数据加速。


•CC:网易 CC 使用 kcp 加速视频推流,有效提高流畅性


•BOBO:网易 BOBO 使用 kcp 加速主播推流


•UU:网易 UU 加速器使用 KCP/KCPTUN 经行远程传输加速。


•阿里云:阿里云的视频传输加速服务 GRTN 使用 KCP 进行音视频数据传输优化,动态加速产品也使用 KCP。




通过牺牲单次传输 3~8%的额外带宽换取延迟稳定性,优化消息丢包。


介于篇幅限制,将会在下篇内容中。通过循环发送 500 条消息队列的情况下。分别测试 tcp,kcp 在不同网络状况下的性能表现。

发布于: 2025-09-02阅读数: 2
用户头像

拥抱技术,与开发者携手创造未来! 2018-11-20 加入

我们将持续为人工智能、大数据、云计算、物联网等相关领域的开发者,提供技术干货、行业技术内容、技术落地实践等文章内容。京东云开发者社区官方网站【https://developer.jdcloud.com/】,欢迎大家来玩

评论

发布
暂无评论
KCP协议应用详解:为速度而生的可靠传输协议_京东科技开发者_InfoQ写作社区