KCP源码解析系列(一)KCP协议介绍

news2024/9/23 17:22:55

一、什么是KCP

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

1.1 代码仓库

https://github.com/skywind3000/kcp

1.2 KCP在网络协议中的位置

在这里插入图片描述

二、KCP协议特点

kcp 是一个快速可靠ARQ协议,相比于tcp,以 10%-20% 带宽浪费的代价换取了快 30%-40% 的传输速度。kcp 可以看做应用层协议,底层采用 udp 传输。

2.1 RTO不翻倍

RTO(Retransmission TimeOut),重传超时时间。TCP的RTO是指数翻倍的,当网络比较差的时候,指数延长RTO时间。因为TCP是大公无私的,如果发现网络状况持续较差,就会放慢自己的发送速度。而KCP就比较自私,网络比较差了基本还是照常发。

tcp x 2,kcp x 1.5,提高传输速度

2.2 选择重传

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

2.3 快速重传

  • 超时重传:超过规定的时间 RTO 则重传

  • 快速重传:收到fastresend个冗余ack,不去等待RTO ,直接重传

2.4 非延迟ACK

TCP为了充分利用带宽,延迟发送ACK,RTT时间比较大,演唱了丢包时的判断过程。而KCP的ACK是否延迟发送可以调节。

在这里插入图片描述

在这里插入图片描述

2.4 UNA vs ACK + UNA

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

2.5 非退让流控

KCP(Kernel Congestion Protocol)中的非退让流控是其流控制机制的一个特点。
在传统的 TCP 协议中,当检测到网络拥塞时,会采取比较保守的退让策略,例如降低发送窗口大小以减少数据发送量。
而 KCP 的非退让流控相对更积极和激进。它不会像 TCP 那样轻易地大幅度降低发送速率,而是会在一定程度上保持较高的发送速度,并通过快速的重传和窗口调整机制来适应网络状况。
这种非退让的流控方式在一些对延迟和实时性要求较高的场景中,可能会有更好的性能表现,但也需要更精细的参数配置和对网络环境的准确判断,以避免过度占用网络资源导致拥塞加剧。

三、KCP基本使用

kcp的使用非常的简单,基本和socket差不多。

3.1 初始化

ikcpcb *kcp = ikcp_create(conv, user);
// 示例中,conv 是会话编号,通信双方需要保证conv相同,user 是用户自定义数据,可以用于在回调函数中传递上下文

3.2 设置发送回调

//kcp协议的输出函数,当kcp需要发送消息的时候,需要调用它
static int on_kcp_output(const char *buf, int len, ikcpcb *kcp, void *user_data){
   ......
}

kcp->output = on_kcp_output;

3.3 循环调用ikcp_update

ikcp_update是整个kcp事件驱动的核心,kcp数据的发送和接收都需要ikcp_update来完成。

    // 主循环
    while (true) {
        IUINT32 current = iclock();
        if (current >= nextUpdateTS) {
            ikcp_update(kcp, current);
            nextUpdateTS = ikcp_check(kcp, current); // 确定下次调用时间
        }

        // 计算到下次`ikcp_update`的时间
        IINT32 sleepTime = nextUpdateTS - iclock();
        if (sleepTime > 0) {
            usleep(sleepTime * 1000);  // 把睡眠时间转换为微秒
        } else {
            // 当 sleepTime <= 0 时,确保继续循环以避免错过更新时机
            usleep(1000); // 产生小的延迟,让出 CPU 资源
        }

        // 可以在这里处理其他网络事件,如接收数据包、发送数据
        // 例如:
        // recvData();
        // sendData();
    }

3.4 输入数据包

当udp收到数据包时,通过ikcp_input输入给kcp协议

ikcp_input(kcp, buffer, len);

3.5 收发数据

ikcp_send(kcp, buffer, len);
int len = ikcp_recv(kcp, buffer, sizeof(buffer));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2034027.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux环境安装Docker Engine并打包部署Java项目

文章目录 1、卸载老版本2、配置docker仓库3、安装最新版docker4、启动docker启动重启开机启动停止查看状态&#xff1a;已经启动查看状态&#xff1a;没有启动 5、查看版本6、运行hello world测试7、配置镜像8、使用docker安装一个应用9、其他命令查看运行的docker应用查看容器…

【网络ping】无法ping通电脑 服务器失败是什么原因

【网络ping】无法ping通电脑 服务器失败是什么原因 转载&#xff1a; https://www.lsjlt.com/ask/show/show.php?id80772631782 点击此处 查看博文《无法ping通的原因》 一、无法ping 通的原因 网络连接问题&#xff1a;首先需要检查网络连接是否正常。可以尝试通过ping其他…

全国首个数据要素人才标准,亿信华辰携76家单位共同起草

在数字化浪潮汹涌的今天&#xff0c;数据已跃升为社会经济发展的核心引擎。如何精准、高效地评估数据要素领域人才的专业能力&#xff0c;成为了亟待解决的关键议题。亿信华辰积极响应国家战略布局&#xff0c;依托自身在大数据管理与应用领域的深厚底蕴&#xff0c;携手业界76…

阿里推出视频 AI 生成式框架 Tora,通过轨迹生成视频

在科技高速发展的今天&#xff0c;AI 已经开始融入人们的生活&#xff0c;就在不久前阿里集团推出了一款可以生成视频的 AI 框架 Tora&#xff0c;这是一款可以面向轨迹的 DiT 框架&#xff0c;它可以结合文本、视觉以及轨迹生成视频。 Tora 之前有可以生成视频的模型也就是扩…

Docker数据管理和网络管理

文章目录 一、Docker数据管理Docker容器的分层哪些数据需要持久化容器数据持久保存方式数据卷&#xff08;data volume&#xff09;数据卷的使用场景数据卷的特点数据卷使用方法实际例子 二、网络管理Docker安装完成后默认的网络设置创建容器后的网络配置修改默认网络设置容器名…

