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) |
| |
+-------------------------------+
-
conv (4 bytes): 会话号,用于区分不同的会话。由于kcp不处理握手,可以通过两端
-
cmd (1 byte): 命令类型,可能的命令类型包括:
-
IKCP_CMD_PUSH(数据包) -
IKCP_CMD_ACK(确认包) -
IKCP_CMD_WASK(窗口探测包,请求对方告知窗口大小) -
IKCP_CMD_WINS(窗口大小通告包,告知对方窗口大小)
-
-
frg (1 byte): 分片标识,表示数据是否被分片及其序号。对于不分片的数据包,该值为 0。
-
wnd (2 bytes): 窗口大小,用于流量控制。
-
ts (4 bytes): 时间戳,用于计算往返时间(RTT)以及重传超时(RTO)。
-
sn (4 bytes): 序号,用于数据包排序和确认。
-
una (4 bytes): 未确认的序号,用于流量控制。
-
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题目练习地址: xss小游戏 游戏界面 一、Ma Spaghet! 我将题目要求进行翻译: 题目的主要要求就是:弹出一个(1337)的弹窗 开始解题: Let’s Go! 首先,传个参数看看 发现参数直接显示在了 < h2 >…...
《Redis核心技术与实战》学习笔记4——AOF日志:宕机了,Redis如何避免数据丢失?
文章目录 AOF 日志是如何实现的?三种写回策略 日志文件太大了怎么办?AOF 重写会阻塞吗?小结 大家好,我是大白。 如果有人问你:“你会把 Redis 用在什么业务场景下?”我想你大概率会说:“我会把它当作缓存使…...
NextJs - 服务端/客户端组件之架构多样性设计
NextJs - 服务端/客户端组件之架构多样性设计 前言一. 架构设计1.1 SSR流式渲染常见错误设计之 - 根页面同步阻塞1.2 架构设计之 - 客户端组件依赖于服务端组件数据① 使用 Redux 完成数据共享 1.3 架构设计之 - 单页内的分步骤跳转① 如何做到服务端组件和客户端组件之间的切换…...
使用 Python 进行 PDF 文件加密
使用 Python 解密加密的 PDF 文件-CSDN博客定义一个名为的函数,该函数接受三个参数:输入的加密 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屏幕制造工艺流程是一个复杂且精细的过程,涉及多个关键步骤以确保最终的显示效果和性能。以下是OLED屏幕制造工艺流程的主要步骤: 1. 衬底制作与准备 材料选择:OLED器件需要一个透明的导电衬底,通常使用玻璃或塑料材料。 清…...
knowLedge-VueCLI项目中环境变量的定义与使用
1. env 1.1简介 在 Vue CLI 创建的项目中,你可以通过 .env 文件来定义环境变量。Vue CLI 支持多种 .env 文件,它们根据文件名中的前缀来决定何时加载和使用这些环境变量。 以下是一些常见的 .env 文件及其用途: .env:在任何环境…...
【C#】 接口 继承
简介 继承是面向对象编程的核心特性之一,它允许我们创建一个类(称为子类)来继承另一个类(称为基类)的属性和方法。 作用 这样,我们可以重用代码,减少重复,并使我们的代码更加模块…...
Self-Supervised Learning(李宏毅老师系列)
自学参考: BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding BERT 论文逐段精读 视频课 课件资料 笔记 一、概述 自监督学习模型与芝麻街~ 参数量 ELMO:94MBERT:340MGPT-2:1542MMegatron&…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
