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

KCP源码解析系列(二)KCP协议结构体

一、KCP协议包

1.1 kcp协议包

kcp中只有一种数据包,不管是数据还是控制信息,都用这个数据包来表示

0               4   5   6       8 (BYTE)
+---------------+---+---+-------+
|     conv      |cmd|frg|  wnd  |
+---------------+---+---+-------+   8
|     ts        |     sn        |
+---------------+---------------+  16
|     una       |     len       |
+---------------+---------------+  24
|                               |
|        DATA (optional)        |
|                               |
+-------------------------------+
  1. conv (4 bytes): 会话号,用于区分不同的会话。由于kcp不处理握手,可以通过两端

  2. cmd (1 byte): 命令类型,可能的命令类型包括:

    • IKCP_CMD_PUSH(数据包)

    • IKCP_CMD_ACK(确认包)

    • IKCP_CMD_WASK(窗口探测包,请求对方告知窗口大小)

    • IKCP_CMD_WINS(窗口大小通告包,告知对方窗口大小)

  3. frg (1 byte): 分片标识,表示数据是否被分片及其序号。对于不分片的数据包,该值为 0。

  4. wnd (2 bytes): 窗口大小,用于流量控制。

  5. ts (4 bytes): 时间戳,用于计算往返时间(RTT)以及重传超时(RTO)。

  6. sn (4 bytes): 序号,用于数据包排序和确认。

  7. una (4 bytes): 未确认的序号,用于流量控制。

  8. len (4 bytes): 数据部分的长度。

1.2 kcp源码IKCPSEG结构体

//=====================================================================
// SEGMENT
//=====================================================================
struct IKCPSEG
{struct IQUEUEHEAD node;//链表节点,结构体类型 IQUEUEHEAD,用于把该分段加入到发送或接收队列的链表中。IUINT32 conv;IUINT32 cmd;IUINT32 frg;IUINT32 wnd;IUINT32 ts;IUINT32 sn;IUINT32 una;IUINT32 len;IUINT32 resendts;//重传时间戳,32 位整数,表示该分段下一次进行重传的时间戳。IUINT32 rto;//重传超时时间,32 位整数,表示该分段的重传超时时间。根据 ACK 的 RTT 值调整。IUINT32 fastack;//快速重传计数,32 位整数,表示该分段被其他数据包跳过的次数,用于快速重传机制。IUINT32 xmit;//传输次数,32 位整数,表示该分段已被发送的次数。char data[1];
};

二、IKCPCB

IKCPCB 结构体是 KCP 协议中控制块的核心数据结构,包含了连接状态、传输参数、缓存和控制信息等。这是整个 KCP 协议运作的核心,用于管理连接的各个方面。下面是对每个字段的详细解释,

看不懂没关系,后边会在流程中解释。

