序言

终于到了802.11ah MAC优化的第一节,帧长度压缩的最后一个部分,NDP控制帧的优化。其实802.11ah的帧长度优化思路是挺明确的,一开始讨论的是S1G MAC Header的压缩,这个是通用的,而且也能用到数据帧上,然后就是Short Beacon,实际上是对应的管理帧。我们知道802.11协议中还有一种类型的帧,为控制帧,比如RTS,CTS,ACK之类的都属于控制帧,这一类如何优化呢,就是本文所讨论的NDP控制帧(NDP CMAC Frame)环节了,这里NDP CMAC的全称为Null Data Packet (NDP) Carrying Medium Access Control information (CMAC)。802.11ah的NDP CMAC Frame优化的基本思想,就是把MAC Header整个省掉,把相关信息全部压到物理层头部中,从而就实现帧体压缩了。

为什么要优化ACK

802.11协议中的ACK其实是传输过程中一笔不小的开销,在802.11n时代下,如果单纯只跑普通的ACK,那么ACK过程大概要占整个传输过程的30%左右。以一次ACK的开销时间为例子,其为SIFS+ACK的传输时间。ACK的传输速率并不能采用最高速率,按照协议规定,ACK这样的控制帧,其采用的速率最高可以到协议中规定的必选速率,但是无法上升到更高的可选速率。以802.11g时代为例,最高可选速率是54M,但是印象里面最高必选速率是24M。而且通常情况下,为了提高接收的准确性,以及还有因为数据帧中有预设Duration的原因,ACK通常是以最低速率反馈的。综上,如果每一个数据帧都需要反馈ACK,那么这笔开销还可以了。

标准的802.11协议的优化策略是Block ACK:所以为了节约ACK的时间,标准的802.11系列协议是采用了Block ACK的方式,该方式一方面是针对新型的MAC接入方案(比如TXOP,帧聚合)之类顺应提出的。另外一方面,采用Block ACK减少ACK的次数。而且由于标准的Wi-Fi是数据相对饱和的场景,即每一个节点其实都有不少数据待发,所以本身场景是倾向于ACK本身就比较多的,所以合并ACK就必然是一个可行的思路。不过Block ACK本身机制而言,并不简单,这里其实引入了类似会话机制了,而且Block ACK的重传也有一些具体设计,这里我们并不展开了。

802.11ah的优化策略是CMAC NDP Frame:802.11ah的场景和普通的802.11有点区别,因为要覆盖大节点这样的场景,而且基本模式下,由于带宽受限,其传输速率也没那么高,每一个节点能够分配到的传输时间实际上是比较少的,对应到其ACK反馈也就比较少了。因此,合并ACK这条思路在802.11ah中并不是最可行的,所以解决思路就是直接下手优化控制帧了。这里我们主要以ACK控制帧为例给一个控制帧为什么优化的说明,在802.11ah中,CMAC NDP Frame不是直接对标ACK的,而是所有的控制帧都可以按照这种方式优化,因此,CMAC NDP Frame的应用场景实际上是更灵活的,另外802.11ah里面也有block ack,而且也是一共CMAC NDP机制来做的。而且更扩展的说,除了控制帧能降到NDP里面,还有个别的管理帧也降到NDP里面了。

Null Data Packet (NDP) 简述

NDP大致简述下,关于NDP的细节和标准用法可能要等以后整理协议精读到802.11ac的时候再谈这件事情了。NDP帧首次应该是在802.11n里面,在802.11ac时候用法比较典型。

关于802.11中的Null帧,在NDP以前还有一个地方出现过,就是在Polling机制(应用在节能模式或者PCF接入模式中)。那个时期定义的Null实际上是一种MAC Null帧。该帧包含了PHY Preamble,PHY Header,MAC Header,FCS,仅仅MAC层的Payload,即MSDU是等于0的。这种Null帧主要是在polling的时候,如果请求对象没有数据帧要反馈,那么就反馈个Null,也就是空,代表没东西反馈,如果有数据才反馈数据。

