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

京东云开发者
• 阅读 87

一、概述

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



二、为什么需要引入KCP

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

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

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

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



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

三、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在不同网络状况下的性能表现。

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
TCP面试题之滑动窗口原理
TCP滑动窗口作用:1.提供TCP可靠性:对发送的数据进行确认2.流量控制:窗口大小随链路变化一、TCP窗口机制TCP中窗口大小是指tcp协议一次传输多少个数据。因为TCP是一个面向连接的可靠的传输协议,既然是可靠的就需要传输的数据进行确认。TCP窗口机制有两种,一种是
Wesley13 Wesley13
3年前
TCP UDP有什么区别
前言计算机分层中的传输层,主要是负责计算机之间的数据传输,TCP和UDP都属于传输层协议。在实际开发过程中,需要根据实际需求的来选择适当的传输协议。在这里我们简单总结下TCP、UDP的特点和区别以及实际开发中如何选择。TCP和UDP的定义TCP是面向有连接,可靠的流协议。保证两端通讯主机之间
Wesley13 Wesley13
3年前
MQTT,CoAP,,LWM2M,UDP,TCP各自特点,NB
UDP用户数据报协议(UDP,UserDatagramProtocol)传输层协议1.是无连接的,即发送数据之前不需要建立连接。2.尽最大努力交付,即不保证可靠交付3.传输效率高,适用于对高速传输和实时性有较高的通信或广播通信。4.支持一对一,一对多,多对一和多对多的交互通信。TCP传输控制协议(TCP,Transmis
Stella981 Stella981
3年前
Python基础系列讲解——TCP协议的socket编程
前言我们知道TCP协议(TransmissionControlProtocol,传输控制协议)是一种面向连接的传输层通信协议,它能提供高可靠性通信,像HTTP/HTTPS等网络服务都采用TCP协议通讯。那么网络通讯方面都会涉及到socket编程,当然也包括TCP协议。Python作为一门适应于快速开发的工具,在它浩瀚的第三方库中也一定包括了s
Stella981 Stella981
3年前
LwIP应用开发笔记之五:LwIP无操作系统TCP服务器
  前面我们实现了UDP服务器及客户端以及基于其上的TFTP应用服务器。接下来我们将实现同样广泛应用的TCP协议各类应用。1、TCP简述  TCP(TransmissionControlProtocol传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC793定义。在简化的计算
Wesley13 Wesley13
3年前
Java网络编程——12.UDP
前面几章讨论了在TCP传输层协议之上运行的网络应用程序,TCP是为数据的可靠传输而设计的。用户数据报协议(UserDatagramProtocal,UDP)是在IP之上发送数据的另一种传输层协议,速度很快,但不可靠。当发送UDP数据时,无法知道数据是否会到达,也不知道数据的各个部分是否会以发送时的顺序到达。1、UDP协议类似F
Wesley13 Wesley13
3年前
TCP协议详解
  TCP协议作为基本的传输控制协议,提供了面向连接的、可靠的通信机制。由于其优越的特性,被广泛应用于网络通信中,成为了今天互联网的基石。其为了屏蔽网络底层种种复杂的因素做出了巨大的努力,同时也导致了TCP内部各种机制之间的相互作用,让初接触它的人们很难理清头绪。本文就从TCP的传输窗口这个点切入,带领大家一睹TCP实现机制的风采。1. 前言
Wesley13 Wesley13
3年前
UDP通讯方式
简介一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,它一旦把应用的程序发送给网络层之后不保留数据的备份。但是因为没有很多安全性的校验使得它的传输速率特别的快。UDP提供了无连接通信,且不对传送数据包进行可靠性保证,适合于一次传输少量数据,UDP传输的可靠性由应用层负责。所需的结构和方法\so
浅说TCP状态机制
TCP(TransmissionControlProtocol)是一种面向连接的、可靠的传输协议,常用于互联网中应用层的数据传输。在协议栈中,TCP处于传输层,负责数据的分段、传输和重组等工作,同时采用状态机制来维护连接的状态。下面我们就来详细介绍一下TCP协议栈链接跟踪的工作原理。
API 小达人 API 小达人
1年前
如何在 Eolink Apikit 中发起 TCP/UDP 文档测试
TCP/UDP是两种常用的网络传输协议。TCP协议提供可靠的连接,而UDP协议提供不可靠的连接。