UE 可靠UDP实现原理

news2024/10/7 6:43:39

发送

我们的消息发送都是通过 UChannel 来处理的,通过调用 UChannel::SendBunch 统一处理。 发送的 Bunch 是以 FOutBunch 的形式存在的。当 bReliable 为 True 的时候,表示 Bunch 是可靠的。

发送逻辑直接从UChannel::SendBunch处开始分析

1、大小限制

UE的Bunch大小有限制, 最大Bunch为64K,SendBunch 的时候会去判断当前 Bunch 的大小是否超出限制。
在这里插入图片描述

2、Bunch处理(合并小Bunch,拆分大Bunch)

同一个Channel通道,可靠性一样,合并后没有超过单个 Bunch 的限制,可以合并为一个 Bunch。
如果是Actor初始化的包,需要同步CDO信息, 就不能合并。
在这里插入图片描述
同理,如果Bunch过大就会拆分,这些被拆分的 Bunch 的 bPartial 字段为1,表示这只是一个包的片段, 收包的时候会根据这个字段进行组包,拆分后的第一个 Bunch 的bPartialInitial 值为1,表示这是拆分后的第一个包, 最后一个包的 bPartialFinal 为 1。
在这里插入图片描述
在这里插入图片描述

3、可靠Bunch数量限制

如果设置了可靠 Bunch 上限 GCVarNetPartialBunchReliableThreshold,当本次要发送的 OutgoingBunches 的数量和之前 没收到Ack包的数量 超过阈值时,会暂停复制,直到收到了所有可靠消息的 Ack;
当可靠列表溢出的时候,连接会关闭。NumOutRec 为当前可靠的 Bunch 的数量,所以可靠 Bunch 的数量最多256个。
在这里插入图片描述

4、可靠 Bunch 预处理

在PrepBunch中对可靠包进行预处理

  • OutReliable 保存着每个 Channel 的可靠 Bunch 数量,会去初始化 Bunch 的通道序列号 ChSequence,可以看出每个通道的可靠 Bunch 序列号是递增的。
  • 每次发送一个可靠包时 NumOutRec(当前未收到Ack的可靠包数量) 会+1
  • 将Bunch加入到 OutRec(发送的未确认的可靠消息数据)中,用于收到Nak后重传。只保存可靠的 Bunch。
    在这里插入图片描述

5、UChannel::SendRawBunch

将ReceivedAck标记置为0
在这里插入图片描述

6、UNetConnection::SendRawBunch

设置 TimeSensitive 为1,先判断SendBuffer(存储BunchHeader和Bunch数据)是否可以装的下这次的Bunch+Header,如果装不下会调用 FlushNet 立即发送出去。然后将Header+Bunch写入SendBuffer中。
在这里插入图片描述

7、UNetConnection::Tick

如果有敏感标记TimeSensitive或者超时的时候会直接发送
在这里插入图片描述

8、UNetConnection::FlushNet

重置 TimeSensitive ,并且发送Packet。
在这里插入图片描述

接收

1、UNetConnection::ReceivedPacket

这一步进行了丢包检测。读取数据包头信息,并根据包头携带的序列号信息和最后一个成功接收到的序列号去判断序列号的增量,正常情况下,所有数据包都会按发出的顺序接收,所有增量会相差1。如果小于1,说明接收到的数据包发生了失序,引擎发送的每一个数据包序列号都是唯一的,不会重用,这种情况下引擎会忽略无效的数据包。
在这里插入图片描述
在这里插入图片描述

如果大于1,说明发生了丢包,不会立即处理当前的数据,会把当前的数据包加入队列 PacketOrderCache 中,等待收到差值为1的包再一起处理。
在这里插入图片描述

2、解析数据包头

然后调用PacketNotify.Update
在这里插入图片描述

每个到来的数据包都需要到 PacketNotify 中更新序列号信息。
1、根据包头携带的序列号数据计算出当前确认的序列号数量,然后根据 AckRecord 去更新 InAckSeqAck
2、如果超出数量上限 SequenceHistoryT::Size = 256,则视为收到 Nak
3、从序列号历史记录(History Storage)中判断是 Ack 还是 Nak,然后调用对应的处理函数
在这里插入图片描述

3、ReceivedAck

当接收到 Ack 的时候,会对当前确认的包 id 相同的 bunch 修改标志位 ReceivedAck,并且从 OutRec 列表中删除已确认的消息 bunch。
在这里插入图片描述

