(三)DCF机制详解_下篇

在上篇中介绍了DCF机制的载波侦听机制以及帧间间隔机制,DCF机制入门详解_上篇,在这篇文章中主要介绍随机退避机制以及基于 RTS/CTS 的四次握手机制,再简要介绍802.11中规定的分段/重组信道控制实现部分。

3.随机退避机制

802.11中采用二进制指数退避法解决节点发送失败或者发生冲突时需要退避的时间。
下图是基本接入机制:
这里写图片描述
当MAC层有帧需要发送,在物理载波侦听虚拟载波侦听都表示信道空闲之后,若退避窗口的计数值不为0,则继续一slot time为单位减少计数值,否则随机生成一个退避窗口进行退避。

此时,节点在竞争窗口中选择一个随机数为基准的随机回退计数值,退避时间选定后,就相当于设置了一个退避计时器(backoff timer)。站点在slot time内持续监听信道。这可能发生两种情况:
若检测到信道空闲,退避计时器就继续倒计减一;
若检测到信道忙,就冻结退避计时器的剩余时间,重新等待信道变为空闲并再经过时间DIFS后,从剩余时间开始继续倒计时。退避计时器的时间减小到零时,就开始发送整个数据帧。

               Back off Time=Random ( )* a Slot Time

其中,Random()是均匀分布在[0,CW]范围内的随机整数,CW就是contention window竞争窗口
竞争窗口的值是一个介于物理特征值最小竞争窗口CWmin与最大竞争窗口CWmax之间的参数值,用来让节点选择随机回退计数值(backoff counter)的范围。

                      aCWmin <= CW <= aCWmax

不同的物理层技术有相应的物理特征值,下图为DSSS物理层的数据标准
这里写图片描述

下图为竞争窗口增长图

这里写图片描述
a.初始时CW=CWmin,则Backoff time为[0,CWmin]中的随机值乘上SlotTime,并使用该Backoff Time进行竞争;
b.若Backoff Time到0时报文仍未发送成功(发送失败或者发生冲突(另有节点的退避值同样等于0)),则CW值翻倍,并重新计算Backoff Time.
c. 以此类推,若发送不成功则CW值继续指数增长(x2),待CW=CWmax后,一直保持CW=CWmax,只有等到重传次数到达极限后(分为短包/长包重传最大次数,分别计数),丢弃此包并复位CW为CWmin;若报文发送成功,则CW初始为CWmin。
短包/长包重传最大次数会在下面重传部分详讲。

下图是退避实例过程:
这里写图片描述
从上图我们可以看出,A在发送成功以后,自行进入退避进程,不论它的后续有无帧需要发送,都要进入退避。当信道空闲DIFS时长后,其余各节点的退避计时器都开始以slot time为单位减少计时器的计数值。C的退避计时器最早到达0,则开始发送帧,而其余节点挂起退避计时器,等待下一次信道空闲。

4.RTS/CTS机制

802.11中可以选择使用或者不适用RTS/CTS机制来预约信道。在802.11中,并不是每次的数据帧、管理帧的传输过程都要借助RTS/CTS来预约信道,多余的RTS/CTS会导致效率降低,该机制并不是总是有效,尤其对于短数据帧(可能是短帧的发送成功率高,冲突可能性低吧)。广播和多目标传输不能使用RTS机制,因为其会引起多个目标地址进行CTS应答。
只有当定向帧的MPDU或者MMPDU的长度超过了属性值dot11RTSThreshold后STA才在帧交换前使用RTS/CTS交换。

属性dot11RTSThreshold是MIB的一个管理项目,它的值被MAC的LME(层管理实体)读和写。如果该值为0则表示所有的MPDU在传送前都使用RTS/CTS,dot11RTSThreshold的默认值是2347比特,默所有的MPDU在传送前都不需要RTS/CTS。这个值可以通过本地或者外地管理器修改。
STA设置了不发起RTS/CTS之后,仍然可以接收RTS和CTS,执行虚拟载波监听机制。同时可以对发送到该节点的RTS进行应答。

