NS-3源码学习(六)eMLSR

发布时间 2023-12-11 20:20:54作者: PolarisZg

简介

enhanced Multi Link Single Radio (eMLSR) 是MLO 的模式之一。WiFi AP 與使用者同時 使用多根天線建立連線,並從中選擇一條最適合之天線進行資料傳輸,當連線遭遇干擾時便立即切換至另一條天線以躲避干擾。透過此種傳輸模式WiFi AP與使用者能即時對環境干擾變化做出反應藉此提升傳輸吞吐量及可靠性。然而視使用者設備的效能不同切換延遲也長短不一,過高的切換頻率可能會為資料傳輸效能帶來反效果。

通过设计eMLSR切换算法,能夠在不同頻道干擾狀態下做出最精準的頻道切換決策,達到提升吞吐量的效果。

img

杂项

  1. 通过源码可以确定NS-3对于多个Link的实现方式:

    1. NS-3中对于WiFi结点的MAC和PHY的组装使用下述代码完成:

      staDevices = wifiHelper.Install(phy, wifiMac, staNodes);
      
      // src/wifi/helper/wifi-helper.cc
      NetDeviceContainer
      WifiHelper::Install(const WifiPhyHelper& phyHelper,
                          const WifiMacHelper& macHelper,
                          NodeContainer c) const{}
      
      src/wifi/helper/wifi-helper.cc
      NetDeviceContainer
      WifiHelper::Install(const WifiPhyHelper& phyHelper,
                          const WifiMacHelper& macHelper,
                          NodeContainer::Iterator first,
                          NodeContainer::Iterator last) const{}
      
    2. 在上述方法中,使用WifiHelper::Install(const WifiPhyHelper& phyHelper方法创建含有多个Link的PHY,每个PHY中的Link通过LinkID标识。在物理层中是找不到MAC地址的

    3. 这之后调用ns3::WifiMacHelper::Create方法开始创建mac层,这个方法被调用结束后,连接上多个Link的MAC层被创建,必须要深入这个方法内部才能看到具体的每个Link所对应的MAC层的创建方案。

    4. 创建每个Link所对应的mac如下图所示,在代码中我们可以看到,对于一个含有多个Link的device来说,mac实际上只有一个(指向了同一个内存地址),但Mac48Address有多个,他们各自安装到了不同的Link的帧管理器中,这些mac地址可以通过下述代码拿到:

      // 查看每隔staDevice的所有mac地址
          std::cout << "staDevices info :" << std::endl;
          for(u_int16_t i = 0; i < staDevices.GetN(); i++)
          {
              const Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice>(staDevices.Get(i));
              Ptr<WifiMac> mac = device->GetMac();
              for(uint8_t linkId = 0; linkId < std::max<uint8_t>(device->GetNPhys(), 1); ++linkId){
                  auto fem = mac->GetFrameExchangeManager(linkId);
                  std::cout << "staDevice " << i << " linkId " << std::to_string(linkId) << " mac address: " << fem->GetAddress() << std::endl;
              }
          }
      

      img

  2. 在wifi-phy中有一个属性ChannelSwitchDelay,这个属性的注释为"Delay between two short frames transmitted on different frequencies.",也就是信道的切换延迟

    1. 但是对于wifi6及以下的设备来说,并不支持多链路连接,也就是说这个属性出现的就很迷惑

    2. 不过这个属性被设置的值很大,默认是250ms

    3. 但是往深处想,这个如果ap切换了信道,那么sta不就断联了吗?gpt回答说ap会协调sta一起切换信道,这里需要去调查以下这种协商是如何工作的

    4. 另外,向channel中添加信号损失模型的工作

  3. eMLSR仅是MLO的模式一种,MLO还有其他种类的工作模式,比如STR和nSTR

    1. Multi-Link:该技术是Wi-Fi 7的最大亮点,其实也是Wi-Fi 7中最为复杂的技术

    2. 在Wi-FI 6时代,已经有一些系统,能够在单芯片中集成多个完整系统链路,并通过双Wi-Fi连接的方式,为用户提供服务,但是具体如何提供服务,以及一些调度策略的话,实际上是在传输层以上进行控制

    3. 简单的使用方式就是eMLSR和重传。eMLSR上面已经说过,重传是指在一个信道上发送源一个信道上发送副本,这样不必占用主信道的资源进行重传

    4. STR和nSTR技术

      img

      1. sta与ap的硬件差别:RF,天线数量,基带数量,IC,

      2. str难点:STR模式看起来工作机理很简单,也就是两个独立的802.11模块分别在不同的频段上跑。但是这里还是有几个难点或者说可以讨论的点:

        1. 共天线。 目前从协议讨论上看,在MLD的PHY中,是多个Link需要同时使用一根天线的,而且根据先行的硬件设计,Wi-Fi的天线其实与蓝牙BLE也是共天线的。另外一个很重要的就是Wi-Fi片内片外的资源都是非常吃紧的,所以在这种情况下实现MLD还是有技术难度的。

        2. Device间的干扰。虽说不同的Link(也就是对应到不同的Device)其是通过频段进行隔离的,但是由于其device的距离近,以及共天线等相关因素,所以Device间仍然有可能存在干扰。这种干扰被称为In-Device Coexistence (IDC) Interference。

        3. 在异步的情况下挖掘Multi-Link的可能性,比如一种典型的想法就是重传,让link 2给link1进行重传,这可以有效避免某一个信道的干扰,或者说用一个link做控制信道之类的。

      3. nstr难点:

        1. 同时开始,竞争机会

        2. 同时结束,对帧长度和发送速率的控制

  4. 启动eMLSR必须要保证是MLO(多链路)的,换言之,设备必须是MLD(多链路设备)

    1. 参考上一篇笔记,只需要向phy层添加多个channel,即可启动多链路功能

    2. 启动多链路后,可以在信标帧中看到响应的字段

      img

  5. 启动eMLSR过程:在ns-3的gitlab仓库中最新的WiFi 7示例程序中就有了eMLSR响应的字段,另外,在wifi-emlsr-test.ccDoSetup()方法中也有对应的设置字段

    1. std::string emlsrLinks;该字符串指定了在哪几个Link上启动emlsr

      1. 可以看到这个属性的类型为字符串,经过测试,Link序号从0开始,不需要左右的大括号

      2. std::string emlsrLinks = "0,1";

      3. 调用void ns3::WifiMacHelper::SetEmlsrManager函数进行设置

      4. 示例1:

        mac.SetEmlsrManager("ns3::DefaultEmlsrManager",
                                            "EmlsrLinkSet",
                                            StringValue(emlsrLinks)
                                            ...
        
      5. 示例2:

        mac.SetEmlsrManager("ns3::DefaultEmlsrManager",
                                "EmlsrLinkSet",
                                AttributeContainerValue<UintegerValue>(m_linksToEnableEmlsrOn),
                                ...