基于RTS/CTS机制的wifi 协议(最新详解)

6 篇文章 1 订阅
5 篇文章 0 订阅

一、定义详解     

        WiFi协议(即IEEE 802.11标准系列)中的RTS/CTS(Request to Send / Clear to Send,请求发送/清除发送)机制是一种用于解决无线局域网中“隐藏节点”问题和提高网络效率的拥塞控制方法。在早期的802.11标准中,特别是那些工作在争用期模式下的设备,常常会遇到由于无线信号覆盖范围不完全重叠而导致的数据包冲突现象。

**隐藏终端问题**
        在一个无线网络环境中,当两个或多个设备同时尝试向同一个接收设备发送数据时,如果它们彼此无法直接检测到对方的传输(因为它们位于接收端设备的不同范围内),就会出现隐藏节点问题。这会导致同时发送的数据包相互碰撞,进而导致数据损坏和传输效率降低。

**RTS/CTS握手过程**
为了解决这个问题,802.11标准引入了RTS/CTS帧作为一种预约信道的方法:

        1. **发送方A** 需要发送数据给 **接收方B** 时,首先发送一个非常短的 RTS (Request to Send) 控制帧。该帧包含将要发送的数据帧长度信息。

        2. 当 **接收方B** 接收到 RTS 帧后,它会广播一个 CTS (Clear to Send) 控制帧响应。这个CTS帧不仅通知A可以开始发送数据,同时也让所有监听到CTS帧的其他节点(包括可能的隐藏节点C、D等)知道,在一段时间内(由CTS帧中的NAV字段指示)需要保持沉默,避免在这段时间内发送数据以免发生冲突。

        3. **发送方A** 在接收到CTS之后,确认现在信道已经清空,并且可以在预定的时间窗口内安全地发送数据帧至 **接收方B**。

        4. 其他节点在收到CTS后,根据CTS帧中携带的NAV值更新其网络分配向量(Network Allocation Vector, NAV),并在NAV指定的时段内暂停发送,从而避免了与正在进行的数据传输冲突。

        5. 数据传输完成后,网络进入新的竞争状态,其他节点可以根据CSMA/CA(载波侦听多路访问/冲突避免)机制重新竞争信道使用权。

**RTS Threshold**
        为了优化性能并不过度使用RTS/CTS机制,802.11标准允许配置一个参数叫做RTS阈值。只有当数据帧的长度超过这个阈值时,才会触发RTS/CTS握手过程。对于较小的数据帧,系统默认采用CSMA/CA机制来避免冲突,以减少开销。这是因为频繁的RTS/CTS交换也会消耗宝贵的带宽资源。

二、应用场景