在802.11ac里面,典型的场景就是MU-MIMO对应的多节点信道测量过程,NDPA-NDP-Beamforming Feekback的过程。其中NDP的帧结构就是PHY Preamble+PHY Header,没有MAC帧的头部和MSDU,而且由于FCS也是MAC层的,所以也省了。NDP的主要过程是应用其中Preamble部分的LTF部分做信道CSI测量,节点需要获知该信息用于构造预编码矩阵,以实现物理层的MIMO或者MU-MIMO。不过在802.11ac中,NDP基本就是一个测量性质的帧,并没有体现出其他的功能。

802.11ah中的NDP Frame

NDP帧就是仅仅只有物理层Preamble和PHY header的帧。如下图所示

其中STF和LTF可以理解成Preamble部分(这点其实可以这样理解,但是其实和协议定义有点对不上,这里有点历史遗留的定义问题),然后是PHY Header,也就是对应的SIG字段,SIG是用来存储对应MSDU部分如何解调的物理层信息的。在802.11ah中,并不是所有的NDP都是作为CMAC用的,在前面一开始的两篇文章里面说了,802.11ah是基于802.11ac的技术基础,是基于多天线的传输技术的,所以既然有了多天线就需要做NDP测量,所以在802.11ah中也会存在传统的NDP帧。所以先总结下,802.11ah中一共有两种NDP帧:

一种是用来做信道测量的普通NDP帧,这种NDP帧在协议上称为S1G NDP Sounding。

还有一种就是用来控制的特殊NDP CMAC Frame。

普通的NDP其实和标准的802.11差不多,本文就不关注了,下面我们关注NDP CMAC Frame。

802.11ah中的NDP CMAC Frame

首先我们给出NDP CMAC Frame的示例,左边的是1Mbps时候的CMAC NDP,右边是2Mbps时候的CMAC NDP。结构上都一样的,在802.11ah中,SIG的长度还与速率模式有关,1M模式下是36B,2M以上的模式下是48B。

那么下面要关注的问题就是,如何识别这个NDP帧到底是普通NDP还是NDP CMAC。

参考上图的1M模式,主要参考其SIG的第25B位置上,NDP Indication字段,

NDP Indication=0,那么就是S1G NDP Sounding。

NDP Indication=1,那么就是NDP CMAC Frame。

在确认该NDP帧是NDP CMAC Frame后,还需要进一步确定这是哪一种控制帧。在NDP CMAC Frame中,SIG中可以嵌入多种802.11ah的帧信息,主要控制帧,另外还有一个特殊的管理帧,如下图所示:

那么如何确定这是哪一种控制帧呢,我们主要关注SIG中的NDP CMAC frame body字段

以ACK模式的NDP CMAC Frame打开为例,其首先开始的3个Bits,用来体现该NDP CMAC的类型,不过后面的剩余字段,其实并不是固定的。这个和前面在MAC Header压缩里面说过的一样,是多重Flag解析的方式,其Type后面的字段是根据Type字段本身来解析的。

使用以上的设计机制,802.11ah就可以把原来多种的控制帧,将其信息都对应压入到NDP帧中,从而减少了帧长度,优化传输效率。

本文为原创文章,如需转载须注明出处和原文链接。

欢迎大家关注我们的微信公众号:无线技术大讲堂,请搜索公众号(must_wireless)。

