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

滑动窗口机制及其应用

在无线通信开发中,如何高效跟踪数据包的接收状态是一个常见难题。由于无线信号易受干扰,数据包可能丢失、重复或乱序到达,这就需要一套机制来记录哪些数据包已收到、哪些需要重传。

什么是滑动窗口机制?

滑动窗口(Sliding Window)是网络通信和无线协议中常用的流量控制与状态跟踪技术。它通过定义一个固定大小的 "窗口",只关注窗口范围内的数据包状态,随着新数据的接收,窗口不断向前滑动,既保证了状态跟踪的效率,又能适应序列号循环复用的场景。

在本文解析的代码中,滑动窗口机制主要解决三个核心问题:

  • 如何标记哪些序列号的数据包已接收
  • 如何处理数据包丢失、重复和乱序到达的情况
  • 如何应对序列号回绕(如 8 位 SN 从 255 回到 0)的场景

代码实现

这里我们同时使用了滑动窗口+位图的形式,位图的方式存储位置,在理论上可以实现极为高效的资源利用率

class SlidingWindowReceiver:def __init__(self, window_size=32):# 窗口大小self.window_size = window_size# 接收位图,用整数的二进制位表示接收状态self.rx_bitmap = 0# 最后处理的序列号,初始化为特殊值表示未初始化self.update_index = -1  # 相当于NML_HRF_UPDATE_INDEX_INIT# 8位序列号的最大值self.UINT8_MAX = 255def update_rx_status(self, sn):"""更新接收状态"""# 处理重复包if self.update_index == sn:print(f"丢弃重复包,SN: {sn}")returnlast_update_index = self.update_indexdelta = 0# 计算序列号差值deltaif last_update_index == -1:  # 初始状态强制delta为1delta = 1else:if sn > last_update_index:delta = sn - last_update_indexelse:# 处理序列号回绕delta = (self.UINT8_MAX + 1 + sn - last_update_index)# 转换为有符号8位整数if delta > 127:delta -= 256# 根据delta更新窗口if delta == 1:# 连续接收,更新窗口起点print(f"连续接收,SN: {sn}")self.update_index = snelif delta > 0:# 超前接收,标记中间丢失的包print(f"超前接收,SN: {sn},丢失 {delta - 1} 个包")for i in range(delta - 1):# 计算丢失的序列号lost_sn = last_update_index + 1 + i# 计算对应的位位置bit_pos = lost_sn % self.window_size# 清除该位(标记为未接收)self.rx_bitmap &= ~(1 << bit_pos)self.update_index = snelse:# 滞后接收(收到旧包)print(f"收到旧包,SN: {sn}")# 标记当前SN为已接收bit_pos = sn % self.window_sizeself.rx_bitmap |= (1 << bit_pos)def print_status(self):"""打印当前接收状态"""print(f"\\n当前窗口起点: {self.update_index}")print(f"接收位图(二进制): {bin(self.rx_bitmap)[2:].zfill(self.window_size)}")print(f"已接收的SN(窗口内): {[i for i in range(self.window_size) if (self.rx_bitmap & (1 << i))]}")# 测试滑动窗口机制
if __name__ == "__main__":# 创建一个窗口大小为8的接收器receiver = SlidingWindowReceiver(window_size=8)# 模拟接收一系列数据包test_sequence = [1, 3, 2, 5, 8, 9, 7, 10, 15, 14, 16, 3]for sn in test_sequence:print(f"\\n处理SN: {sn}")receiver.update_rx_status(sn)receiver.print_status()

http://www.dtcms.com/a/295510.html

相关文章:

  • 云渲染的算力困局与架构重构:一场正在发生的生产力革命
  • Apache POI 实战应用:企业级文档处理解决方案
  • 5.7 input子系统
  • uboot FPGA调试环境搭建
  • C++ <多态>详解:从概念到底层实现
  • 不同头会关注输入序列中不同的部分和不同维度所蕴含的信息,这里的头和嵌入维度不是对应的,仅仅是概念上的吗?
  • 在Ubuntu上使用QEMU学习RISC-V程序(1)起步第一个程序
  • 负载均衡-LoadBalance
  • YOLOv4深度解析:革命性的实时目标检测技术
  • 基于Zig语言,opencv相关的c++程序静态交叉编译
  • USRP X440
  • Vulnhub Web-Machine-N7靶机攻略(附VB安装教程)
  • Docker快速安装Clickhouse
  • Vue 项目中的组件引用如何实现,依赖组件间的数据功能交互及示例演示
  • OpenLayers 综合案例-基础图层控制
  • 解密 Base64 编码:从原理到应用的全面解析
  • 前端实现 excel 数据导出,封装方法支持一次导出多个Sheet
  • Effective Python 第16条:用get处理字典缺失键,避免in与KeyError的陷阱
  • 时间日期选择器组件进行日期和时间的禁用处理逻辑
  • 让UV管理一切!!!
  • wiz2025 挑战赛从 SpringActuator 泄露到 s3 敏感文件获取全解析
  • 再生基因总结
  • Vue工程化 ElementPlus
  • Android Camera createCaptureSession
  • 精密圆柱销类分拣系统“cad【9张】三维图+设计书明说
  • 货车手机远程启动的扩展功能有哪些
  • 二次元姓名生成器(饮料名+动漫角色名)
  • 研发过程都有哪些
  • 遨游三防平板|国产芯片鸿蒙系统单北斗三防平板,安全高效
  • 【jupyter 使用多进程方案】