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

一、概述

在当今互联网应用中,实时性和流畅性至关重要,尤其是在网络游戏、视频会议和在线直播等场景中。传统的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

•需要额外的带宽开销

•对网络抖动敏感

四、如何使用

github.com/xtaci/kcptu...

scss 复制代码
// 初始化 kcp对象,conv为一个表示会话编号的整数,和tcp的 conv一样,通信双
// 方需保证 conv相同,相互的数据包才能够被认可,user是一个给回调函数的指针
ikcpcb *kcp = ikcp_create(conv, user);
arduino 复制代码
   // KCP的下层协议输出函数,KCP需要发送数据时会调用它
// buf/len 表示缓存和长度
// user指针为 kcp对象创建时传入的值,用于区别多个 KCP对象
int udp_output(const char *buf, int len, ikcpcb *kcp, void *user)
{
  ....
}
// 设置回调函数
kcp->output = udp_output;
scss 复制代码
// 以一定频率调用 ikcp_update来更新 kcp状态,并且传入当前时钟(毫秒单位)
// 如 10ms调用一次,或用 ikcp_check确定下次调用 update的时间不必每次调用
ikcp_update(kcp, millisec);
scss 复制代码
// 收到一个下层数据包(比如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在不同网络状况下的性能表现。

相关推荐
唐天一5 小时前
Rust面向对象:简单总结impl ... for ... 结构在 Rust 中两种主要用途
后端
唐天一5 小时前
Rust语法之面向对象编程
后端
brzhang5 小时前
Google 浏览器出了一个超级好用的功能,Gemini 原生支持,帮你解决性能问题
前端·后端·架构
洛卡卡了6 小时前
适配私有化部署,我手写了套支持离线验证的 License 授权系统
java·后端·架构
SimonKing6 小时前
亲测有效!分享一个稳定访问GitHub,快速下载资源的实用技巧
java·后端·程序员
这里有鱼汤6 小时前
量化小白必看|MiniQMT踩坑记:想做实盘这些知识请你一定要掌握
后端·python
TechLee6 小时前
Laravel 权限控制新选择:使用 Laravel-authz 集成 PHP-Casbin
后端·php
青梅主码6 小时前
量子位智库最新发布《 AI Coding 玩家图谱》: AI 编码玩家图谱全解析
后端
武子康6 小时前
大数据-85 Spark Action 操作详解:从 Collect 到存储的全景解析
大数据·后端·spark