vue3前端开发-小兔鲜-购物车的列表渲染和删除及统计计算

vue3前端开发-小兔鲜-购物车的列表渲染和删除及统计计算&#xff01;这一次&#xff0c;完成列表的渲染和统计计算的内容&#xff0c;比如&#xff0c;统计购物车内有多少货物的数量&#xff0c;及商品的总价格。 <script setup> import { useCartStore } from /stores/c…

RPA财务机器人是什么,RPA的具体应用场景有哪些?| 实在RPA研究

越来越多的人工智能及超自动化技术在企业财务工作中得以普及应用&#xff0c;以提升财务工作效率&#xff0c;促进财务部门实现全面数字化转型。 RPA财务机器人是什么&#xff1f; RPA&#xff0c;即机器人流程自动化&#xff08;Robotic Process Automation&#xff09;&#…

【方案合集】园区数据治理解决方案(PPT原件)

1、园区大数据治理综述 2、园区大数据治理总体架构 3、园区大数据治理演进路线 4、园区大数据治理建设实施 软件全套资料部分文档清单&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产品需求规格说明书&#xff0c;需求调研计划…

大模型的当前和未来

自2022年年底ChatGPT打响大模型热潮第一枪&#xff0c;至今已有一年半多的时间&#xff0c;大模型持续受到业界高度关注。大模型当前发展情况如何&#xff0c;未来又将如何演进发展&#xff1f; 大模型入门 1.什么是大模型、超大模型和Foundation Model&#xff1f; 大模型**…

『 Linux 』网络基础(二)

文章目录 数据在不同层之间的名称数据的跨网络传输端口号TCP协议与UDP协议网络字节序套接字编程的种类 数据在不同层之间的名称 以TCP/IP模型为例,数据在不同层之间有不同名称; 应用层(Applicant Layer) 数据名称一般为 消息(Message),请求/响应(Request/Response); 在这一层…

图像处理中的一些知识点详解

目录 Sobel算子的详细由来以及scharr算子laplace算子的由来 Sobel算子的详细由来以及scharr算子 具体解释可以参考&#xff1a;这篇知乎的前两个回答&#xff0c;尤其第二个回答。 补充&#xff1a;这里的梯度计算使用的是前向差分和后向差分相结合的中心差分思想&#xff08;…

看看月薪3W的电商运营,怎么做数据分析!

作为电商运营的你&#xff0c;得学会分析数据才是真正学会运营。其实不是数据分析太难&#xff0c;而是你没有找对方法&#xff01; 首先&#xff0c;从分析框架方面来看&#xff0c;可以分为【店铺整体、爆款单品、竞品店铺、推广数据、行业大盘】5个维度。从这些维度考虑&am…

【Linux系列】sshpass使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Qt自定义TreeWidget,实现展开折叠按钮在右侧,且一条竖直线上对齐

效果如下&#xff1a; 图片随便找的&#xff0c;可能需要调下样式&#xff0c;代码复制可用&#xff0c;留给有需要的人。 #ifndef CustomTreeWidget_h__ #define CustomTreeWidget_h__#include <QTreeWidget> #include <QPushButton>class CCustomTreeWidget : p…

【CTF | WEB】001、攻防世界WEB题目之backup

文章目录 backup题目描述:解题思路&#xff1a;解题过程&#xff1a; backup 题目描述: X老师忘记删除备份文件&#xff0c;他派小宁同学去把备份文件找出来,一起来帮小宁同学吧&#xff01; 进入题目后显示&#xff1a; 解题思路&#xff1a; 在进行网站安全检查时&#xf…

北大和鹏城实验室联合推出的图像视频统一多模态大模型Chat-UniVi(CVPR 2024)

Chat-UniVi: Unified Visual Representation Empowers Large Language Models with Image and Video Understanding 论文信息 paper&#xff1a;CVPR 2024 code&#xff1a;https://github.com/PKU-YuanGroup/Chat-UniVi 训练130亿大模型仅3天&#xff0c;北大提出Chat-UniVi…

实战|uniapp模仿微信实现发送位置消息,解决滚动页面地图层级冲突

前言 在即时通讯应用中&#xff0c;虽然发送位置信息不是核心功能&#xff0c;但在特定场景下&#xff0c;这个功能仍然非常有用。 本文将介绍如何在 uniapp 中实现位置信息的发送和展示&#xff0c;特别是在遇到地图层级问题时的解决方案。 以下内容均基于 uniapp 打包 App …

puppeteersharp爬取网页数据

官网 https://github.com/hardkoded/puppeteer-sharp 安装 创建控制台项目&#xff0c;安装PuppeteerSharp 18.1.0 编写代码 安装chrome async static Task Main(string[] args) {//如果Chromium不存在则先下载var browserFetcher new BrowserFetcher();//获取安装的浏览…

redis面试(十三)公平锁排队代码剖析

我们来看一下第二种redis分布式锁 第一种锁是可重入锁&#xff0c;非公平可重入锁&#xff0c;所谓的非公平可重入锁是什么意思呢&#xff1f;胡乱的争抢&#xff0c;根本没有任何公平性和顺序性可言 第二种锁&#xff0c;可重入锁&#xff0c;公平锁 通过公平锁&#xff0c…

haproxy七层代理总结

一、HAProxy概念 1.1 什么是HAProxy&#xff1f; HAProxy是一款开源、高性能的负载均衡器和代理服务器&#xff0c;专为TCP和HTTP应用而设计。它可以将客户端的请求分发到多台后端服务器&#xff0c;从而提高应用的可用性和性能。HAProxy支持多种负载均衡算法和健康检查机制&a…