网工干货知识

超全学习笔记
当前位置:首页 > 干货知识

可靠的用户数据报协议 – RUDP

更新时间:2026年03月27日   作者:spoto   标签(Tag):

可靠的UDP协议(RUDP)是一种基于UDP构建的协议,它增加了诸如确认、重传以及有序传输等可靠性功能——同时仍然保持了UDP的低延迟特性。在通过互联网传输数据时,我们常常需要在速度和可靠性之间做出权衡。

  • UDP(用户数据报协议)虽然传输速度快,但可靠性较低。
  • TCP(传输控制协议)虽然具有可靠性,但由于其连接建立以及确认机制的原因,传输速度相对较慢。

注意:可以将其视为“UDP + 可靠性层”的结合体。这种方案非常适合那些需要高速、实时传输的应用场景,比如游戏、流媒体和VoIP等。这些应用场景无法承受TCP连接带来的额外开销,但仍然需要可靠的传输体验。

为什么仅仅依靠UDP是不够的

UDP通过直接将数据包从发送方发送到接收方来实现数据传输,整个过程不需要任何握手或确认步骤。也就是说:

  • 数据包可能会丢失、被重复发送,或者顺序混乱地到达。
  • 接收方没有做出任何回应或确认。
  • 发送方无法确定数据是否已经送达。

注意:RUDP通过在其基础上引入一个可靠性层来解决这些问题——这是一种非常有效的解决方案。

RUDP架构——其运作方式

RUDP位于应用层,其实现方式基于UDP。发送方和接收方都维护着数据包的传输窗口——即一个固定大小的范围,该范围决定了一次可以发送或接收多少数据包。其工作流程如下:

RUDP协议架构
  1. 发送者将消息拆分成更小的片段。
  2. 每个段都被分配了一个序列号以及校验和,这些校验和用于验证数据的完整性。
  3. 数据包通过UDP协议,经由RUDP协议进行传输。
  4. 接收方会检查是否存在错误,并确认数据包的顺序。之后,接收方会发送确认信号,同时将所有数据包缓存在缓冲区中,直到所有数据包都被正确接收为止。
  5. 如果在一定时间内没有收到ACK响应,那么发送方会重新发送该数据包。

注意:这个系统确保了可靠性——同时,它不需要像TCP那样进行复杂的连接建立过程。

RUDP的主要组成部分

线程安全缓冲区

发送方和接收方都使用由信号量保护的同步共享缓冲区,从而防止多个线程同时访问数据。这样可以避免死锁和数据损坏的情况发生。

2. 窗口管理

有两个重要的计数器负责管理这种流程的运作:

  • 基础/起点最早未被确认的数据包的序列号。
  • 接下来接下来要发送的数据包的序列号。

注意:这样就能有效地追踪哪些数据包处于传输过程中,哪些已经得到确认。

3. 超时与重传机制

  • 每个发送的数据包都会启动一个计时器。
  • 如果确认消息在计时器到期之前没有到达,那么发送方会自动重新发送该数据包。
  • 这确保了没有任何数据会被永久丢失。

4. 网络仿真与排队模型

  • RUDP可以在测试过程中模拟网络延迟、数据包丢失以及数据包乱序等情况。
  • 每个数据包都会附带一个时间戳(current_time + delay),以此来模拟现实世界中的情况。

滑动窗口协议——RUDP可靠性的核心机制

Sliding Window Protocol(SWP)是RUDP的核心技术。它确保了以下几点:

  • 数据包以可控且连续的方式被发送出去。
  • 在数据包被接收时,确认机制会将“窗口”向前推进。
  • 重复的数据包以及顺序混乱的数据包会被丢弃或重新排序。

类型:

  1. 单比特滑动窗口协议——最简单的一种协议,传输过程中只使用一个数据包。
  2. Go-Back-N协议:在数据包丢失后,重新传输所有丢失的数据包。
  3. 选择性重传协议——仅重新传输丢失的数据包(效率最高,适用于RUDP协议)。

背靠技术/背负技巧

  • 与发送单独的确认数据包不同,RUDP采用“piggybacking”方式,即把确认信息附加在正在传输的数据包上。
  • 这样可以降低网络开销,并提高性能,尤其是在双向通信中。

窗口更新的数学视角

  • 每次一个数据包被确认后,窗口的上边界就会向前移动。
  • 当所有未处理的数据包都被确认后,发送方就知道所有的数据都已经收到了。此时,连接可以安全地关闭了。
  • 这种以数学为基础的管理方式,有助于RUDP在速度与可靠性之间取得平衡——通过窗口机制来优化速度,同时通过确认机制来确保系统的可靠性。

RUDP中的内部类

