当前位置: 首页 > news >正文

KCP协议(一)

kcp官网:skywind3000/kcp: ⚡️ KCP - A Fast and Reliable ARQ Protocol (github.com)

1 什么是KCP协议

KCP是一个快速可靠协议,能以比 TCP 浪费 10%-20% 的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。

这里可以理解为KCP是一个水流更快,但流量略有降低的小溪。

KCP协议是一种基于UDP的可靠传输协议,因此无需建立连接,可以即时发送,而不需要等待确认,同时,它可以根据网络状况自行调整发送速率,更适用于实时通信、在线游戏、流媒体传输等场景。

2 技术特性

2.1 RTO翻倍vs不翻倍

RTO(Retransmission TimeOut) 超时重传

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

TCP超时重传的间隔会相差越来越大,而KCP的间隔更合理一点。

由于TCP协议是在内核协议栈中确定的,因此超时翻倍的策略不可更改,而KCP协议是在用户层实现的,可以自行定制重传策略。

2.2 选择性重传 vs 全部重传

TCP默认使用的是累积确认的方式,丢包时会全部重传从丢的那个包开始以后的数据。TCP中也有一个选择确认(SACK)选项,可以只重传丢失的数据。

KCP是选择性重传,只重传真正丢失的数据包,使用快速重传机制。

2.3 延迟ACK vs 非延迟ACK

TCP会采用ACK延迟确认机制,可以对多个TCP包的ACK进行合并。

延迟确认超时计算会算出较大 RTT时间,延长了丢包时的判断过程。

KCP的ACK是否延迟发送可以调节。

2.4 UNA vs ACK+UNA

UNA:Unacknowledged

UNA(此编号前所有包已收到,如TCP)和ACK(该编号包已收到)

仅用 UNA: 如果只使用 UNA,那么当网络状况不佳时,所有数据包都可能被重传,导致效率低下
仅用 ACK: 如果只使用 ACK,则每次都需要等待确认,而确认过程可能会比较耗时,导致传输延迟

以往协议都是二选其一,而 KCP协议中,除去单独的 ACK包外,所有包都有UNA信息

2.5 非退让流控

KCP正常模式同TCP一样使用公平退让法则,即发送窗口大小由:发送缓存大小、接收端剩余接收缓存大小、丢包退让及慢启动这四要素决定。

但传送及时性要求很高的小数据时,可选择通过配置跳过后两步,仅用前两项来控制发送频率。以牺牲部分公平性及带宽利用率之代价,换取了开着BT都能流畅传输的效果。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 如何制作微课?微课的制作方法和步骤教程,微课录制软件推荐!
  • 数据依赖,执行顺序,promise,async/await
  • 系统架构师质量属性与架构评估案例分析
  • hive sql 处理多层 json 数组
  • 用R语言运用 Shiny 包打造基于鸢尾花数据集的交互式数据可视化应用
  • 探索Delphi的图形与图像处理能力:从基础到高级应用
  • 获利能力段-新增自定义特性、特性派生增强
  • 手撕初阶数据结构之---排序
  • SpringBoot的使用的注解以及监控监控和lombok使用
  • 数据结构——循环队列
  • C#高级:通过一个遍历实体的小案例去理解反射(基础版)
  • Python之字符串的创建、索引和分片
  • 深入理解 GO 语言并发
  • 双配置视觉 Transformer 在多模态中的突破 !
  • Linux服务器:Samba配置
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • Hibernate最全面试题
  • input实现文字超出省略号功能
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • java第三方包学习之lombok
  • java概述
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Linux gpio口使用方法
  • 动态魔术使用DBMS_SQL
  • 对象引论
  • 仿天猫超市收藏抛物线动画工具库
  • 基于 Babel 的 npm 包最小化设置
  • 简单易用的leetcode开发测试工具(npm)
  • 排序算法之--选择排序
  • 实现菜单下拉伸展折叠效果demo
  • 使用parted解决大于2T的磁盘分区
  • 微信支付JSAPI,实测!终极方案
  • 我建了一个叫Hello World的项目
  • 一天一个设计模式之JS实现——适配器模式
  • 智能网联汽车信息安全
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • ​MySQL主从复制一致性检测
  • (07)Hive——窗口函数详解
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (面试必看!)锁策略
  • (算法)Game
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (原)Matlab的svmtrain和svmclassify
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .naturalWidth 和naturalHeight属性,
  • .Net 4.0并行库实用性演练
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .net的socket示例
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • /bin/bash^M: bad interpreter: No such file or directory
  • /etc/fstab 只读无法修改的解决办法