首页 > 编程语言 >NS-3源码学习(五)手搓一个multi-Link的WiFi7系统

NS-3源码学习(五)手搓一个multi-Link的WiFi7系统

时间:2023-11-29 17:34:12浏览次数:63  
标签:multi 04 00 mac 信道 源码 Link ff channel

NS-3源码学习(五)手搓一个multi-Link的WiFi7系统

目的

   <--Channel - 0-- 
AP                  STA
   <--Channel - 1-

创建一个一AP,一STA的系统,这两个结点通过同一载波频率。同一信道宽度但不同的中心频率的两个不同信道号的信道相连,观察数据传输的过程。

就结果来看,虽然是muti-Link了,但是在运用上是交替的使用这两个Link,数据传输速率并没有提升。

杂记

  1. src/propagation/model/propagation-loss-model.h

    • 这里存放了一些信号损失模型,在Channel中添加这些损耗模型有助于使仿真更加真实

    • 本人思考:重要的是,可以利用这些损失模型来人为的制造一些干扰、信号错误,来观察WiFi7的应对策略

    • 向Channel中添加模型:

    Ptr<MultiModelSpectrumChannel> spectrumChannel = CreateObject<MultiModelSpectrumChannel>();
    Ptr<LogDistancePropagationLossModel> lossModel = CreateObject<LogDistancePropagationLossModel>();
    spectrumChannel->AddPropagationLossModel(lossModel);
    
    • 尚未学习:
    1. 当前ns-3中已经有了哪些模型?他们的作用是什么

    2. 如何正确的去设置这些模型的参数

    3. 如果想要自建一个模型,应该怎么去做?重写哪些函数?返回怎样的数据?

  2. 两个信道和多个信道的实验:

    我先写了一个含有两个信道的物理层,两个信道分别为:

    std::string channelLink0 =
            "{36, 20, BAND_5GHZ, 0}"; // {channel number, channel width (MHz), PHY band, primary20
                                    // index} from wifi-phy.cc
    std::string channelLink1 =
        "{40, 20, BAND_5GHZ, 0}"; // {channel number, channel width (MHz), PHY band, primary20
                                // index} from wifi-phy.cc
    

    然后又使用了一个信道和其做对比,一个信道的参数为:

    std::string channelLink0 =
            "{36, 20, BAND_5GHZ, 0}"; // {channel number, channel width (MHz), PHY band, primary20
                                    // index} from wifi-phy.cc
    // std::string channelLink1 =
    //     "{40, 20, BAND_5GHZ, 0}"; // {channel number, channel width (MHz), PHY band, primary20
    //                               // index} from wifi-phy.cc
    

    经过测试,发现双信道会输出2*2个pcap文件,第一个2代表ap和sta,第二个2通过阅读pcap文件发现,代表了两个信道,而且这两个文件的大小非常接近,几乎都是90,000kB左右。

    而单信道仅输出了1*2个pcap文件,该文件大小约为174,000kB,大约是上述两个pcap文件的和

    阅读双信道输出,可以得到如下结果:

    • 我在双信道仿真代码中添加了如下信息:
    std::cout << "Number of apDevice " << apDevice.GetN() << std::endl; 
    std::cout << "Number of staDevices " << staDevices.GetN() << std::endl;
    
    Server IP address: 192.168.1.1
    Server MAC address: 03-06-00:00:00:00:00:01
    Client IP address: 192.168.1.2
    Client MAC address: 03-06-00:00:00:00:00:04
    Number of apDevice 1
    Number of staDevices 1
    MCS value               Channel width           GI                      Throughput
    13                      20 MHz                  3200 ns                 123.287 Mbit/s
    
    • 出现的mac地址有:

      • 01

      • 02

      • 03

      • 04

      • 05

      • 06

    • 广播信标帧的mac地址有:

      • 06:使用40Channel

      • 05:使用36Channel

    • 使用36Channel的有:

      • 05:发送信标帧

      • 02:向05请求连接,Association request

      • 04:这个含有04的数据帧中,地址字段如下:该数据帧为ARP广播数据帧,来源是04,经过05进行转发广播

      IEEE 802.11 QoS Data, Flags: ......F.C
          Type/Subtype: QoS Data (0x0028)
          Frame Control Field: 0x8802
          .000 0000 0000 0000 = Duration: 0 microseconds
          Receiver address: Broadcast (ff:ff:ff:ff:ff:ff)
          Transmitter address: Xerox_00:00:05 (00:00:00:00:00:05)
          Destination address: Broadcast (ff:ff:ff:ff:ff:ff)
          Source address: Xerox_00:00:04 (00:00:00:00:00:04)
          BSS Id: Xerox_00:00:05 (00:00:00:00:00:05)
          STA address: Broadcast (ff:ff:ff:ff:ff:ff)
          .... .... .... 0000 = Fragment number: 0
          0000 0001 0101 .... = Sequence number: 21
          Frame check sequence: 0x00000000 [unverified]
          [FCS Status: Unverified]
          [WLAN Flags: ......F.C]
          Qos Control: 0x0020
      
    • 使用40Channel的有:

      • 06:发送信标帧

      • 03:

        • 向06发送了Null function帧,而后06回复了ack

        • 回复ARP协议的请求,信息中显示要寻找的ip地址在01这个mac地址

      • 04:

        • 在40号信道上,使用04的帧有以下三种:

        • ARP广播帧,源是04,但经过了06的转发

        • ARP回复帧,源是03,目的是04,但接收者是06,该回复帧出现了两次,两次的不同在于:

          1. 字段radiotap.ampdu.flags.last,后一个指示该帧为A-MPDU最后一个帧

            .... .... .... 0... = This is the last subframe of this A-MPDU: False
            
            .... .... .... 1... = This is the last subframe of this A-MPDU: True
            
          2. 数据帧的序列号wlan.seq

    • 经过上述实验,可以看到ns-3对于单设备多信道的仿真结构如下图所示:

      img

      • 其中,对于WiFi的认证和回复(Association request和Association response)仅在channel 36的两个mac上进行

      • 对于信标帧的广播,ap在两个channel上的mac(05和06)都会进行广播

      • 然后开始UDP通信,本次通信过程中可以看到miss了一些包

      • 但并不懂为何会miss,除了添加了新的channel之外,其他部分都是照抄的example文件,example文件仿真的结果中并没有miss

      • 被miss的包在block ack后被重新发送,而且在重新发送的时间段中还发送了新的数据帧

      • 这里有一个问题,本次udp通信的长度并没有达到块确认请求中请求的缓冲区大小,即被提前块确认了

        • 猜测应该有一个字段指示要求立刻进行确认,但是我还没有找到这个字段

        • 也有可能接收端的等待时间达到阈值,自动触发了block ack

      • 在UDP通信中可以看到两个信道交替发送数据,而不是同时发送数据

        • 可能是因为我仅建立了一个UDP连接,下次尝试建立多个UDP连接,看看能不能同时发数据
      • 在UDP通信中,无论是在36号信道上,还是在40号信道上,源mac地址是一致的,但目的mac地址有所不同

        • Source address均为04

        • 在36信道上,目的mac地址是02,经过了05的转发

        • 在40信道上,目的mac地址是03,经过了06的转发

        • 这两个信道上的目的mac地址都不是01,而根据arp数据包的内容来看,目的ip地址对应的mac地址是01。这个在40信道上还好解释,因为是03回复的arp广播,因此建立mac表的时候将目的ip映射到03上很合理,但36信道上为何会发给02就很意外,并没有帧告知02和01相关联

        • 下次尝试在同一个信道中接入多台设备,观察UDP数据包的目的mac地址会发生什么变化

