网站打开速度规定多长时间网站建设采购项目合同书
网站打开速度规定多长时间,网站建设采购项目合同书,安徽省住房和城乡建设局,上海互联网设计公司滑动窗口技术详解
目录
滑动窗口的核心思想不同协议中的具体做法优势与局限TCP 滑动窗口工作流程示意通用滑动窗口 C 实现总结 一、滑动窗口的核心思想
滑动窗口是一种用于流量控制和可靠传输的技术#xff0c;主要解决以下问题#xff1a;
提高信道利用率#xff1a;允…滑动窗口技术详解目录滑动窗口的核心思想不同协议中的具体做法优势与局限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等协议中都有不同的实现方式但目标一致在保证可靠性的前提下最大化信道利用率。