MAC:我说你最后一节车厢空荡荡多浪费!
PHY:这个锅我不背。谁让你给我的乘客人数这么膈应。
MAC:怪我喽?
(注:PHY物理层,就是负责通过天线收发一个个bit的最底层,喻为火车。MAC层,媒体访问控制,会把一包包数据交给PHY发送,或者从PHY接收bit,变回一包包数据,可看做闸机,决定往站台放多少乘客)
有了上两篇 火车难题https://zhuanlan.zhihu.com/p/530712790和 为何有时WiFi速度那么慢https://zhuanlan.zhihu.com/p/531552862,想必大家对于上层数据包大小与PHY这列火车能力的匹配问题有所了解了。前面介绍的都是古老的WiFi4(802.11n)及之前的情况。来到WiFi5(802.11ac)时代,人们开始对这个问题开刀,方法就是向上甩锅!
首先来回顾一下WiFi4(802.11n)里这种不匹配的情况:
上图中因为16+N+6 bit数超过了3个OFDM符号的承载力3*N\_DBPS bit,因此不得不用4个OFDM符号,所以第四个OFDM符号里有大量的填充bit(N\_pad bit)。
时间来到WiFi5(802.11ac)时代,PHY在每个OFDM符号内的bit承载能力相比WiFi4又得到了很大提升(更大带宽,更多MIMO流),一方面这显著提高了数据率和用户体验,另一方面这也意味着最后一个OFDM符号里的浪费(可能)更大了。想象一下,为了装下最后一名乘客,启用一节50个座位的车厢(WiFi4)VS一节100个座位的车厢(WiFi5)。
因此802.11ac中,PHY把数据填充的主要责任推给了MAC(甩的一手好锅)。如下图。
PHY在802.11ac中只负责在最后填充0~7bit(以备PHY的bit承载能力不是8的整数倍,即整数个字节),而且这些填充bit放在了6个0尾bit之前而不是像802.11n那样之后。剩下的就是PHY能承载的最多字节数(即PSDU_LENGTH字节),全部交由MAC来负责。此时要浪费也是MAC的锅了。(所以工作中不要轻易提意见啊,你提了意见那就你来做喽!)
这里就要提到802.11ac和802.11n中MAC把包交由PHY发射的机制改进了。在802.11n中,MAC只需调用一次PHY-TXSTART.request原语,告诉PHY要发送的包长即可(当然也包括一些其他参数,例如MCS等。所有参数打包为一个TXVECTOR--发送向量结构,给PHY用)。然后PHY自行决定需要在最后填充多少bit。这也是最后一节车厢可能浪费很多座位的原因,因为MAC要发送的包长在它要求PHY发送的时刻就最终确定且不可更改了,而这个包长可能就是那么“不幸”的多出了1个bit从而需要PHY多一节车厢,PHY也感到很无辜。
而在802.11ac中,MAC发包需要先协商再启动,经过两步而不是像802.11n那样只有一步。这两步分别是:
- MAC调用PLME-TXTIME.request原语来告诉PHY关于发送多少字节的初步想法(其实是完整的TXVECTOR,只不过长度是初步的APEP\_LENGTH),PHY经过一番计算,通过 PLME-TXTIME.confirm原语向MAC确认自己的精确承载能力,即PSDU\_LENGTH字节数。
- 收到PHY的confirm后,MAC会经过一番斟酌,想尽各种办法组一个包最大限度的利用这PSDU_LENGTH字节(但绝不可超过),然后通过PHY-TXSTART.request原语,启动实际的PHY发送。
聪明如你一定想到了,这只不过是把填充的责任从PHY推给MAC了而已,实际问题没解决啊。实际上这为解决问题提供了某种程度上的可能性。原因有三:
- 引入了PHY和MAC的协商机制(request/confirm原语),使得MAC在启动PHY发送前预知了精确的PHY能力,从而可以做一些必要的调整,尽量避免MAC自身的无效填充,因为真正的发送还没开始,还有调整的余地。
- 在802.11n中引入的AMPDU(聚合的MAC PDU),在802.11ac中变为必须使用,哪怕MAC不聚合多包而只发一包数据,都需要使用AMPDU格式。而在802.11n中AMPDU是可选的。因此MAC对于控制包长有了更大的灵活度(自行决定选择哪些长度的MAC PDU来聚合)。
- AMPDU具有完善的(复杂的)“长度自解释”和灵活的填充机制。长度自解释是指聚合的各个MAC PDU之前会插入它的描述符(delimiter),描述符中包含精确的其后的MAC PDU的长度信息。填充机制即允许在各个MAC PDU之间和之后插入任意数量的空描述符(每个4字节),以及各字段之后插入0~3字节。
由于AMPDU的自解释性,它带来的另一个好处是在数据OFDM符号之前的SIGNAL域(火车头处)不再需要像802.11n及以前一样携带精确的长度信息,可节约宝贵的SIGNAL域里的bit。
以上基本解释了在802.11ac中如何解决发射端更充分有效的填满各个车厢(数据OFDM符号)的问题。遗留的两个问题是:
- 为何现在把6个0的尾比特(tail)和PHY填充调换了位置?802.11n及以前是先tail后pad,从802.11ac开始是先pad后tail。
- 现在6个0的尾比特(tail)被放到了最后,接收机的Viterbi解码器必须工作到最后一个数据OFDM结尾,从而无法提前终止了吗?还是仍旧有办法提前在PHY填充之前就终止,甚至在AMPDU还没结束时就终止?
这两个问题留给各位思考了。(或者等我下一篇给你接着编)
作者: 纸飞机
原文链接:知乎
推荐阅读
更多IC设计技术干货请关注开源芯片/FPGA设计技术专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。