802.11的隐藏节点和RTS,CTS机制

        802.11协议适用于无线局域网,这一点和802.3有着本质性的不同。首先先了解一下无线传输相关的范围:


        无线传输有三个非常重要的范围:传输范围,侦听范围和干扰范围。

        1.传输范围:传输范围(TX_range)指成功接收帧的通信范围,取决于发送能量和无线电波传输特性。

        2.侦听范围:侦听范围(PCS_range)可检测到传输的范围,取决于接收器灵敏度和无线电波传输特性。

        3.干扰范围:干扰范围(IF_range)此范围内节点发送帧将干扰接收方的接收并导致丢帧。

        前两个都是针对发送主机的,第三个是针对接收主机的。为什么会有这三个范围呢?这就涉及到无线局域网802.11和有限局域网802.3之间的区别。我们知道无线传输更容易衰减,而在有限传输介质中往往能传输的比无线介质更远。所以在有线局域网中,任何一个主机发送消息,在一个介质上面相连的所有主机都能收到。但是无线局域网就不一样了。因为在发送信号的一定范围内信号会衰减,减弱到无法成功接收,那么别的主机就不认为这是个有效信号了,无法接收,这个就是传输范围的来源。侦听范围要比传输范围远,因为只要能侦听到,都算侦听范围,但是有可能即使侦听到也无法还原。干扰范围同理,在这个范围之外有其他的信号发送不会影响到接收主机,但是在这个范围内有其他主机发送就会强到影响这个接收主机了,这就是干扰范围。

        懂得了这三个范围有助于了解隐藏节点和暴露节点的问题。

        隐藏节点:由于距离太远而导致一个站点无法检测到介质竞争对手的存在。 我们考虑下面一个图:



        A在向B传输数据,如果C想向B传输数据,那么C首先监听,他发现在他的传输范围内有B,可以发送,但是它的侦听范围内没有A,也就是他不知道A在给B发送消息,于是他发送了。这时候问题就出现了,B同时接收到AC两个主机发送了数据,造成了冲突,传递失败,这就是隐藏节点的问题,C作为隐藏节点能够干扰接收方但是却不能侦听到发送方。ABC三个点三个范围的关系如下所示:


        我们从隐藏节点中能够看出无线局域网和有线局域网的区别:无线局域网802.11中,没有监听到载波,不代表可以传输。

        同样,有隐藏节点就有暴露节点。暴露节点指由于侦听到其他站点的发送而误以为介质忙导致不能发送,和隐藏节点正好相反。考虑下面一种情况:


        B正在向A发送数据。C想向D发送数据,但是他发现它的侦听范围内有B正在发送,那么他误认为自己不能给D发送,因为信道正忙。但是实际上D在B的干扰范围之外,C给D发送数据是完全可以的,这就是暴露节点。三个范围关系如下图所示。暴露节点告诉我们:侦听到信道忙,不代表不能发送


        上面的暴露节点和隐藏节点问题是无线局域网802.11特有的,802.3是没有的,所以对于802.11有一种特殊的解决隐藏节点问题的机制,也就是RTS和CTS

        RTS/CTS机制的基本思想是:通过短的控制包来预留出带宽。方法如下:

        ①发送方通过发送RTS请求请求发送。

        ②接收方用CTS回应发送请求

        ③CTS为发送方预留带宽的同时通告所有节点

        发送方A如果想给接受方B发送消息,那么首先要发送一个RTS控制帧。那么在发送方周围的主机,收到了这个RTS之后,就知道他周围有人要发送消息了,那么它会保持静默,不发送任何消息,直到接收到B给A发送消息确认,那么直到A给B发送消息这个过程完全结束了,这些周围的主机就可以发送了,周围主机这个沉默状态叫做NAV状态。

        接收方接收到A给他发送的RTS之后,首先它先回复一个CTS确认控制消息。B周围的机子接收到这个CTS之后,那么就知道它周围有人要接受消息,所以也设定为NAV静默状态,防止干扰到接收方B,知道接收到B回给A的ACK,确定数据发送完毕,于是它们也可以收发消息了。

        示例图如下所示:


        上面是发送方,下面是接受方。第一组节点是发送方周围的节点,它们从接收到RTS之后就开始静默,直到接收到ACK. 第二组节点是接受方周围的节点,它们收到CTS之后也开始静默,直到接收到ACK。DIFS和SIFS是帧间间隔,它们大小不同,都是无线局域网802.11所规定的,可以理解为先等一个DIFS或者SIFS再发送RTS或者CTS,至于为什么这样,需要具体去了解CSMA/CA协议,可以参考这篇文章:

        802.11的CSMA/CA协议

       总之,接收方发送的CTS和发送方的RTS能有效避免它们周围节点发送消息,从而避免隐藏节点造成的冲突,这也是RTS和CTS机制的作用。

        延伸阅读(有关802.3和802.11避免冲突的协议):

        载波监听多路访问CSMA和CSMA/CD详解

        介质访问控制MAC以及ALOHA协议

        

  • 42
    点赞
  • 170
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
以下是用C++语言实现802.11分布式协调方式下的MAC访问机制的步骤: 1. 定义802.11 MAC帧格式:802.11 MAC帧格式包括帧控制字段、目标地址、源地址、BSSID、序列控制字段、QoS和数据字段等。 2. 实现帧生成和解析函数:根据定义的帧格式,实现802.11 MAC帧的生成和解析函数,以便在节点之间传输和接收数据帧。 3. 实现802.11分布式协调方式的MAC访问机制802.11分布式协调方式包括两种方法:Carrier Sense Multiple Access with Collision Avoidance (CSMA/CA)和Request to Send/Clear to Send (RTS/CTS)。实现这些方法,以确保在多个节点同时访问同一个信道时,数据不会发生冲突,从而提高系统的效率。 4. 实现自适应的传输速率控制:根据信道的情况自适应地调整传输速率,以最大化系统的吞吐量。 5. 实现重传机制:当数据包发送失败时,实现一定的重传机制,以确保数据包能够被可靠地传输。 6. 实现QoS机制:实现基于服务质量(QoS)的MAC访问机制,以确保对不同类型的数据流进行优先处理,从而提高系统的性能。 以下是用C++语言实现802.11分布式协调方式下的MAC访问机制的部分代码,供参考: ```c++ // 定义802.11 MAC帧格式 struct MACFrame { uint16_t frameControl; uint16_t duration; uint8_t destAddr[6]; uint8_t srcAddr[6]; uint8_t bssid[6]; uint16_t seqControl; uint8_t qosControl; uint8_t data[1500]; }; // 实现802.11 MAC帧的生成函数 MACFrame createFrame(uint16_t frameControl, uint8_t* destAddr, uint8_t* srcAddr, uint8_t* bssid, uint16_t seqControl, uint8_t qosControl, uint8_t* data) { MACFrame frame; frame.frameControl = frameControl; frame.duration = 0; memcpy(frame.destAddr, destAddr, 6); memcpy(frame.srcAddr, srcAddr, 6); memcpy(frame.bssid, bssid, 6); frame.seqControl = seqControl; frame.qosControl = qosControl; memcpy(frame.data, data, 1500); return frame; } // 实现802.11 MAC帧的解析函数 bool parseFrame(MACFrame frame, uint16_t &frameControl, uint8_t* destAddr, uint8_t* srcAddr, uint8_t* bssid, uint16_t &seqControl, uint8_t &qosControl, uint8_t* data) { frameControl = frame.frameControl; memcpy(destAddr, frame.destAddr, 6); memcpy(srcAddr, frame.srcAddr, 6); memcpy(bssid, frame.bssid, 6); seqControl = frame.seqControl; qosControl = frame.qosControl; memcpy(data, frame.data, 1500); return true; } // 实现802.11分布式协调方式的MAC访问机制 void CSMA_CA() { // 实现CSMA/CA机制 } void RTS_CTS() { // 实现RTS/CTS机制 } // 实现自适应的传输速率控制 void adaptiveRateControl() { // 根据信道情况自适应调整传输速率 } // 实现重传机制 void retransmission() { // 当数据包发送失败时,进行一定的重传机制 } // 实现QoS机制 void QoS() { // 实现基于服务质量的MAC访问机制 } ``` 以上是用C++语言实现802.11分布式协调方式下的MAC访问机制的部分代码,可以根据具体的需求和场景进行完善和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值