如何设计一个可靠UDP

背景

通信领域存在制约三角:时延,成本和质量。TCP是增大时延和成本来保证通信质量,UDP牺牲了质量保证了时延和成本。一定场景使用RDP可以找到这三之间的平衡点。实现可靠UDP主要有三种方式:

  • 尽力可靠:接收方要求发送放数据尽量完整到达,但是业务本身的数据可以丢失的,如音视频
  • 无序可靠:通信放要求发送方数据必须完整到达,但是顺序不重要,如文件传输,日志追加
  • 有序可靠:通信方要求发送方数据必须顺序完整到达

为什么要实现可靠UDP?

主要解决以下问题:

  • 端对端连通性问题:终端之间通信会跨NAT,TCP在NAT之间穿越非常困难,然后uDP就简单很多,如:端对端文件传输,音视频传输等;
  • 弱网传输问题:TCP的延迟受网络影响比较大,如:实时操作网友,语音对话等;
  • 宽带竞争问题:有时候客户端上传数据要突破TCP公平性限制来达到高速低时延和稳定,如音视频直播推流,可以压榨带宽;
  • 传输路径优化:对于时延要求比较高就会用应用层relay的方式来进行选路优化延时,比如服务之间数据转发,数据备份
  • 资源优化问题:主要是避免三次握手和四次挥手,如QUIC

所以首要是实现可靠性,保证质量,核心就是重传。RUDP重传是通过接收端的ACK丢包信息反馈来进行数据重传,主要分为:定时重传、请求重传和FEC重传。

  • 定时重传:发送端在发出数据包之后一个RTO没有收到ACK,就重传这个包,缺点是容易误判:对方可能收到ACK但是ACK丢了,或者ACK在途中但是时间超过一个RTO。核心就是计算好RTO时间,如果应用场景对于延迟比较敏感但是流量成本要求不高,可以把RTO设置小一点,比如在线操作网游,适合小带宽低延迟传输。定时重传对于大带宽消耗比较大,一般采用请求重传。
  • 请求重传:请求重传是接收端发送ACK时候携带自己丢包反馈,发送端根据ACK重传。关键是回送ACK时候标明哪些信息丢失了,因为UDP在网络传输中会抖动,接收端要评估网络的RTT方差,当发现丢包时候记录时间t1,如果t1+RTT方差<当前时刻,就认为丢包了。请求重传还依赖RTO,所以要不停评估这两个参数,整体比定时重传时延大,但是节约了带宽,比较适合视频、文件传输。
  • FEC选择重传:FEC(Forward Error Correction)是前向纠错技术,用XOR算法实现。发送方在发送报文的时候会对数据进行FEC分组,通过XOR得到若干个冗余包,一起发送给接收端,如果丢包了可以通过分组进行还原,就不用重传了。如果不能回复就请求原始数据包。FEC可以解决延时敏感并且可能随机丢包的环境,可以与上面两种方式进行搭配。
具体实现方式

RTT和RTO计算

RTT是网络环路延时,是通过发送数据包和接收到ACK计算的,可以通过类似于加权平均收敛计算,然后再计算RTT方差。计算RTO会涉及到报文重传,就是一个报文的重传周期,如果一个RTT+方差的时间没收到ACK,就可以再次重传,一般RTO = SRTT + SRTT方差,网络严重抖动的时候RTO会设置高一点,比如乘以1.2到2。

窗口和拥塞控制

还需要解决延时和重传带宽的问题,所以发送端可以设置一个拥塞控制窗口来避免高并发带宽过度占用问题。引入一个滑动窗口,有的业务场景RUDP需要发送端和接收端严格控制窗口,比如有序UDP就需要做好窗口排序和缓冲,无序的话一般不用做缓冲,只做位置滑动。每次收到数据接收方的窗口要滑动,滑动的速度受拥塞控制机制控制,拥塞控制可以通过丢包率后者网络时延实现。

拥塞算法

