滑动窗口技术详解 📅 发布时间:2026/7/12 4:38:04 👁️ 浏览次数: 滑动窗口技术详解目录滑动窗口的核心思想不同协议中的具体做法优势与局限TCP 滑动窗口工作流程示意通用滑动窗口 C 实现总结一、滑动窗口的核心思想滑动窗口是一种用于流量控制和可靠传输的技术主要解决以下问题提高信道利用率允许发送方在未收到确认的情况下连续发送多个数据单元而不是每发一个就停下来等待确认。控制流量接收方可以通过窗口大小告知发送方自己当前能接收的数据量防止接收方缓冲区溢出。实现按序交付与重传窗口内的分组按顺序编号接收方根据序号判断是否有丢包发送方根据确认信息决定重传哪些分组。基本机制发送方维护一个发送窗口表示可以发送但还未被确认的分组范围。接收方维护一个接收窗口表示可以接收的分组范围。窗口会随着数据的发送、确认以及超时事件向前「滑动」因此称为滑动窗口。二、不同协议中的具体做法2.1 TCPTransmission Control ProtocolTCP 是滑动窗口最经典的应用场景之一。发送窗口由**拥塞窗口cwnd和接收方通告窗口rwnd**共同决定实际可用窗口 min(cwnd, rwnd)。接收窗口接收方在 ACK 报文中通告自己剩余的缓冲区大小。滑动过程每收到一个 ACK窗口左边界右移新数据被确认后窗口整体向右滑动。特点支持可变窗口大小、流量控制、拥塞控制慢启动、拥塞避免等。2.2 HDLCHigh-Level Data Link ControlHDLC 是面向比特的数据链路层协议使用固定长度的滑动窗口进行流量控制。窗口大小由协议参数 W 决定W7 表示可连续发送 7 帧而不需确认。确认方式可以是捎带确认piggybacking或单独的 RRReceive Ready帧。滑动过程收到对第 N 帧的确认后窗口向前滑动到第 N1 帧。2.3 PPPPoint-to-Point ProtocolPPP 在数据链路层也使用类似滑动窗口的机制在 LCP 协商阶段可启用。窗口大小可配置通常为 1无流量控制或更大。确认与重传使用超时重传机制窗口滑动依赖于收到正确的确认帧。2.4 X.25 分组交换网络X.25 在数据链路层和分组层都使用滑动窗口。链路层类似 HDLC使用固定窗口大小。分组层窗口大小可动态协商用于控制端到端的数据流。2.5 实时通信与多媒体协议如 RTP/RTCP 扩展RTP 本身不强制滑动窗口但在某些实现中为处理网络抖动和丢包会采用类似滑动窗口的缓冲区管理策略对接收到的数据包进行有序重组和播放。三、优势与局限优势提高信道利用率减少等待时间。提供流量控制防止接收方过载。便于实现可靠传输和重传机制。局限需要维护窗口状态增加协议复杂度。在高速网络中窗口大小可能成为性能瓶颈需配合拥塞控制算法。对乱序到达的处理需要额外机制如选择重传 SACK。四、TCP 滑动窗口工作流程示意4.1 基本概念在 TCP 中发送窗口由两部分组成已发送但未确认In-Flight可以发送但尚未发送Available窗口大小 min(拥塞窗口 cwnd, 接收方通告窗口 rwnd)4.2 初始状态示例假设窗口大小为 5序列号范围 04初始时发送方已发送 Seq0、1未收到确认发送窗口 [0][1][2][3][4] ↑ ↑ 左边界 右边界 已发送未确认 可发送4.3 流程步骤Step 1初始发送发送方发送 Seq0、Seq1此时已发送未确认0,1可发送2,3,4。Step 2收到部分确认收到 ACK2表示 Seq0,1 已收到窗口左边界滑动到 2已发送未确认为空可发送2,3,4 及新序号 5,6。Step 3继续发送发送 Seq2、Seq3已发送未确认2,3可发送4,5,6。Step 4收到累积确认收到 ACK4Seq2,3 已收到左边界滑到 4可发送4,5,6,7,8。Step 5超时重传若 Seq4 超时未确认发送方重传 Seq4窗口不变直到收到 ACK已发送未确认4重传可发送5,6,7,8。Step 6接收方窗口变化若接收方缓冲区变小通告 rwnd3则发送窗口上限缩小左边界4 时右边界不能超过 6可发送只有 4,5,6。4.4 关键点总结窗口滑动每次收到 ACK左边界右移右边界随发送新数据或窗口大小调整而移动。流量控制接收方通过 rwnd 限制发送速率。拥塞控制cwnd 根据网络状况动态调整与 rwnd 共同决定实际窗口。重传机制超时或收到重复 ACK 时触发重传窗口暂时不滑动。五、通用滑动窗口 C 实现以下为通用的 C 滑动窗口实现模板不依赖具体协议仅实现核心的发送窗口管理逻辑窗口初始化与动态调整、数据发送与确认、窗口滑动、超时重传检测。可基于此适配 TCP、HDLC 等协议。#includeiostream#includeunordered_map#includequeue#includestring#includechrono#includethread// 模拟数据包结构structPacket{intseq_num;std::string data;boolis_acked;std::chrono::steady_clock::time_point send_time;};classSlidingWindow{private:intwindow_size;intbase;intnext_seq_num;std::unordered_mapint,Packetunacked_packets;std::queuePacketpacket_buffer;public:SlidingWindow(intsize):window_size(size),base(0),next_seq_num(0){}voidadd_data_to_send(conststd::stringdata){packet_buffer.push({next_seq_num,data,false,std::chrono::steady_clock::now()});next_seq_num;}voidtry_send(){while(unacked_packets.size()window_size!packet_buffer.empty()){Packet pktpacket_buffer.front();packet_buffer.pop();pkt.send_timestd::chrono::steady_clock::now();unacked_packets[pkt.seq_num]pkt;std::cout发送数据包: Seqpkt.seq_num, Datapkt.datastd::endl;}}voidreceive_ack(intack_num){if(ack_numbase){for(intibase;iack_num;i){unacked_packets.erase(i);}baseack_num;std::cout收到 ACKack_num, 窗口滑动到 basebasestd::endl;}else{std::cout收到重复 ACKack_numstd::endl;}}voidcheck_timeout(inttimeout_ms1000){autonowstd::chrono::steady_clock::now();for(auto[seq,pkt]:unacked_packets){autoelapsedstd::chrono::duration_caststd::chrono::milliseconds(now-pkt.send_time).count();if(elapsedtimeout_ms){std::cout超时重传: Seqseqstd::endl;pkt.send_timenow;}}}voidprint_status(){std::cout当前窗口: basebase, next_seqnext_seq_num, 未确认包数量unacked_packets.size()std::endl;}};intmain(){SlidingWindowsw(3);sw.add_data_to_send(Hello);sw.add_data_to_send(World);sw.add_data_to_send(TCP);sw.add_data_to_send(Protocol);sw.try_send();sw.print_status();std::this_thread::sleep_for(std::chrono::milliseconds(500));sw.receive_ack(2);sw.try_send();sw.print_status();std::this_thread::sleep_for(std::chrono::milliseconds(1200));sw.check_timeout(1000);return0;}代码说明SlidingWindow 类window_size为最大可发送未确认数量base为窗口左边界next_seq_num为下一个要分配的序列号unacked_packets记录已发送未确认的包packet_buffer模拟待发送数据。主要方法add_data_to_send添加数据try_send在窗口未满时发送receive_ack处理确认并滑动窗口check_timeout检测超时并重传print_status打印状态。可扩展可加入拥塞控制动态调整window_size、SACK 支持以及替换为真实网络 I/O。六、总结滑动窗口的核心思想是通过维护一个可动态调整的发送/接收范围实现高效、可控的数据传输。它在TCP、HDLC、PPP、X.25等协议中都有不同的实现方式但目标一致在保证可靠性的前提下最大化信道利用率。
Web开发中处理请求顺序覆盖问题 引言 在Web开发中,请求顺序覆盖是一个常见但容易被忽视的问题。当多个请求以特定顺序发送到服务器时,后发送的请求可能会意外覆盖先发送请求的处理结果,导致数据不一致、状态混乱或用户体验问题。本文将深入探讨请求顺序覆盖问题的本质、常见… 2026/7/11 15:03:34
多维度商品统计,经营数据实时汇总 进货多少、销售多少、库存剩余多少,看似简单的三个问题,一旦涉及多品类、多品牌、多月份的交叉统计,就容易陷入“数据杂乱无章、汇总耗时费力”的困境——人工统计易出错,漏算一笔采购、错记一笔销量,都可能导致库存积… 2026/7/8 3:22:13
『React』组件副作用,useEffect讲解 在 React 开发中,有时候会听到“副作用”这个词。特别是用到 useEffect 这个 Hook 的时候,官方就明确说它是用来处理副作用的。那什么是副作用?为什么我们要专门管控它?今天就聊聊 React 中的组件副作用。 📌 什么是“… 2026/7/11 10:12:52
职场英语学习打卡Day007 🌟计划1:📅学习时间:2026.7.9 周四内容:视频06主题:English at Work Episode 6: Double-booked Offering to help消耗时长:学新 共 35 min▶ kind regards 此致(用于书信或邮件结尾表… 2026/7/12 4:34:56
ChatGPT自定义指令深度优化手册(2024最新版|仅限内部技术团队流通的12条黄金规则) 更多请点击: https://kaifayun.com 第一章:ChatGPT自定义指令的核心机制与演进逻辑 ChatGPT的自定义指令(Custom Instructions)并非简单的前端提示词预填充,而是由后端推理服务在会话初始化阶段注入的、具有优先级高于… 2026/7/12 4:32:55
PingFangSC苹方字体:企业级跨平台字体架构决策与技术实现框架 PingFangSC苹方字体:企业级跨平台字体架构决策与技术实现框架 【免费下载链接】PingFangSC PingFangSC字体包文件、苹果平方字体文件,包含ttf和woff2格式 项目地址: https://gitcode.com/gh_mirrors/pi/PingFangSC 在现代Web应用的技术架构中&… 2026/7/12 4:30:54
SAP PO信息更新字段配置:OMFI/OMF0 2个事务代码控制默认勾选与工厂限制 SAP采购订单中"信息更新"字段的深度配置指南:OMFI与OMF0事务代码实战解析1. 理解"信息更新"字段的核心机制在SAP MM模块中,采购订单(PO)行项目的"物料数据"视图里藏着一个看似简单却影响深远的复选框——"信息更新&q… 2026/7/12 4:28:54
调试apk-1 一、安装雷电模拟器 去雷电官方下载模拟器然后安装 二、下载你的安卓apk包 找到你需要测试的apk包然后在雷电模拟器中安装好 三、adb介绍去你雷电模拟器安装的路径下找到adb.exe文件路径 ADB全称Android Debug Bridge,中文名为安卓调试桥,是谷歌官方… 2026/7/12 4:26:53
Fast R-CNN 、Faster R-CNN学习笔记 目录 Fast R-CNN Fast R-CNN 简介 Fast R-CNN 算法流程 Fast R-CNN网络结构设计 RoI 池化层(Region of Interest Pooling) 多任务损失函数 Fast R-CNN 总结 Faster R-CNN Faster R-CNN简介 Faster R-CNN 算法流程 Faster R-CNN网络结构设计 … 2026/7/12 4:22:47
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/12 0:01:13
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/12 0:01:13
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/12 0:03:14
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/12 0:01:13
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/12 0:01:13
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/12 0:03:14