以下探讨采用RTS/CTS机制的原理及实现:
由于两个节点的发送范围无法互相覆盖,从而两者在发送数据时,是无法通过物理监听的方法,探测对方是否有发送数据。如果没有更多的措施,STA 1和STA 2一直会误认为信道空闲,从而不断倒数,当计时器到0时,则发送数据,如下图(图为引用802.11协议精读2:DCF与CSMA/CA):
这里写图片描述
隐藏终端的情况下,网络性能最差时是无法传递数据包的,换言之,STA 1与STA 2的吞吐量都趋近于0。
DCF中,引入了RTS/CTS机制。

  1. RTS:单播帧,没有加密,其duration字段中填充包含后续发送过程中总体所需要时间。
  2. CTS:单播帧,没有加密,节点在收到CTS后,确认信道是空闲的,可以发送。其duration字段包含除去RTS以及一个SIFS后,发送过程总体所需要时间。
    这里写图片描述
    下图结合退避过程理解,横轴单位为slot time
    这里写图片描述

4.分段、重组

把一个长度较大的MSDU或MMPDU进行分成较小的MPDU的过程叫做分段,信道特性使得传输短帧的可靠性比长帧更高,目的STA接收分段后重新组装成MPDU。
MAC的属性值dot11FragmentationThreshold 定义了物理层能接收的最长帧长度,当发送的帧长度超过该参数,必须分段。其默认值依赖于物理层的信息管理库中的属性aMPDUMaxLength。若aMPDUMaxLength>=2347,则默认值设置为2347,aMPDUMaxLength<2347,则默认值设置为aMPDUMaxLength。该设置值可以通过外部管理器修改,但是要小于aMPDUMaxLength。
这里写图片描述

5.分段|MAC帧的传输规则

当MSDU或者MMPDU不是作为整体,当其分成几个片段,每个片段都是完整的帧需要传送时,信道控制过程为:
当源节点争取到信道的使用权,这个使用权有停驻时间边界。STA开启突发传送模式,持续发送片段帧,直至把MSDU或者MMPDU发送完成。期间可能出现的情况有:
1、 MSDU或者MMPDU发送完成,不论STA有无剩余的MSDU或者MMPDU需要发送,在接收到ACK之后进入退避模式,等待下一次使用权;
2、 一个需要ACK的分段,在传输之后没有收到应答,源STA将在Ack定时器过后,进入退避程序(在ACK定时器后仍未接收到ACK,则认为传输失败)。之后重新竞争信道,争取到信道使用权后,重新传输。
3、 在超出传送次数限制之后,MAC层丢弃该包,进入退避程序。

传送次数限制:MAC层会为每个MSDU或者MMPUD(按照帧长度)分配一个长帧计数器LRC或短帧计数器SRC,MIB中设置了属性dot11ShortRetryLimit(默认值为7)和dot11LongRetryLimit(默认值为4),是SRC和LRC的上限。
当传送失败时,相应LRC或SRC加1,当超出设置的上限时,丢包,计数器置零;传送成功时,计数器置零。
4、 当剩下的停驻时间已经不足以支持发送一个分组和一个应答,源节点将会在这个停驻时间段结束后进入退避模式,参与信道使用权竞争。
5、 接收节点会将重复的分段帧过滤丢掉

这里写图片描述

这里写图片描述
a.判断帧发送的失败与否规则
发送RTS之后,物理层发送原语PHY-TXEND.confirm表示发送结束,STA进入CTS规程。在等待了一个CTSTimeout间隔之后,如果没有收到PHY-RXSTART.indication原语,即没有表明物理层收到CTS帧,则表示发送失败。在CTSTimeout间隔之后调用退避规程。
发送数据帧或者管理帧之后,确认本次传输失败前,应该等待一个ACKTimeout。
b.过滤重复帧方法
通过内置在数据帧和管理帧中的顺序控制域

  • 3
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值