RTS/CTS机制主要适用于以下无线网络通信场景:

        1. **隐藏节点问题突出的环境**:在多用户、复杂布局的无线局域网中,存在隐藏节点(即一个节点无法监听到另一个节点与共享同一信道的第三节点之间的传输)时,通过使用RTS/CTS可以减少冲突。例如,在有多个障碍物或建筑物遮挡导致信号覆盖不完整的地方。

        2. **高密度无线网络**:当大量无线设备集中在同一区域内并且频繁发送数据时,为了有效管理和协调信道使用权,避免因竞争导致的数据包碰撞,可以启用RTS/CTS机制。

        3. **长数据帧传输**:对于传输长度较大的数据包,尤其是视频流、文件传输等场景,由于传输时间较长,发生碰撞的概率相对较大。在这种情况下,采用RTS/CTS可以提前预约信道,显著降低碰撞风险。

        4. **对传输可靠性和延迟要求较高的应用**:如VoIP通话、实时视频监控等实时性要求高的应用场合,通过RTS/CTS机制确保传输效率和稳定性。

        然而,由于RTS/CTS握手会增加额外的开销(包括控制帧的发送时间和信道占用),对于小数据包传输或者低密度网络,通常会选择关闭RTS/CTS机制以提高整体吞吐量和响应速度。因此,在实际部署中,会根据网络的实际状况和需求来动态调整是否启用RTS/CTS以及设置合适的RTS阈值。

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对你的问题,我们可以使用ns3网络模拟器来构建隐藏节点场景,并观察RTS/CTS机制对隐藏节点的影响。下面是具体的实现步骤: 1. 安装ns3网络模拟器 首先,我们需要在本地或虚拟机上安装ns3网络模拟器。具体安装步骤可以参考ns3官方文档。 2. 编写网络场景脚本 接着,我们需要编写一个网络场景脚本来搭建隐藏节点场景,并设置RTS/CTS机制。下面是示例代码: ```c++ #include "ns3/core-module.h" #include "ns3/network-module.h" #include "ns3/wifi-module.h" #include "ns3/mobility-module.h" #include "ns3/internet-module.h" #include "ns3/applications-module.h" using namespace ns3; NS_LOG_COMPONENT_DEFINE ("HiddenNodeExample"); int main (int argc, char *argv[]) { // 创建节点 NodeContainer nodes; nodes.Create (3); // 创建WiFi设备 WifiHelper wifi; wifi.SetStandard (WIFI_PHY_STANDARD_80211a); wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("OfdmRate54Mbps")); // 创建物理层和信道模型 YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default (); YansWifiChannelHelper wifiChannel; wifiChannel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel"); wifiChannel.AddPropagationLoss ("ns3::RangePropagationLossModel", "MaxRange", DoubleValue (20.0)); wifiPhy.SetChannel (wifiChannel.Create ()); // 创建MAC层 WifiMacHelper wifiMac; wifiMac.SetType ("ns3::AdhocWifiMac"); // 安装设备和MAC层 NetDeviceContainer devices; devices = wifi.Install (wifiPhy, wifiMac, nodes); // 设置节点位置和移动模型 MobilityHelper mobility; mobility.SetPositionAllocator ("ns3::GridPositionAllocator", "MinX", DoubleValue (0.0), "MinY", DoubleValue (0.0), "DeltaX", DoubleValue (20.0), "DeltaY", DoubleValue (20.0), "GridWidth", UintegerValue (1), "LayoutType", StringValue ("RowFirst")); mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel"); mobility.Install (nodes); // 配置网络层 InternetStackHelper internet; internet.Install (nodes); // 配置IP地址 Ipv4AddressHelper ipv4; ipv4.SetBase ("10.1.1.0", "255.255.255.0"); Ipv4InterfaceContainer interfaces = ipv4.Assign (devices); // 创建UDP应用 uint16_t port = 9; UdpServerHelper server (port); ApplicationContainer serverApps = server.Install (nodes.Get (1)); serverApps.Start (Seconds (0.0)); serverApps.Stop (Seconds (10.0)); UdpClientHelper client (interfaces.GetAddress (0), port); client.SetAttribute ("MaxPackets", UintegerValue (1000)); client.SetAttribute ("Interval", TimeValue (Seconds (0.1))); client.SetAttribute ("PacketSize", UintegerValue (1024)); ApplicationContainer clientApps1 = client.Install (nodes.Get (0)); clientApps1.Start (Seconds (1.0)); clientApps1.Stop (Seconds (10.0)); UdpClientHelper client2 (interfaces.GetAddress (2), port); client2.SetAttribute ("MaxPackets", UintegerValue (1000)); client2.SetAttribute ("Interval", TimeValue (Seconds (0.1))); client2.SetAttribute ("PacketSize", UintegerValue (1024)); ApplicationContainer clientApps2 = client2.Install (nodes.Get (2)); clientApps2.Start (Seconds (1.0)); clientApps2.Stop (Seconds (10.0)); // 开启RTS/CTS机制 Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("0")); Config::SetDefault ("ns3::WifiRemoteStationManager::FragmentationThreshold", StringValue ("2200")); // 启用pcap文件记录 wifiPhy.EnablePcapAll ("hidden-node"); // 启动仿真器 Simulator::Stop (Seconds (10.0)); Simulator::Run (); Simulator::Destroy (); return 0; } ``` 在上面的代码中,我们首先创建三个节点,然后创建一个802.11a标准的WiFi设备,并设置固定的发送速率和传输距离。接着,我们通过YansWifiChannelHelper来创建信道模型,并将其应用到设备上。然后,我们创建一个Ad Hoc WiFi MAC层,并安装设备和MAC层。接下来,我们使用MobilityHelper来设置节点的位置和移动模型。然后,我们通过InternetStackHelper来配置节点的网络层,并使用Ipv4AddressHelper来分配IP地址。接着,我们创建两个UDP应用,分别在节点N1和N3上运行,并将数据发送到节点N2上。然后,我们通过Config::SetDefault()函数来设置RTS/CTS阈值和分片阈值,以开启RTS/CTS机制。最后,我们启用pcap文件记录,以记录仿真结果。需要注意的是,我们只在节点N2上运行了一个UDP Server,以便收集数据和分析。 3. 运行网络场景脚本并分析结果 编译并运行上面的场景脚本,将生成名为"hidden-node-0-0.pcap"、"hidden-node-1-0.pcap"和"hidden-node-2-0.pcap"的pcap文件,分别记录节点N1、N2和N3之间的通信情况。我们可以使用Wireshark等网络分析工具来分析这些pcap文件,从而获取网络性能指标,如吞吐率、丢率和平均时延等。需要注意的是,由于节点N3是隐藏节点,因此在开启RTS/CTS机制之前,节点N1和N3之间的通信可能会受到干扰,导致性能下降。在开启RTS/CTS机制之后,由于节点N2会发送CTS帧给节点N3,告知其可以发送数据,因此节点N3的发送不会再受到干扰,从而提高了网络性能。 希望这些信息能对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值