4、ReceivedNak

当我们发送一个可靠的 Bunch 的时候,会把它添加到 OutRec 中,这是一个已发送的未确认的可靠消息列表。当接收到 Nak 的时候,会为每个通道的包 id 为 NakPacketId 的未确认的可靠数据重新发送一次。丢包发生的时候,只会按 Bunch 去重新发送,Bunch 序列号还是原来的 Channel 序列号,而之前的 Packet 是不会重用的,只会生成新的 Packet,以及最新的 PacketId。意味着不会重新发送之前发送的数据包,也不会重用数据包序列号,数据包的发送每一次都是新生成的数据包,数据包序列号都是递增的,不会重复。
1、由于 OutRec 只保存了可靠的数据包,如果是不可靠的消息发生了丢包,引擎是不会重新发送它们的。
2、这里保存的是 RawBunch,如果 Bunch 是拆分的,丢弃了一部分,会导致整个 Bunch 的重新发送。
在这里插入图片描述

5、UChannel::ReceivedRawBunch

1、如果是可靠的消息,但是通道序列号不是有序的,则放入接收可靠消息列表 InRec 中,并按通道序列号 ChSequence 顺序存储,同样的,接收的可靠消息列表数量 NumInRec 一样不能超过可靠缓冲区大小256(RELIABLE_BUFFER)。
2、调用 ReceivedNextBunch 接收完之后,会再处理之前缓存的可靠消息列表 InRec,按顺序处理。

6、发送Ack、Nak消息

当收到一份数据的时候,我们会对数据进行确认,会回复 Ack 或者 Nak,写入到序列号历史记录中,由于历史记录最多 256 位,所以当 Ack 累计超过之后,会调用 FlushNet 立即发送。同时改变敏感标志位 TimeSensitive。
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

消息中间件之RocketMQ(一)

1.简介 RocketMQ是阿里巴巴于2012年开源的分布式消息中间件,后来捐赠给Apache软件基金会,并于2017年9月25日称为Apache的顶级项目.作为经历多过多次阿里巴巴双11这种超级工程的洗礼并有稳定出色表现得国产中间件,以其高性能、低延迟和高可靠…

NTFS 磁盘管理器---NTFS Disk by Omi NTFS中文

NTFS Disk by Omi NTFS是一款专为Mac用户设计的NTFS磁盘管理工具。它可以帮助用户方便地访问和管理NTFS格式的硬盘、U盘、移动硬盘以及其他存储设备,并提供高效稳定的NTFS卷管理功能。该软件具有简单的用户界面,使用户能够快速访问和管理NTFS磁盘上的文件…

C++入门学习(七)整型

