计算机网络(7)——滑动窗口

本文深入解析滑动窗口流量控制的基本原理,包括发送窗口和接收窗口的作用,以及停止等待、后退N帧和选择重传三种滑动窗口协议的工作方式。通过对比不同协议的特点,帮助读者理解网络流量控制机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、滑动窗口流量控制基本原理

  • 发送窗口:

    • 在任意时刻,发送发都维持一组连续的允许发送的帧的序号,称为发送窗口。
  • 接收窗口:

    • 发送窗口用来对发送方进行流量控制,而发送窗口的大小 W 代表在还没有收到对方确认信息的情况下发送方最多还可以发送多少个数据帧。

在接收端设置接收窗口是为了控制可以接受哪些数据帧而不可以接收哪些帧。在接收方只有当收到的数据帧的序号落入接收窗口内才允许将该数据帧手下。若接收到的数据帧落在了接收窗口之外,则一律将其丢弃。

在这里插入图片描述

在发送端,每收到一个却认真,发送窗口就向前滑动一个帧的位置,当发送窗口内没有可以发送的帧(即窗口内全部是已发送,但未接收到确认的帧),发送方就会停止发送,直到收到接收方发送的确认帧使窗口移动,窗口内有可以发送的帧,之后才开始继续发送。

二、滑动窗口的分类

滑动窗口分为三类:停止等待、后退N帧、选择重传。他们之间主要的区别就是:发送窗口和接收窗口大小的区别。

  • 停止等待协议:

    • 发送窗口大小 = 1, 接收窗口大小= 1
  • 后退N帧协议

    • 发送窗口大小 > 1,接收窗口大小 = 1
  • 选择重传协议

    • 发送窗口大小 > 1, 接收窗口大小 > 1

三、停止等待协议

规则:源站发送单个帧后就必须等待确认,在目的站的回答到达源站之前,源站不能发送其他的数据帧

在停止等待协议中,除了数据丢失的问题,还有可能存在以下两种差错:

  • 到达目的站的数据帧可能遭到破坏。

    • 解决办法:源站在发送一个帧后,就为这个帧装一个计时器,在一个帧发送之后,源站等待确认,如果在计时器时间到达时未收到确认,则再次发送相同的帧。
  • 数据帧正确,但是却认真没有收到

    • 此时接收方已经收到了正确的数据帧,但是发送方收不到却认真,因此发送方会重传已经被接收的数据帧,接收方收到同样的数据帧就会丢弃该帧,并重传一个该帧对应的却认真。

【总结】

  • 【1】接收方收到相同的数据:发送方超时重传
  • 【2】发送方收到相同的确认帧:发送方发送了重复的数据
  • 【3】接收窗口大小 = 1, 发送窗口大小 = 1

四、后退N帧

发送方不需要在收到上一帧的ACK后才能开始放松下下一帧,而是可以连续发送帧。当接收方检测出失序的信息帧之后,要求发送方重发最后一个正确信息帧之后的所有未被确认的帧;或者当发送方发送了N个帧之后,若发现该N帧的前一个帧在计时器超时后仍未返回其确认信息,则该帧被判定为出错或者丢失,此时发送方就不得不重传该出错帧及之后的N个帧。注意:接收方只允许按照顺序接受帧。

为了减少开销,后退N帧协议还规定接收端不一定每收到一个正确的数据帧就必须立即发回一个却认真,而是可以在连续收到好几个正确的数据帧后,才对最后一个数据帧发送确认信息,或者可以在当自己有数据要发送的时候才将对以前正确收到的帧加以捎带确认。

在这里插入图片描述

五、选择重传

只重传出现差错的数据帧或者是计时器超时的数据帧。每一个发送缓冲区对应一个计时器,当计时器超时的时候,缓冲区的帧就会重传。另外,该协议使用了比上述其他协议更有效的差错处理策略,即一旦接收方怀疑帧出错,就会发送一个否定帧NAK给发送方,要求发送方对NAK中制定的帧进行重传。

### 计算机网络中的滑动窗口协议仿真 #### 滑动窗口协议简介 滑动窗口协议是一种用于控制数据传输速率并确保可靠性的机制。该协议允许发送方在未收到确认的情况下连续发送多个分组,从而提高效率。 #### 仿真的实现方式 为了模拟滑动窗口协议的工作过程,在C++中可以构建一个简单的模型来展示其基本功能[^1]。此模型通常会定义几个核心组件: - **缓冲区管理**:维护两个主要的数据结构——发送端和接收端的缓存队列。 - **定时器处理**:当某个包未能及时得到ACK响应时触发重传操作。 - **事件驱动逻辑**:通过循环迭代的方式推进时间轴上的各个状态变化,比如新消息的到来、超时发生等。 对于具体的编程实践而言,开发者可以在Windows环境下利用Microsoft Visual Studio作为IDE来进行编码工作[^2]。下面给出一段简化版伪代码表示如何创建这样一个简易版本的应用程序框架: ```cpp #include <iostream> #include <queue> using namespace std; class Packet { public: int seqNum; }; // 发送者类 class Sender { private: queue<Packet> sendBuffer; // 待发报文序列 public: void addPacket(Packet p); bool hasUnackedPackets(); Packet getNextPacket(); }; // 接收者类 class Receiver { private: queue<int> recvBuffer; // 收到但尚未确认的消息编号列表 public: void receivePacket(const Packet& packet); bool canAcknowledge(int expectedSeqNum); }; int main() { // 初始化双方对象实例... while (/* 运行条件 */) { // 处理发送侧活动 // 模拟传播延迟后的到达情况 // 更新接受侧的状态,并反馈给对方必要的应答信号 } } ``` 上述片段仅展示了最基础的设计思路;实际项目可能还需要考虑更多细节因素如错误检测与纠正能力、流量控制策略等方面的内容。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值