【网络协议】基于UDP的可靠协议:KCP

devtools/2025/3/20 16:32:49/

TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的是充分利用带宽。而 KCP是为流速设计的(单个数据包从一端发送到一端需要多少时间),以10%-20%带宽浪费的代价换取了比 TCP快30%-40%的传输速度。TCP信道是一条流速很慢,但每秒流量很大的大运河,而KCP是水流湍急的小激流。KCP有正常模式和快速模式两种,通过以下策略达到提高流速的结果:

RTO翻倍vs不翻倍:

TCP超时计算是RTOx2,这样连续丢三次包就变成RTOx8了,十分恐怖,而KCP启动快速模式后不x2,只是x1.5(实验证明1.5这个值相对比较好),提高了传输速度。

选择性重传 vs 全部重传:

TCP丢包时会全部重传从丢的那个包开始以后的数据,KCP是选择性重传,只重传真正丢失的数据包。

SACK机制,每次ACK时还返回一组标记,告知发送方哪些Segment已经发送了

快速重传:

发送端发送了1,2,3,4,5几个包,然后收到远端的ACK: 1, 3, 4, 5,当收到ACK3时,KCP知道2被跳过1次,收到ACK4时,知道2被跳过了2次,此时可以认为2号丢失,不用等超时,直接重传2号包,大大改善了丢包时的传输速度。

延迟ACK vs 非延迟ACK:

TCP为了充分利用带宽,延迟发送ACK(NODELAY都没用),这样超时计算会算出较大 RTT时间,延长了丢包时的判断过程。KCP的ACK是否延迟发送可以调节。

延迟ACK:TCP为了充分利用带宽,在一些情况下,接收方可能会收到多个数据段。在延迟发送ACK的情况下,接收方可以在一定的小时间窗口内等待或聚合多个数据段的接收,从而一次性发送一个ACK确认多个数据段。这可以减少网络中ACK报文的数量,从而降低网络拥塞。

UNA vs ACK+UNA:

ARQ模型响应有两种,UNA(此编号前所有包已收到,如TCP)和ACK(该编号包已收到),光用UNA将导致全部重传,光用ACK则丢失成本太高,以往协议都是二选其一,而 KCP协议中,除去单独的 ACK包外,所有包都有UNA信息。

非退让流控:

KCP正常模式同TCP一样使用公平退让法则,即发送窗口大小由:发送缓存大小、接收端剩余接收缓存大小、丢包退让及慢启动这四要素决定。但传送及时性要求很高的小数据时,可选择通过配置跳过后两步,仅用前两项来控制发送频率。以牺牲部分公平性及带宽利用率之代价,换取了开着BT都能流畅传输的效果。

抛弃拥塞控制,追求极致速度

TCP的拥塞控制机制(如慢启动、拥塞避免、快速重传等)是为了保证网络公平性和稳定性,但这也让TCP在丢包时表现得过于“怂”。KCP直接抛弃了这些机制,采用更激进的策略,允许用户自定义流控和拥塞控制,甚至可以不控制。这种“莽夫”式的方式让KCP在丢包时依然能快速重传,保持高吞吐量。

更小的协议头开销:

KCP的协议头比TCP更精简,减少了额外的开销。虽然这点对性能提升有限,但在高频率、小数据包场景下,积少成多也能带来一定的优势。

无连接状态,轻量级:

KCP是无连接的,不需要像TCP那样维护复杂的连接状态(如三次握手、四次挥手、滑动窗口等)。这种轻量级的设计让它更适合高频、短连接场景。


http://www.ppmy.cn/devtools/168670.html

相关文章

Python基于深度学习的多模态人脸情绪识别研究与实现

一、系统架构设计 A[数据采集] --> B[预处理模块] B --> C[特征提取] C --> D[多模态融合] D --> E[情绪分类] E --> F[系统部署] F --> G[用户界面] 二、数据准备与处理 1. 数据收集 - 视频数据:FER2013(静态图像&#xff0…

【虚幻C++笔记】打印输出的方式

目录 UE_LOGGEngine->AddOnScreenDebugMessage UE_LOG UE_LOG 宏是UnrealEngine 中用于日志记录的标准方式。它可以输出日志信息到控制台和日志文件,支持多种日志级别(如Log,Warning,Error") UE_LOG(LogCategory, LogVer…

MongoDB 更新集合名

MongoDB 更新集合名 引言 在MongoDB中,集合(Collection)是存储数据的基本单位。在实际应用中,我们可能会因为各种原因需要更改集合的名称。本文将详细介绍如何在MongoDB中更新集合名,并探讨一些相关的注意事项。 更…

【软件工程】09_软件实现、测试和维护

目录 9.1 软件实现 宏观与微观视角 软件实现的目标 软件实现的任务 9.2 软件测试基础 9.2.1 软件测试概述 定义 目的 原则 9.2.2 软件的可测试性 9.2.3 软件测试的对象 9.2.4 软件测试信息流 9.2.5 软件测试步骤 软件测试与软件开发各阶段的关系 9.3 软件测试方法…

IvorySQL 增量备份与合并增量备份功能解析

1. 概述 IvorySQL v4 引入了块级增量备份和增量备份合并功能,旨在优化数据库备份与恢复流程。通过 pg_basebackup 工具支持增量备份,显著降低了存储需求和备份时间。同时,pg_combinebackup 工具能够将多个增量备份合并为单个完整备份&#x…

【6】组合计数学习笔记

前言 关于今天发现自己连快速幂都忘记怎么写这件事 这篇博客是组合计数基础,由于大部分内容都是 6 6 6 级,所以我就给整个提高级的组合数学评了 6 6 6 级。 组合计数基础 加法原理与乘法原理 加法原理(分类计数原理)&#…

BUG日志:Maven项目启动报错(文件名或者文件扩展名过长)

Bug日志编号:[Maven-001] 标题:Windows系统下Maven项目因路径过长导致命令行执行失败 1. 问题描述 现象:执行mvn clean install时报错: The input line is too long 或 The filename or extension is too long触发条件&#xf…

函数的介绍

1.函数的概念 在C语言中也有函数的概念,有些翻译为:子程序,这种翻译更为准确。C语言的函数就是一个完成某项特定的任务的一小段代码。这段代码是有特殊的写法和调用方法的。 C语言的程序其实是有无数个小的函数组合而成的,也可以…