班级/类别目的
RUDP核心类负责处理数据的发送与接收、窗口的设置以及计时器的控制。
Buffer_RUDP具有线程安全访问功能的共享缓冲区(使用计数信号量)。
线程接收器该线程负责监听传入的数据包,并同时对其进行确认。
Segment_RUDP定义了RUDP数据包的结构,包括序列号、校验和等要素。
超时处理程序在ACK信号延迟或丢失的情况下,能够处理重新传输的问题。
支持_RUDP功能负责处理网络层面的任务,例如发送UDP数据包、模拟延迟或丢包情况。
客户端/服务器模型用于通过 RUDP 层发送和接收数据的接口。

RUDP工作流程

客户端侧

客户端代码架构
  1. 数据被划分为多个段或部分。
  2. 每个段都会得到一个帧,该帧包含序列号以及校验和。
  3. 通过 Support_RUDP.send_udp() 发送。
  4. 每个时间段都会启动计时器。
  5. 如果收到了ACK信号,则视为已成功传输。
  6. 如果超时发生,则重新发送数据包。

服务器端

服务器端代码架构
  1. 负责监听传入的数据包。
  2. 验证校验和以及序列号的有效性。
  3. 为每一个有效的数据包发送确认信号。
  4. 可以重新排序那些顺序混乱的数据包。
  5. 在所有数据都被接收后,最终的数据会被传递给应用程序。

RUDP类的伪代码

类 RUDP{
//设置窗口的大小
设置接收窗口的大小
设置发送窗口的大小
启动一个接收线程,该线程负责接收来自发送方和接收方的确认消息以及相关数据。
//发送方调用
send_data(byte[] data_gram, int size)
{
//处理流程:首先获取数据,然后将其分割成多个片段,接着将这些片段存储到发送方缓冲区中。最后,发送数据,并启动计时器。
//将内容分割成多个部分,并随帧一起发送出去。
将其分割成若干部分。
将所有片段都放入发送方的缓冲区中。
使用 support_RUDP 类中的 sent_udp() 方法发送数据段。
针对被分割成多个段的数据的超时调度机制
}
//接收者进行调用
接收数据(byte[] buffer, int size)
{
//接收数据分组的各个部分
每次只接收一个段,其中包括那些帧。
}
//发送方和接收方都可以调用它。
关闭函数
{
//创建用于指示的标记
创建一个用于指示数据传输状态的标志字段。
//数据验证
//如果数据接收已经完成,则关闭连接。
一旦接收到完整的数据后,就关闭该段内容吧。
}
}
//RUDP类在此处结束

Thread_receiver类的伪代码

Class Thread_receiver
{
当“true”时,一直循环下去。
{
//正在等待数据包的接收。
通过套接字接收数据包。
//将数据转换为数字形式,或者计算数据的校验和。
从接收到的数据包中,提取出属于某个特定段的信息。
//数据验证
通过校验和来验证这些帧的完整性。
如果该片段包含确认信息的话
处理过程 -> 从发送方的缓冲区中移除相关段位
如果该段数据包含有效信息的话
将数据放入接收方的缓冲区中。
发送确认信息
}
}
//Thread_receiver类的结束部分

Support_RUDP类的伪代码

类支持_RUDP
{
//模拟那些可能导致各段数据无法被完全接收的情况
随机网络延迟
网络中断/故障
任何其他可能影响到数据包的因素/情况
//处理过程
来自各个分区的数据包正在被处理中。
//发送
通过套接字发送数据包。
}
//Support_RUDP类的结束部分
客户端-服务器类的伪代码
//发送者
类客户端{
RUDPrudp = new RUDP(主机名, 端口, 本地地址);
//发送数据
rudp.send();
//关闭
rudp.close();
}
//客户端类结束
//接收者类开始
班级服务器
RUDPrudp = new RUDP(主机名, 端口, 本地地址);
//接收数据
rudp.receive();
//关闭
rudp.close();
}

RUDP的应用场景

  • 在线游戏:在这种情况下,延迟必须尽可能小,但同时也需要一定的可靠性。
  • VoIP与视频流媒体:在需要实时通信的情况下,数据包的丢失确实会严重影响通信质量。
  • 物联网系统:在需要轻便且具备弹性的通信方式的情况下。

UDP vs TCP vs RUDP

功能/特点UDPTCPRUDP
连接设置No是的(采用三路握手协议)No
可靠性No是的是的
感谢No是的是的
数据包排序无法保证有保证/有保障保证/承诺
速度非常快温和的/适度的接近UDP的速度
应用场景/使用方式流媒体播放,游戏娱乐文件传输,网络实时可靠的系统
              马上抢免费试听资格
意向课程:*必选
姓名:*必填
联系方式:*必填
QQ:
思博SPOTO在线咨询

相关资讯

即刻预约

免费试听-咨询课程-获取免费资料