整型就是整数类型的数据(-1,0,1等等) 数据类型占用空间取值范围short(短整型)2字节 (-2^15 ~ 2^15-1) 32768~32767 int(整型)4字节(-2^31 ~ 2^31-1)long(长整形) Windows为4字节, Linux为4字节(32位), 8字节(64位) (-2^31 ~ 2^31…

pyspark笔记:over

1 方法介绍 在 PySpark 中,over 函数是一个非常重要的概念,尤其是在使用窗口函数(例如 row_number, rank, dense_rank, lead, lag 等)时。over 函数允许你对一个数据集进行分组,然后在每个分组内应用窗口函数。 1.1 …

【MongoDB】下载安装、指令操作

目录 1.下载安装 2.指令 2.1.基础操作指令 2.2.增加 2.3.查询 2.4.修改 2.5.删除 前言: 关于MongoDB的核心概念请移步: 【文档数据库】ES和MongoDB的对比-CSDN博客 1.下载安装 本文以安装Windows版本的mongodb为例,Linux版本的其实…

漫漫数学之旅009

文章目录 经典格言数学习题古今评注拓展学习(一)大数定理(二)伯努利级数 经典格言 真正的问题,不在于机器是否思考,而在于人们是否思考。——BF斯金纳(B. F. Skinner) BF斯金纳&…

通过完善价值观评价,建立企业多维度评价体系

一、背景A公司是一家互联网公司,主要负责技术开发、软件应用方面的工作,致力于长期的软件研发、服务器开发、游戏端开发等,依托于专业技术实力和长期的实践积累,公司不断整合各类资源、深入开发技术,规模不断扩大&…

C++---判断闰年

一.闰年的定义 闰年是指在公历中,年份可以被4整除但不能被100整除的年份,或者可以被400整除的年份。简单来说,闰年是一个比平年多出一天的年份,即2月有29天。闰年的目的是校准公历与地球公转周期的差异,确保时间计算的…

HackTheBox - Medium - Linux - BackendTwo

BackendTwo BackendTwo在脆弱的web api上通过任意文件读取、热重载的uvicorn从而访问目标,之后再通过猜单词小游戏获得root 外部信息收集 端口扫描 循例nmap Web枚举 feroxbuster扫目录 /api/v1列举了两个节点 /api/v1/user/1 扫user可以继续发现login和singup 注…

苹果电脑(Mac)的node版本安装以及升降级

在开发过程中,对于不同的开发环境或者较老的项目可能需要切换不同的node版本,此过程会涉及到node版本的升级与降级,安装node版本管理模块n(sudo命令)。 全局安装n模块 sudo npm install n -g//输入后回车&#xff0c…

树莓派4B 刷ubuntu20.4.5配置 网线连接 找不到IP解决

跟随的教程: 【树莓派教程第一课 树莓派简介 十分钟玩转系列入门篇】 https://www.bilibili.com/video/BV16U4y1879Q/?p6&share_sourcecopy_web&vd_sourceb96879a51029063390138a2b464a7446 遇到的问题: 在我刷好ubuntu到系统卡并在根目录创建…

MacOS X 安装免费的 LaTex 环境

最近把工作终端一步步迁移到Mac上来了,搭了个 Latex的环境,跟windows上一样好用。 选择了 Mactex 做编译,用 Texmaker 做编辑; 1. 下载与安装 1.1 Mactex 下载安装 MacOS 安装和示例 LaTex 的编译器 与 编辑器 编译器使用免费…

C语言算法赛——蓝桥杯(省赛试题)

一、十四届C/C程序设计C组试题 十四届程序C组试题A#include <stdio.h> int main() {long long sum 0;int n 20230408;int i 0;// 累加从1到n的所有整数for (i 1; i < n; i){sum i;}// 输出结果printf("%lld\n", sum);return 0; }//十四届程序C组试题B…

Zabbix 系统监控详解

1 介绍 1.1 摘要 本文深入浅出&#xff0c;切近实际运维应用&#xff0c;由 zabbix 3.4 版本入手&#xff0c;学习 zabbix 监控告警实现方式&#xff0c;由 zabbix 5.0 浅出实现快速部署、快速应用。本人从业多年&#xff0c;关注 zabbix 开源社区&#xff0c;以及 zabbix 官…

【开源】基于JAVA的CRM客户管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统设计3.1 用例设计3.2 E-R 图设计3.3 数据库设计3.3.1 客户表3.3.2 商品表3.3.3 客户跟踪表3.3.4 客户消费表3.3.5 系统角色表 四、系统展示五、核心代码5.1 查询客户5.2 新增客户跟踪记录5.3 新增客户消费订单5.4 查…

大数据技术原理及应用课实验3 :熟悉常用的HBase操作

目录 实验3 熟悉常用的HBase操作 一、实验目的 二、实验平台 三、实验步骤&#xff08;每个步骤下均需有运行截图&#xff09; &#xff08;一&#xff09;编程实现以下指定功能&#xff0c;并用Hadoop提供的HBase Shell命令完成相同任务&#xff1a; 1.列出HBase所有的表…

人工智能攻克奥数几何难题:AlphaGeometry 接近金牌选手水平

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

直流过欠压继电器JSZD-1A DC220V 0-220V 面板嵌入式安装

一、 概述 JSZD-1系列直流电压继电器是专为直流系统设计的&#xff0c;以进口大规模集成电路为核心&#xff0c;配以本厂研制的模块和部分外围元件组装而成。具有通用性好、互换性强、寿命长、外形美观大方、性能稳定可靠等特点。 JSZD-1系列直流电压继电器既是一块过、欠压继…

Docker(八)高级网络配置

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; 高级网络配置 注意&#xff1a;本章属于 Docker 高级配置&#xff0c;如果您是初学者&#xff0c;您可以暂时跳过本章节&#xff0c;直接学习…

Linux重定向:深入理解与实践

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;晴る—ヨルシカ 0:20━━━━━━️&#x1f49f;──────── 4:30 &#x1f504; ◀️ ⏸ ▶️ ☰ &…