struct IKCPCB {IUINT32 conv;              // 会话 ID,用于区分不同的连接IUINT32 mtu;               // 最大传输单元大小,指网络层能够传输的最大数据包大小IUINT32 mss;               // 最大分段大小,为 MTU 减去固定的 KCP 头部大小IUINT32 state;             // 连接状态IUINT32 snd_una;           // 未确认的发送序号IUINT32 snd_nxt;           // 下一个发送序号IUINT32 rcv_nxt;           // 下一个接收序号IUINT32 ts_recent;         // 最近的时间戳IUINT32 ts_lastack;        // 最后一个确认包的时间戳IUINT32 ssthresh;          // 慢启动门限IINT32 rx_rttval;          // RTT 波动值IINT32 rx_srtt;            // 平滑后的 RTT 值IINT32 rx_rto;             // 重传超时时间IINT32 rx_minrto;          // 最小重传超时时间IUINT32 ff_recovery_point; // 快速恢复点IUINT32 snd_wnd;           // 发送窗口大小IUINT32 rcv_wnd;           // 接收窗口大小IUINT32 rmt_wnd;           // 远端窗口大小IUINT32 cwnd;              // 拥塞窗口大小IUINT32 probe;             // 探测变量IUINT32 current;           // 当前时间IUINT32 interval;          // 内部工作刷新间隔IUINT32 ts_flush;          // 下次刷新时间戳IUINT32 xmit;              // 传输次数IUINT32 next_send;         // 下一个发送时间IUINT32 nrcv_buf;          // 接收缓冲区大小IUINT32 nsnd_buf;          // 发送缓冲区大小IUINT32 nrcv_que;          // 接收队列大小IUINT32 nsnd_que;          // 发送队列大小IUINT32 wait_snd_bytes;    // 等待发送字节数IUINT32 wait_rcv_bytes;    // 等待接收字节数IUINT32 nodelay;           // 是否启用无延迟模式IUINT32 updated;           // 是否已更新IUINT32 ts_probe;          // 窗口探测时间IUINT32 probe_wait;        // 窗口探测等待时间IUINT32 dead_link;         // 最大重传次数,超过此次数认为连接失效IUINT32 incr;              // 拥塞窗口增加量IUINT32 ts_wait_ack;       // 等待 ACK 的时间戳IUINT32 flag_wait_ack;     // 等待 ACK 的标志IUINT32 ts_echo;           // ECHO 的时间戳pthread_mutex_t send_lock; // 发送锁,用于多线程环境struct IQUEUEHEAD snd_queue;  // 发送队列pthread_mutex_t recv_lock; // 接收锁,用于多线程环境struct IQUEUEHEAD rcv_queue;  // 接收队列struct IQUEUEHEAD snd_buf;    // 发送缓冲区struct IQUEUEHEAD rcv_buf;    // 接收缓冲区IUINT32 *acklist;          // 存储待发送的 ACK 列表IUINT32 ackcount;          // ACK 的数量IUINT32 ts_sack;           // SACK 时间戳IUINT32 ackblock;          // ACK 列表的大小(块大小)void *user;                // 用户数据void *user_send_queue;     // 用户发送队列void *user_recv_queue;     // 用户接收队列char *buffer;              // 缓冲区int fastresend;            // 快速重传标志int nocwnd;                // 关闭拥塞控制标志int stream;                // 流模式标志int logmask;               // 日志掩码int delay_ack;             // 延迟 ACK 处理void *ca_priv;             // 拥塞避免私用数据int (*output)(const char *buf, int len, struct IKCPCB *kcp, void *user); // 数据输出回调void (*writelog)(const char *log, struct IKCPCB *kcp, void *user);      // 日志写入回调int (*process_pkt)(void *user, int length, const char *input, char *output); // 数据包处理回调
};

相关文章:

KCP源码解析系列(二)KCP协议结构体

一、KCP协议包 1.1 kcp协议包 kcp中只有一种数据包,不管是数据还是控制信息,都用这个数据包来表示 0 4 5 6 8 (BYTE) ---------------------------- | conv |cmd|frg| wnd | ---------------------------- 8 | …...

微软运行库全集合:一站式解决兼容性问题

开发者在部署应用程序时经常遇到因缺少运行库而引发的兼容性问题。为了解决这一问题,电脑天空推荐微软常用运行库合集,一个集成了微软多个关键运行库组件的软件包。 📚 包含组件概览: Visual Basic Virtual Machine:…...

【 亿邦动力网-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞 …...

算法笔记|Day26贪心算法IV

算法笔记|Day26贪心算法IV ☆☆☆☆☆leetcode 452. 用最少数量的箭引爆气球题目分析代码 ☆☆☆☆☆leetcode 435. 无重叠区间题目分析代码 ☆☆☆☆☆leetcode 763.划分字母区间题目分析代码 ☆☆☆☆☆leetcode 452. 用最少数量的箭引爆气球 题目链接:leetcode …...

CVPR2023《DNF: Decouple and Feedback Network for Seeing in the Dark》暗光图像增强论文阅读笔记

相关链接 论文链接 https://openaccess.thecvf.com/content/CVPR2023/papers/Jin_DNF_Decouple_and_Feedback_Network_for_Seeing_in_the_Dark_CVPR_2023_paper.pdf 代码链接 https://github.com/Srameo/DNF 摘要 RAW数据的独特属性在低光照图像增强方面展现出巨大潜力。…...

大厂进阶七:React状态管理全解析

前言: React 中用于状态管理的hook及库有:useState、useReducer、useContext、useReducer useContext和一些第三方的库如redux、mobx等。 1、useState 单一组件某个具体状态 2、useReducer 单一组件中多个状态管理,策略分发机制统一管理…...

【ocr识别003】flask+paddleocr+bootstrap搭建OCR文本推理WEB服务

1.欢迎点赞、关注、批评、指正,互三走起来,小手动起来! 2.了解、学习OCR相关技术知识领域,结合日常的场景进行测试、总结。如本文总结的flaskpaddleocrbootstrap搭建OCR文本推理WEB服务应用示例场景。 文章目录 1.代码结构2.效果演…...

从零开始搭建 LVS 高性能集群 (DR模式)

从零开始搭建 LVS 高性能集群 (DR模式) 架构 本设计方案采用三台服务器构建集群,使用Linux Virtual Server (LVS) 作为负载均衡器,运行在直接路由 (DR) 模式下。集群中的每一台服务器都将运行相同的服务,以实现 高可用…...