TCP有慢启动、拥塞避免、拥塞处理和快速恢复,都是为了决定发送窗口和速度设计的,根据丢包状况判断网络状态,确定发送窗口大小。TCP的实现是以成本换质量,缺点是很难高效利用也就是压榨网络带宽,很难保证大吞吐量和小时延。

  • BBR算法:基于发送端延迟和带宽评价拥塞的,可以保证在有一定丢包率的网络上充分利用带宽,然后还可以降低buffer时延。主要策略是周期性的根据ACK和NACK评估最小RTT和最大带宽,最大吞吐量等于 = 最大带宽/最小RTT。首先会进行初始化cwnd为8,开始慢启动,根据周期性ACK采样判断是否增大带宽,如果可以cwnd = cwnd * max_gain。如果超过周期丢包就会进行消耗状态,发出去但是还没有确认的数据大小>cwnd的话,继续保持消耗状态,发出去但是还没有确认数据<cwnd,进入带宽探测状态,这个状态下如果没发生丢包并非发出去但是还没确认的数据<1.25倍cwnd,将维持原来状态的cwnd进入慢启动,发生丢包cwnd = cwnd * 0.75,否则cwnd=cwnd*1.25。当10秒内的RTT<=min_rtt,就会进入RTT探测状态,这个状态收到ACK并且没有丢包,将用本次统计最小RTT来更换原本min_rtt,然后再次慢启动。

  • 通过周期性的计算cwnd,来完成拥塞控制,比较适合随机丢包且网络稳定的场景,如果网络极不稳定就容易预测不准,而且在公平问题上小RTT比大RTT更吃带宽。是使用成本换取质量和可用的方式。

  • webRTC算法:webRTC算法是基于丢包率和接收端延迟带宽进进行拥塞控制,并且保证尽力可靠交付,重传太多次会直接丢弃。当丢包率小于2%会加大带宽、在2到10之间会保持当前码率,丢包率大于10%会认为传输过载而减小带宽。缺点就是网络间歇性丢包的时候收敛比较慢,容易造成发送端流量失效。是以质量和成本换取时延。

  • 弱窗口拥塞控制:传输数据量就不大,保证时延比较小和可靠,采用固定大小如cwnd = 32来做控制,简单直接但是难以适应弱网环境。

传输路径

RUDP可以利用UDP特性在链路上做传输优化,主要分为多点串联和多点并联。

  • RTN:双方通过传递节点动态选路,中间的链路只是无状态的缓存,传递节点之间进行路由探测和选路,来保证高可用。

  • 多点并联:中间通过多节点并联来进行跳转。

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

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

相关文章

A 股承担着一个什么功能?

​A 股&#xff1a;中国资本市场的核心角色 A 股&#xff0c;即人民币普通股票&#xff0c;在中国资本市场中扮演着至关重要的角色。它不仅是投资者买卖交易的场所&#xff0c;更是中国经济发展的重要引擎。 首先&#xff0c;A 股为中国的企业提供了融资平台。中国有着庞大的…

从Elasticsearch来看分布式系统架构设计

从Elasticsearch来看分布式系统架构设计 - 知乎 分布式系统类型多&#xff0c;涉及面非常广&#xff0c;不同类型的系统有不同的特点&#xff0c;批量计算和实时计算就差别非常大。这篇文章中&#xff0c;重点会讨论下分布式数据系统的设计&#xff0c;比如分布式存储系统&…

Zookeeper3.5.7源码分析

文章目录 一、Zookeeper算法一致性1、Paxos 算法1.1 概述1.2 算法流程1.3 算法缺陷 2、ZAB 协议2.1 概述2.2 Zab 协议内容 3、CAP理论 二、源码详解1、辅助源码1.1 持久化源码(了解)1.2 序列化源码 2、ZK 服务端初始化源码解析2.1 启用脚本分析2.2 ZK 服务端启动入口2.3 解析参…

鸿蒙入门学习的一些总结

前言 刚开始接触鸿蒙是从2023年开始的&#xff0c;当时公司在调研鸿蒙开发板能否在实际项目中使用。我们当时使用的是OpenHarmony的&#xff0c;基于DAYU/rk3568开发板&#xff0c;最开始系统是3.2的&#xff0c;API最高是API9&#xff0c;DevecoStudio 版本3.1的。 鸿…

List, Set, Queue, Map 四者的区别

List、Set、Queue、Map 是 Java 中常用的集合类型&#xff0c;它们的主要区别如下&#xff1a; List List 是可重复有序的集合。可以通过索引访问 List 中的元素。可以添加、删除、修改 List 中的元素。常用的实现类有 ArrayList 和 LinkedList。 Set Set 是不可重复的无序…

excel统计分析——Duncan法多重比较

参考资料&#xff1a;生物统计学 Duncan法又称新复极差检验法&#xff0c;是对S-N-K法的改进&#xff0c;根据秩次距m对临界值的显著水平α进行调整&#xff0c;是最常用的多重比较方法。最小显著极差表示如下&#xff1a; 其中&#xff0c;m为秩次距&#xff0c;df为方差分析中…

【软件测试】学习笔记-制定一份有效的性能测试方案

什么是性能测试方案&#xff1f; 性能测试方案&#xff0c;通俗一点说就是指导你进行性能测试的文档&#xff0c;包含测试目的、测试方法、测试场景、环境配置、测试排期、测试资源、风险分析等内容。一份详细的性能测试方案可以帮助项目成员明确测试计划和手段&#xff0c;更…

CentOS服务器拒绝SSH登录

