王心源,程 鹏,吴 斌,李雪妍
(1.中国科学院微电子研究所,北京 100029;2.中国科学院大学,北京 100049)
WiFi是IEEE定义的一个无线网络通信的工业标准(IEEE 802.11)[1],WiFi 是一种短程无线传输技术[2]。无线局域网(Wireless Local Area Networks,WLAN)技术或WiFi技术由于技术成熟、易于部署以及成本较低被广泛地应用于短距离场景如家庭场景。但在某些远距离特殊场景下不便于有线通信设备的安装和部署,技术人员也渴望使用WiFi技术。增大WiFi的发射功率可以显著增加传输距离,在传输功率方面满足了远距离传输的要求时仍存在一些问题,如隐藏节点等。这些问题的根源在于WiFi 所采用的媒体访问控制(Media Access Control,MAC) 技术为载波监听多路访问/冲突避免(Carrier Sense Multiple,CSMA/CA),CSMA 基于竞争的设计原理导致了特定场景性能低下,且无法避免[3]。基于时分多址(Time Division Multiple Access,TDMA)的MAC 协议对共享的媒介在时间上进行精细的划分,各个节点只在自己归属的时隙内发送数据,实现了无竞争机制,避免数据竞争信道时产生碰撞,很好地解决了远距离传输下的隐藏节点问题[4]。在当前WiFi商用硬件设备上对TDMA模式支持较少。文中在开源网络仿真器NS-3中基于WiFi组件实现了TDMA 的MAC协议仿真。
时分多址是一种无争用的介质访问协议。网络中所有节点共享的信道带宽被划分为时间槽,每一个节点循环使用时间槽。各节点只在其分配的时间段内传输数据,传输槽通常是固定的时间间隔[5-6]。
每个传输槽之间插入保护间隔,以便传输不重叠。保护间隔的值通常是一个数据包传输到指定的传输范围所需要的时间。在这个简单的时分多址模型中,假设节点的时钟是同步的。
在多节点网络中,许多冲突都是由隐藏节点问题引起的。如图1 所示,AP 为接入点,STA1 和STA2为两个站点。在家庭场景中,STA1 和STA2 的距离较近,它们可以通过载波侦听感受到彼此的存在,即STA1 或STA2 要发送数据包时会先检测载波是否正在被使用,如果被使用会进行随机退避,此时不会发生冲突。一旦STA1和STA2均距离AP较远甚至为传输极限距离时,STA1 和STA2 将无法感受到彼此的存在,对于站点STA1 和STA2 来说载波是空闲的。若此时两个站点同时向AP 发送数据,那么将会产生冲突导致数据的传输错误或失败[7]。
图1 隐藏节点问题
当两个不在彼此传输范围内的节点向同一接收器发送数据时,来自两个发射器的数据包在接收器上发生碰撞。这就是所谓的隐藏节点问题。
IEEE 802.11 是一种基于争用的MAC 协议,通过引入无竞争的TDMA协议可以有效地解决此类问题。
NS-3 将连续变化的网络过程按照时间顺序分割成一系列的离散事件[8]。完整的NS-3 网络模拟过程就是按时间先后执行这些离散事件,如图2 所示。
图2 发送过程从连续到离散的过程
一个分组从节点0到节点1,其步骤可总结如下:
1)T1时刻,节点0 开始向信道中发送分组的第一个字节,这时节点0 的网络设备被占用,无法发送其他分组;
2)T2时刻,分组的最后一个字节发送完毕。网络设备被释放。T1到T2时刻这段时间就是分组的传输延时;
3)T3时刻,分组被节点1 接收,NS-3 假设节点没有传输延迟,所有到达其网络设备的分组被立即接收。T2到T3这段时间即使分组的传播延迟。
物理网络中所有分组发送过程都是连续的,NS-3 将这个连续过程抽象为3 个离散事件,也就是3 个函数[9]。
T1时刻的分组发送事件,节点0 在T1开始发送分组,与物理网络不同的是,节点0 一次性将整个分组发送给信道的C++对象,通过锁定网络设备,使其无法发送其他分组(后续分组将进入到网络设备对象的缓存中),直到T2时刻新的事件发生,即网络设备解锁。
通过在T1时刻锁定网络设备和T2时刻解锁网络设备两件离散时间模拟出一个连续的分组发送过程。同样模拟分组在信道中的传输过程,信道在T1时刻计划一个新的事件,在T3时刻将分组一次性的转发给目标节点1 网络设备的C++对象[10]。
通过在脚本中设置分组大小、传输速率和传播延迟的属性,可以模拟不同的网络仿真。
在NS-3 中将节点(node)、设备(device)、协议层(MAC)、物理层(PHY)以及信道(Channel)均抽象成一个个C++的类[11]。该文通过在NS-3 仿真平台中加入TDMA 相关的类TdmaMac 类、TdmaQueue 类以及TdmaController 类,实现了简单的TDMA 协议。
2.2.1 TdmaMac
上层的数据包(packe)由IP 层传送到TdmaMac中,TdmaMac 在收到数据包后,调用Enqueue 函数将数据包放入队列并等待。等待到属于该节点的传输时隙到来,TdmaMac 通过Get QueueState 函数查询TdmaQueue 中的入队数据包packet,然后将数据包packet 循环地从队列中取出,并附加上MAC 头和尾,执行函数Start Transmission 将数据包发送给SimpleWireless Channel 类。同时在传输开始之前TdmaMac 中还需要根据packet 的大小(size)计算出传输所需的时间,把所有需要传输的packet 的时间总和和TdmaController 分配给该节点的传输时间进行比较,如果在该节点回合下不能再传输一个packet,则终止传输循环,即使还剩余一定的时间。
2.2.2 TdmaQueue
TdmaQueue 队列主要实现丢包策略。查询队列的state 为full 时,将此时上层发送的packet 丢掉。TdmaQueue 中主要的两个属性变量为QueueLength和QueueTime。QueueLength 变量为队列最大长度,QueueTime 为队列最大延时。当队列中数据包数达到QueueLength 数量时,后边得到的数据包均丢掉。QueueTime 设定的时间为数据packet 在队列中能够存储的最长时间,当数据包在队列中存储的时间大于QueueTime 时,数据包packet 同样被丢掉。TdmaQueue 实现了以上两种根据队列长度以及数据包存储时间的丢包策略。
2.2.3 TdmaController
TdmaController 负责管理和计划实现TDMA 协议的控制,TdmaController 类初始化TDMA 传输参数,授权节点进行传输。在仿真开始前将分配给传输的插槽数量和插槽持续时间分配给每一个节点[12-14]。仿真开始后,仿真程序通过MAC 指针列表中调用TdmaMac,并指示节点它可以传输一个特定的SlotTime。当传输完成后,等待一个GuardTime,然后开始下一个节点,从列表中调用下一个节点。一旦所有节点全部遍历完成,等待一个InterFrame Time 时间再开始下一个周期。
TdmaController 函数为Tdmacontroller 起始执行函数,Start 函数中首先启动controller。Start 函数调用仿真器simulator 执行StartTdmaSessions 函数。Start TdmaSessions 函数在第0 秒执行ScheduleTdma Session 函数。ScheduleTdmaSession 函数中创建了一个mac 的map。在每一个slot 中不断地循环执行ScheduleTdmaSession 函数,Start 函数调用关系如图3 所示。
图3 Start函数调用关系
ScheduleTdmaSession 函数通过调用 Tdma CentralMac::StartTransmission 函数,不断地调用SendPacketDown 函数将packet 传递下去。Send PacketDown 函数调用lowmac 层的StartTransmission函数最终将packet传输出去进入到信道中[15-17]。
函数 TdmaController::CalculateTxTime 调用CalculateBytesTxTime 计算packet 的TX 时间,以供TdmaMac::StartTransmission 使用,判断剩余packet 是否能在slot时间内传输完成。
图4 传输函数执行过程
TdmaMac::StartTransmission 执行后,TdmaCon troller 先对packet 的传输时间进行计算得到packetTransmissionTime,然后将其与totalTransmi ssionSlot 进行比较。
该系统测试TDMA 性能采用一个接入点,4 个客户端的应用场景,仿真参数设置如表1 所示。4 个客户端STA1、STA2、STA3、STA4 按时隙顺序分配,且时隙大小相同,每个客户端均占用一个slottime 进行轮询。
表1 仿真参数设置
图5 TDMA仿真拓扑
通过配置上层的应用产生packet 的速率以及分别设置物理层的传输速率进行吞吐率测试,吞吐率仿真结果如表2 所示。
表2 吞吐率仿真结果
文中对WiFi 设备在特定场景下应用的缺点进行了简要分析,简单介绍了隐藏节点问题的定义,其根本原因来自协议的竞争机制,因此提出使用公平接入的TDMA 协议。同时在NS-3 开源仿真器中增加了相关模块,Tdmamac 类,TdmaQueue 类 和Tdmacontroller 类,这3 类实现了基本TDMA 协议,并对其正确性进行了验证。如有需要,可以在此基础上添加TDMA 调度算法。