Linux环境开发工具【yum与vim】

🌈个人主页:Yui_ 🌈Linux专栏:Linux 🌈C语言笔记专栏:C语言笔记 🌈数据结构专栏:数据结构 文章目录 1.Linux软件包管理器yum1.1 快速使用yum 2. Linux编辑器-vim的使用2.1 vim的基本…...

laravel GuzzleHttp Client 无法获取返回的错误信息

Client发送一些请求,当返回状态不是200的时候,无法获取完整错误信息 $client new Client([base_uri > $this->getUri()./order/aaaaaa,timeout > 30,verify > false]);try {$response $client->request(POST, , [headers > [Lang&g…...

XMOS 多路音频解码器

当谈及高性能音频解码器,XMOS 是一个不容忽视的名字。作为音频解决方案领域的领军者,XMOS 的多路音频解码器在音频处理技术中扮演着至关重要的角色。下面我们一起深入探讨 XMOS 多路音频解码器去了解这一技术的魅力。 设计背景:追求音频极致…...

XSS小游戏(题目+解析)

xss题目练习地址&#xff1a; xss小游戏 游戏界面 一、Ma Spaghet! 我将题目要求进行翻译: 题目的主要要求就是&#xff1a;弹出一个&#xff08;1337&#xff09;的弹窗 开始解题&#xff1a; Let’s Go! 首先&#xff0c;传个参数看看 发现参数直接显示在了 < h2 >…...

《Redis核心技术与实战》学习笔记4——AOF日志:宕机了,Redis如何避免数据丢失?

文章目录 AOF 日志是如何实现的&#xff1f;三种写回策略 日志文件太大了怎么办&#xff1f;AOF 重写会阻塞吗?小结 大家好&#xff0c;我是大白。 如果有人问你&#xff1a;“你会把 Redis 用在什么业务场景下&#xff1f;”我想你大概率会说&#xff1a;“我会把它当作缓存使…...

NextJs - 服务端/客户端组件之架构多样性设计

NextJs - 服务端/客户端组件之架构多样性设计 前言一. 架构设计1.1 SSR流式渲染常见错误设计之 - 根页面同步阻塞1.2 架构设计之 - 客户端组件依赖于服务端组件数据① 使用 Redux 完成数据共享 1.3 架构设计之 - 单页内的分步骤跳转① 如何做到服务端组件和客户端组件之间的切换…...

使用 Python 进行 PDF 文件加密

使用 Python 解密加密的 PDF 文件-CSDN博客定义一个名为的函数&#xff0c;该函数接受三个参数&#xff1a;输入的加密 PDF 文件路径input_pdf、输出的解密 PDF 文件路径output_pdf和密码password。https://blog.csdn.net/qq_45519030/article/details/141256661 在数字化时代…...

Spring Boot集成RabbitMQ

目录 1.RabbitMQ简介2.添加依赖3.配置RabbitMQ连接4.DirectExchange4.1 消费者4.2 生产者4.3 测试4.4 一个交换机对多个队列4.5 一个队列对多个消费者 5.FanoutExchange5.1 消费者5.2 生产者5.3 测试 6.TopicExchange6.1 消费者6.2 生产者 1.RabbitMQ简介 RabbitMQ是一个由Erl…...

OLED屏幕制造工艺流程

OLED屏幕制造工艺流程是一个复杂且精细的过程&#xff0c;涉及多个关键步骤以确保最终的显示效果和性能。以下是OLED屏幕制造工艺流程的主要步骤&#xff1a; 1. 衬底制作与准备 材料选择&#xff1a;OLED器件需要一个透明的导电衬底&#xff0c;通常使用玻璃或塑料材料。 清…...

knowLedge-VueCLI项目中环境变量的定义与使用

1. env 1.1简介 在 Vue CLI 创建的项目中&#xff0c;你可以通过 .env 文件来定义环境变量。Vue CLI 支持多种 .env 文件&#xff0c;它们根据文件名中的前缀来决定何时加载和使用这些环境变量。 以下是一些常见的 .env 文件及其用途&#xff1a; .env&#xff1a;在任何环境…...

【C#】 接口 继承

简介 继承是面向对象编程的核心特性之一&#xff0c;它允许我们创建一个类&#xff08;称为子类&#xff09;来继承另一个类&#xff08;称为基类&#xff09;的属性和方法。 作用 这样&#xff0c;我们可以重用代码&#xff0c;减少重复&#xff0c;并使我们的代码更加模块…...

Self-Supervised Learning(李宏毅老师系列)

自学参考&#xff1a; BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding BERT 论文逐段精读 视频课 课件资料 笔记 一、概述 自监督学习模型与芝麻街~ 参数量 ELMO&#xff1a;94MBERT&#xff1a;340MGPT-2&#xff1a;1542MMegatron&…...

Kazumi WebDAV同步功能详解:实现跨设备番剧数据互通的无缝体验

Kazumi WebDAV同步功能详解&#xff1a;实现跨设备番剧数据互通的无缝体验 【免费下载链接】Kazumi 基于自定义规则的番剧采集APP&#xff0c;支持流媒体在线观看&#xff0c;支持弹幕&#xff0c;支持实时超分辨率。 项目地址: https://gitcode.com/gh_mirrors/ka/Kazumi …...

保姆级教程:用OpenAI Whisper给视频自动生成字幕(附Python代码)

视频创作者必备&#xff1a;用Whisper打造高效字幕工作流 每次剪辑视频最头疼的就是加字幕&#xff1f;作为过来人&#xff0c;我完全理解那种对着时间轴逐帧调整的痛苦。直到发现Whisper这个神器&#xff0c;我的工作效率直接翻了三倍。今天就把这套全自动字幕生成方案完整分享…...

【ArkTS】基础语法

一、ArkTS 语言简介 ArkTS 是一种设计用于构建高性能应用的编程语言。它在继承 TypeScript 语法的基础上进行了优化,以提供更高的性能和开发效率。 许多编程语言在设计之初未考虑移动设备,导致应用运行缓慢、低效且功耗大。随着移动设备在日常生活中越来越普遍,针对移动环境…...

SDMatte多风格抠图作品集:从商品白底图到艺术创意合成

SDMatte多风格抠图作品集&#xff1a;从商品白底图到艺术创意合成 1. 开篇&#xff1a;当抠图遇上AI 还记得那些年用Photoshop一点一点抠图的痛苦经历吗&#xff1f;边缘总是处理不干净&#xff0c;头发丝永远抠不完整&#xff0c;遇到复杂背景更是让人抓狂。现在&#xff0c…...

警惕!新型U盘蠕虫伪装文档传播:实测火绒5.0查杀+防御全攻略

深度解析U盘蠕虫病毒&#xff1a;从防御到查杀的全面安全指南 1. 新型U盘蠕虫病毒的运作机制剖析 U盘蠕虫病毒近年来呈现出越来越复杂的传播方式和技术手段。这类病毒通常利用Windows系统的自动播放功能&#xff08;AutoRun.inf&#xff09;或注册表劫持技术进行传播&#xff0…...

springboot+vue基于web的汽车后市场维修保养管理系统的设计与实现

目录系统功能模块分析维修保养业务模块财务与统计模块客户端交互功能技术实现要点项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作系统功能模块分析 用户管理模块 实现用户注册、登录、权限管理&#xff08;管理员、员工、客户…...

CMake + VTK 编译

CMake VTK 编译 1下载 1 CMake下载 https://cmake.org/download/#older2 VTK 下载 https://gitlab.kitware.com/vtk/vtk/-/tags2 安装和解压缩 3 配置CMake 这一部分忘了截图 &#xff0c;可以查看这里的步骤&#xff0c;基本一致 https://blog.csdn.net/weixin_42964413/arti…...

cobalt代码覆盖率报告:提升测试质量的关键指标

cobalt代码覆盖率报告&#xff1a;提升测试质量的关键指标 【免费下载链接】cobalt best way to save what you love 项目地址: https://gitcode.com/GitHub_Trending/cob/cobalt 引言&#xff1a;为什么代码覆盖率&#xff08;Code Coverage&#xff09;至关重要 在现…...

从云中心到边缘节点,Java Runtime冷启动优化全解析,将延迟压至87ms以内

第一章&#xff1a;Java边缘运行时部署的演进与挑战随着物联网、5G和实时AI推理场景的爆发式增长&#xff0c;Java应用正加速向边缘侧迁移。然而&#xff0c;传统JVM设计面向服务器长期运行环境&#xff0c;其启动延迟高、内存占用大、冷启动慢等特性与边缘设备资源受限、事件驱…...

如何生成USearch API文档的PDF手册:快速创建可打印版本指南

如何生成USearch API文档的PDF手册&#xff1a;快速创建可打印版本指南 【免费下载链接】usearch Fastest Open-Source Search & Clustering engine for Vectors & &#x1f51c; Strings in C, C, Python, JavaScript, Rust, Java, Objective-C, Swift, C#, GoLang,…...