当CentOS服务器拒绝SSH登录时&#xff0c;有几个可能的原因和解决方法&#xff1a; 检查网络连接&#xff1a;确保服务器与您的计算机之间的网络连接是正常的。您可以尝试使用其他网络连接或ping服务器以检查是否能够访问。 确认SSH服务正在运行&#xff1a;在服务器上确认SSH…

Python3进行pdf文件分割及转word

今天有个pdf分割的需求&#xff0c;电脑装的Python3&#xff0c;网上查资料都是Python2的代码&#xff0c;所以整理一份3的 安装&#xff1a; pip install PyPDF2 import PyPDF2def funSplitPdf():pdf_file open(/path/fileName.pdf, rb)pdf_reader PyPDF2.PdfReader(pdf_fi…

第二集《闻法仪轨》

请大家打开讲义第三面&#xff0c;甲二、于法、法师发起承事。 我们身为一个大乘的佛弟子&#xff0c;我们这一念明了的心&#xff0c;在一生当中&#xff0c;会遇到很多很多的佛法&#xff0c;也会遇到很多很多的法师&#xff0c;但不是所有的法师跟佛法对我们都是帮助的&…

Prometheus插件安装kafka_exporter

下载地址 https://github.com/danielqsj/kafka_exporter/releases 解压 tar -zxvf kafka_exporter-1.7.0.linux-amd64.tar.gzmv kafka_exporter-1.7.0.linux-amd64 kafka_exporter服务配置 cd /usr/lib/systemd/systemvi kafka_exporter.service内容如下 [Unit] Descript…

概念性——数据库简介

前些天发现了一个人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;最重要的屌图甚多&#xff0c;忍不住分享一下给大家。点击跳转到网站。 概念性——数据库简介 介绍 数据对于当今许多应用程序和网站的运行至关重要。对热门视频的评论、多人游戏中分…

golang读取json文件

golang读取json数据 json文件&#xff1a; {"hostUrl":"wss://spark-api.xf-yun.com/v2.1/chat","appid":"your appid","apiSecret":"your apiSecret","apiKey":"your apiKey" }代码&#…

centos手动下载配置redis并自启动

有些服务器不能自动安装配置redis&#xff0c;仓库找不到之类的问题&#xff0c;就需要手动下载配置redis&#xff0c;记录下&#xff0c;方便以后使用&#xff08;ps&#xff0c;如果报错可能是gcc缺失&#xff09; 1、下载 Redis 源码包&#xff1a;访问 Redis 官网或可信的…

基于时空模型的视频异常检测

假设存在一个运动区域&#xff0c;规则要求只能进行特定的运动项目。 出于安全原因或因为业主不喜欢而禁止进行任何其他活动:)。 我们要解决的问题是&#xff1a;如果我们知道正确行为的列表&#xff0c;我们是否可以创建一个视频监控系统&#xff0c;在出现不常见的行为发出通…

37、Flink 的CDC 格式:debezium部署以及mysql示例(1)-debezium的部署与示例

Flink 系列文章 一、Flink 专栏 Flink 专栏系统介绍某一知识点&#xff0c;并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分&#xff0c;比如术语、架构、编程模型、编程指南、基本的…

从某种意义上讲 python中的 string 是元组

在Python中&#xff0c;字符串&#xff08;string&#xff09;是一种不可变的序列类型&#xff0c;可以被视为字符元素的有序集合。从某种意义上说&#xff0c;字符串的确具有类似元组的特性。 像元组一样&#xff0c;字符串是不可变的&#xff0c;这意味着一旦创建&#xff0c…

UE5 Chaos系统 学习笔记

记得开插件&#xff1a; 1、锚点场 在锚点场范围内的物体静止且不被其他力场损坏 2、ClusterStrain 破裂效果的力 3、DisableField chaos破裂后的模拟物理在绿色范围内禁止模拟物理 4、ForceAndStrain 破裂效果的力 5、ForceAndStrainFallOff 破裂效果的力&#xff0c;但是…

浅析Redis②:命令处理之epoll实现(中)

写在前面 Redis作为我们日常工作中最常使用的缓存数据库&#xff0c;其重要性不言而喻&#xff0c;作为普通开发者&#xff0c;我们在日常开发中使用Redis&#xff0c;主要聚焦于Redis的基层数据结构的命令使用&#xff0c;很少会有人对Redis的内部实现机制进行了解&#xff0c…

uniapp 框架搭建及使用

uniapp官方文档 uview官网文档 前期工作&#xff1a; 1.下载Hbuilder X编辑器&#xff1b;2.熟悉uniapp的相关文档&#xff1b;3.查找合适的UI组件库&#xff0c;我使用的是uview&#xff08;适配H5和小程序&#xff09; 创建uniapp 新建: 新项目的话打开Hbuilder X选择项目&…