代码

https://gitee.com/zgBCQ/ns-3_scratch/blob/master/StaApLinkLink.cc

标签:multi,04,00,mac,信道,源码,Link,ff,channel
From: https://www.cnblogs.com/polariszg/p/17865425.html

相关文章

  • SpringBoot电子病历编辑器源码
    电子病历系统以服务临床业务工作开展为核心,为全院医护人员、业务管理人员、院级领导提供流程化、信息化、自动化、智能化的临床业务综合管理平台。同时,随着电子病历数据的不断累积,它将成为动态的智能的信息源,发挥传统纸质静态病历难以实现的重要作用,为医务人与的科研、教学提供准......
  • Java集合框架之:LinkedList的常见方法使用
    ✨前言✨本篇文章主要介绍JavaLinkedList的使用方法教程及示例代码......
  • Multisim 波特图仪使用方法
    波特图仪(BodePlotter)是用于测量一个电路或系统的幅频特性和相频特性的仪器(类似于实验室的幅频特性测试仪)。波特图仪连接:波特图仪与电路连接如图所示。波特图仪本身没有信号源,所以必须在电路输入端口接入一个交流信号源。 波特图仪分析: 波特图仪的图标包括4个接线端:in是......
  • CBV源码分析
    1.路由配置path('index/',视图类名.as_view())#as_view是类的绑定方法2.执行流程(分析)path('index/',index),--->请求来了,路由匹配成功会执行index(request,)path('index/',UserView.as_view()),--->同样的,请求来了,路由匹配成功则会执行UserView.as_view()(r......
  • JsonResponse源码分析
    1.视图层返回JsonResponsereturnJsonResponse({'name':'kevin','age':19})2.触发JsonResponse的__init__方法将{'name':'kevin','age':19}传给data3.源码分析def__init__(self,data,encoder=DjangoJSONEn......
  • 图文剖析 big.js 四则运算源码
    big.js,一个小型、快速的用于任意精度的十进制算术的JavaScript库。big.js用于解决平常项目中进行算术运算时精度丢失引起的结果不准确的问题。和big.js类似的两个库bignumber.js和decimal.js也都是出自同一作者(MikeMcl)之手。作者在这里详细说明了他们之间的区别big.......
  • 微信小程序实现语音录制(uni-app源码版)
    注意以下代码只是部分代码,已经将完整代码上传至插件市场,可在插件市场中下载。插件下载地址1.创建音频对象上下文//创建音频上下文letinnerAudioContext=uni.createInnerAudioContext({useWebAudioImplement:false,})this.innerAudioContext=in......
  • 视频直播源码,采用Redis实现购物车功能
    视频直播源码,采用Redis实现购物车功能1Redis核心配置类packagecom.jmh.springboot03.config; importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.beans.factory.annotation.Configurable;importorg.springframework.context.annot......
  • 手机直播源码,js实现懒加载、vue实现图片懒加载指令
    手机直播源码,js实现懒加载、vue实现图片懒加载指令图片懒加载监听滚动条滚动事件,当视口的高度+滚动高度,大于图片所在位置举例顶部的偏移量时(也就是距离),加载图片资源 index.html<!DOCTYPEhtml><html> <head>  <metacharset="UTF-8">  <metaname="viewport"conte......
  • NS-3源码学习(四)wifi-ent-network.cc
    NS-3源码学习(四)wifi-ent-network.cc设定的参数booludp{true};udp/tcp通信选择booldownlink{true};AP->STA:downlink=true/STA->AP:downlink=false数据发送方向选择booluseExtendedBlockAck{false};启用扩展块确认,默认不启用,即块确认的大小为64,启用......