奔跑吧linux内核知乎,802.11ah(HaLow)协议解析7:NDP控制帧(NDP CMAC Frame)相关推荐

  1. 《奔跑吧Linux内核》开始预售啦

    <奔跑吧Linux内核>经过了2个多月的等待,已经在几大网店上开启预售啦,预计10~15天后陆续发货啦! 京东预售 亚马逊 异步社区 当当 *全球首发,等您来撸! *全球首本,等您吊打! ...

  2. 《奔跑吧 Linux内核》之处理器体系结构

    本文摘自人民邮电出版社异步社区<奔跑吧Linux内核> 第1章 处理器体系结构 京东购书:item.jd.com/12152745.ht- 试读地址:www.epubit.com.cn/b ...

  3. 奔跑吧Linux内核20题,《奔跑吧Linux内核》奔跑卷答案获取方式

    在阅读<奔跑吧Linux内核>之前,我们请读者用两小时来完成Linux内核奔跑卷,对Linux内核了解程度做简要的了解.奔跑卷仅仅是Linux内核知识的娱乐游戏节目,希望能给读者带来一丝乐 ...

  4. 《奔跑吧linux内核》,《奔跑吧linux内核》配套资源迁移到码云上

    很多小伙伴抱怨<奔跑吧linux内核>的配套O0的内核从github上git clone经常不成功,而且速度很慢,为此笨叔把O0的内核迁移到码上,下载速度是杠杠的.这回大家不用大家下载速度 ...

  5. 奔跑吧Linux内核入门篇实验

    第一章 奔跑吧Linux内核入门篇实验4命令记录** export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabi- make vexpress_def ...

  6. 奔跑吧Linux内核最新目录

    <奔跑吧Linux内核> 即将和大家见面,敬请关注! 敬请关注<奔跑吧Linux内核>,即将和大家见面. 微信号:runninglinuxkernel 微博/微信公众号:奔跑吧 ...

  7. linux内核添加spi驱动,Linux内核驱动之spi子系统spi协议.docx

    Linux内核驱动之spi子系统spi协议 概况 SPI接口是摩托罗拉首先提出的全双工三线同步串行外围接口SCK,MOSI,MISO,采用主从模式(Master Slave)架构:支持多slave模式 ...

  8. 奔跑吧Linux内核初识

    断更新博客有一段时间了.入职两年了一家创业公司,那是真心的累,当然了获得了技术上很大的提升.搞了两年的vr产品,唯一遗憾的是,平台是ST单片机,远离了系统级别的知识.回看刚出校园时的三年计划,和第一年 ...

  9. 内核 入门_好消息:奔跑吧Linux内核入门酱香篇配套视频可以下载啦

    有不少小伙伴给笨叔留言,能不能直接提供入门酱香篇的配套视频下载啊?我问:B站有,为啥要下载?答曰:收藏!笨叔一时被感动了,我马上把这本书配套视频的原始文件共享出来,而且以GPL v2的协议分享,大家可 ...

最新文章

  1. Linux中的日志系统介绍
  2. mysql+PHP源码编译安装
  3. poj1321 DFS
  4. C语言学习之编程实现:输入长方形的两个边长a, b和一个整数k。k=1时,输出长方形的周长 l; k=2时 ,输出长方形的面积s;当k=3时 , 输出长方形的周长1和面积s
  5. Linux操作系统启动流程简单介绍
  6. 数据结构 二叉树的存储结构_线程二叉树| 数据结构
  7. Node18 即将支持 import HTTP资源!
  8. 电脑删除的文件怎么恢复?你要找的方案
  9. java两个日期之间所有日期_java如何输出指定两个日期之间的所有日期
  10. 最小,独立,可分发的跨平台Web服务器
  11. Visual Studio Code如何打开多个tab标签
  12. 蛋白组学搜库分析软件 MaxQuant使用教程
  13. 包装严重的IT行业,作为面试官,我是如何甄别应聘者的包装程度!
  14. 2021届毕业生还没找到Android开发工作,看这一篇就够了!
  15. 华芯微特SWM32SRET6-50控制器应用记录
  16. 世界首个四足后空翻MIT机器猎豹踢足球,网友惊呼:终结者来了!
  17. 安卓demo,新手开发教程之开发备忘录
  18. 转载:Ajax控件视频教程下载地址
  19. 【C语言/C++学习】初识C语言(三)
  20. 第 1-1 课:为什么要掌握 Flutter?

热门文章

  1. Pytorch统计模型参数量和计算量
  2. Flash Helper Service 这个流氓,动不动弹出广告!!
  3. Label Matching Semi-Supervised Object Detection
  4. php 里面的echo啥意思,echo的含义 echo 有哪些含义,有什么功能
  5. docker三剑客之 Docker Machine Docker Compose Docker Swarm
  6. android生成md5,使用Android studio生成签名文件以及获取MD5
  7. SSH——Hibernate初学者之旅(四)
  8. FZU 1685 跑跑卡丁车
  9. flask----后续
  10. 一.pandas的导入读取