kcp到底是什么?
发布网友
发布时间:2024-10-22 19:48
我来回答
共1个回答
热心网友
时间:2024-10-30 09:53
对于游戏开发,尤其是MOBA(多人在线竞技)游戏,延迟是需要控制的。然而,传统的TCP(网络友好,很棒)并不利于包的实时性传输,因为它有超时重传和拥塞控制,这些在网络友好方面表现出色,但对于包的实时性,缺乏优势。因此,通常需要基于UDP实现一套自己的网络协议,以保证包的实时性和可靠性。基于UDP,网络界有许多优秀协议,如KCP。
KCP是一种网络传输协议,被视为TCP的替代品,但运行于用户空间,专注于算法实现可靠传输,其特点是牺牲带宽以降低延迟。与TCP大公无私不同,KCP专注于提高传输效率,不顾及整个网络的拥塞情况。TCP在检测到丢包时,首要考虑的是网络拥塞,减慢自身速度以避免网络恶化,而KCP则立即重新传输,不耽误事。
KCP可以理解为可靠的UDP协议。UDP是面向无连接的协议,由于其实时性较好,通常用于游戏或音视频通话中。此外,它无需提前建立连接,节省设备资源,广泛应用于嵌入式设备。在大量数据传输(如文件下载)以及DNS中,客户端请求域名对应的地址环节,使用的是UDP。注意,DNS另一部分,域名服务器节点之间的数据同步则使用TCP。
为了提高UDP的可靠性,KCP在UDP协议上封装了一层可靠性传输机制,融合了TCP的安全性(如流量控制和拥塞控制)和UDP的实时性,并具备一定的灵活性(如超时重传、ACK机制等)。KCP协议是一个代表。
TCP的特点是可靠传输、流量控制、拥塞控制以及面向连接,而KCP基本可以调整这些参数,且无需建立或关闭连接的过程。
在KCP的协议头部中,包含有连接号、命令字、分片、接收窗口大小、时间戳、序列号、下一个可接收的序列号以及数据长度等关键信息。
KCP的流程包括数据接收和发送。数据接收时,数据被暂存于缓存中,并按序列号排序。发送时,数据先被放入缓存,随后进行分片以适应MTU(最大传输单元),再根据流量控制和拥塞控制进行发送。重要的是,不断调用ikcp_send()方法,数据会累积在snd_queue中,而对方的数据则会累积在对方的rcv_buf中。
KCP的确认机制分为una和单独的ACK。Una机制用于确认una之前的包全部收到,而单独的ACK机制则对特定的包进行确认。KCP优先检测una。KCP的重传机制灵活,允许自定义超时重传时间,并实现快速重传,当特定数量的数据包收到ACK时,即便未到该包的RTO(重传时间),也会立即重传。此外,KCP支持延迟ACK、非退让流控等特性,提高了传输效率。
KCP的实现原理是简单的算法实现,无需涉及底层调用。用户只需要在UDP系统调用时注册KCP回调函数即可使用。KCP可以理解为一个应用层协议。
对比TCP,KCP为了实现选择性重传(ARQ),维护接收窗口(滑动窗口)。收到有序数据会将其放入接收队列,以供应用层消费。若存在包丢失,会检查并根据设置的次数选择重传对应的包。
KCP使用数据包字段实现稳定通信,针对不同点进行优化。通过una和ACK机制实现选择性重传。发送逻辑涉及将数据分片放入发送队列,最终通过回调函数驱动实际数据发送。接收逻辑包括解析头部数据,解析ACK和UNA指令,以及处理数据报文。
KCP实现原理中,发送逻辑包括发送ACK、窗口探测、窗口大小调整、发送队列管理及重传逻辑等。接收逻辑处理数据包,解析头部信息,更新窗口大小,处理ACK和UNA指令等。这些操作确保了数据的稳定传输。
KCP的优点在于没有使用系统调用接口,无需建立/关闭连接(仅从KCP本身来看),并且可配置的参数较多。然而,学习成本相对较高,且可能受到某些运营商对UDP的*。
总的来说,KCP在丢包率高的网络环境下表现出色,特别是在对实时性要求较高的程序中,如LOL等。它通过算法优化实现了与TCP相似的功能,但在实时性和传输效率上提供了额外的优势,适用于游戏帧同步或数据实时传输领域。