尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Wi-Fi协议中的SDU与PDU:从MSDU到PPDU的封装之旅

Wi-Fi协议中的SDU与PDU:从MSDU到PPDU的封装之旅 做Wi-Fi协议分析这几年我见过不少人在群里问同一个问题Wireshark抓包里明明看到的是MSDU、MPDU、PSDU、PPDU怎么一搜“PDU”却搜出一堆机架式电源分配单元更夸张的是真有人拿着公牛GNE-108E的电源PDU跑到无线技术帖里问这跟Wi-Fi有什么关系。这种术语撞车确实容易让人一头雾水但抛开这些乌龙不说SDU和PDU这两个缩写背后那套“分层封装”的逻辑才是理解Wi-Fi协议栈真正绕不开的一道门槛。这篇文章我从实际排查Wi-Fi问题的工作视角出发把SDU和PDU到底是什么、在协议栈里怎么流动、抓包时怎么从帧结构里认出它们、以及帧聚合技术如何改变了它们的形态一次讲透。不管你是刚开始学802.11的初学者还是在做无线抓包分析、吞吐调优的从业者这篇文章都能帮你把脑子里那根数据流转的链路彻底理顺。1. 从“快递打包”看SDU与PDU的本质1.1 SDU是楼上递下来的材料PDU是楼下递出去的包裹SDU的全称是Service Data Unit服务数据单元PDU的全称是Protocol Data Unit协议数据单元。这两个缩写看起来高大上其实用快递打包的逻辑理解起来特别简单。把协议栈想象成一栋写字楼。楼上部门写了一份报告要送出去它不会自己光着纸跑下楼而是把报告装进一个快递信封填好收件人、寄件人信息交给楼下收发室。在这个交接过程中楼上部门交给楼下部门的原始报告就是SDU而装好信封、写好了地址信息的完整邮件就是PDU。收发室收到这封邮件后如果要跨城市运输它还会把这封邮件再塞进一个更大的运输袋贴上运输面单交给快递公司。在快递公司眼里那个运输袋加上面单又是一个新的PDU而原来的邮件本身成了运输袋里的内容。每一层做的事情本质上就是两件把上一层交下来的数据当作货物加上这一层的“面单”协议头然后交给下一层。区别只在“货物”和“面单”在不同层里分别叫什么名字。1.2 同一个数据换一个视角就换一个名字很多人搞混SDU和PDU就是因为他们抓住一个名词不放却忽略了“从哪个层的视角看”这个关键前提。打个比方。你作为项目负责人把一份设计方案传给设计师这份方案在你这边叫“需求文档”。设计师拿到手之后把它和配色、字体说明一起打包变成“设计任务单”发给执行团队。在项目负责人看来你交出去的是需求文档在设计师看来他接收的是需求文档交出去的是设计任务单。同一份材料在交接线两侧叫法完全不同。SDU和PDU也一样。第N层从第N1层接收数据这份数据对第N层来说是SDU第N层把它加上自己的协议头有时还有协议尾封装好得到的是第N层的PDU再往下传给第N-1层。也就是说对于接收方层来说它从下层拿到的是一个PDU但这个PDU的载荷部分恰恰就是它要解析出来交给上层的SDU。一句话总结SDU是“我要送的东西”PDU是“包装好之后可以送出去的东西”。方向感一定要建立起来否则后面看Wi-Fi那一串带M、带P的缩写时还是会晕。1.3 上一层的PDU必然是下一层的SDU这句话是理解协议栈分层的枢纽。为什么因为协议栈相邻两层之间的接口对“货物”的叫法天然不同。以太网传输一个IP包时IP层把IP包封装好后交给数据链路层对IP层来说它是IP层的PDU但在数据链路层眼里这个IP包只是自己需要承载的SDU。数据链路层给它加上MAC头尾变成数据链路层的PDU再往物理层交物理层又把它当作自己的SDU来处理。所谓“上一层的PDU是下一层的SDU”不是说数据被复制了一份而是站在不同楼层的人给同一份数据起了不同的名字。把这个思路放到Wi-Fi里你就能明白为什么会有MSDU、MPDU、PSDU、PPDU这一串让人眼花缭乱的缩写——它们不是五种不同的数据而是同一份用户数据在穿过MAC层和PHY层这几道工序时不同视角下的名字。2. Wi-Fi协议栈里的四兄弟MSDU、MPDU、PSDU、PPDU2.1 MAC层入口MSDU是什么来头Wi-Fi工作在OSI模型的数据链路层和物理层具体到802.11协议栈最常打交道的是MAC层介质访问控制层和PHY层物理层。MAC层往上通常连接的是LLC层逻辑链路控制层LLC层负责复用和标识上层协议比如我们最熟悉的IP报文就是被LLC封装后交给MAC层的。MAC层从LLC层手里接到的数据就叫MSDUMAC Service Data Unit也就是MAC层的服务数据单元。注意MSDU的本质往往是完整的LLC帧里面封装着IP包但在MAC层这里它只是等待被包装的“货物”。有一种很常见的误解认为MSDU必须是一个完整的Ethernet帧。确实Wi-Fi数据帧的Frame Body里装的通常是LLC封装的Ethernet帧但这只是最常见的情况。严格来说MSDU的定义是“MAC层从上层收到的、需要由MAC层服务来传输的数据单元”它有时是Ethernet帧有时也可能是其他上层协议数据。但从抓包实战看你直接把MSDU理解成“那包用户数据”就够了。2.2 MAC层出口MPDU是加了Wi-Fi脑袋的用户数据MAC层收到MSDU后不能光着膀子把它扔到空气里必须给它装上802.11的MAC头让接收方知道这帧是谁发的、发给谁、属于什么类型、序列号是多少、要不要分段等等。包装完成后的结果就是MPDUMAC Protocol Data UnitMAC层协议数据单元。一个标准MPDU的结构大致是MAC Header包含Frame Control、Duration/ID、Address1到Address4、Sequence Control、QoS Control等字段Frame Body就是承载的MSDU内容或者A-MSDU内容后面会讲FCS帧校验序列放在尾部用来检测这帧在空中传输时有没有被破坏为什么802.11的MAC头里有4个地址字段而Ethernet只有源和目的两个地址因为Wi-Fi是无线链路一帧数据从发到收中间涉及的不只是源和目的还有可能在两个AP之间桥接或者涉及无线客户端和AP之间的BSSID标识。所以Address1是接收地址、Address2是发送地址、Address3是最终目的地址或源地址取决于帧方向Address4只在WDS无线分布式系统桥接场景下才出现。这正是MPDU区别于传统以太网帧的重要特征。2.3 PHY层PSDU交给物理层PPDU才真正上天MPDU封装完成后会向下传给PHY层。但这时候它又换名字了叫PSDUPHY Service Data Unit物理层服务数据单元。本质上PSDU就是MAC层送过来的MPDU只是站在PHY层的视角看它是等待被物理层封装的货物。PHY层拿到PSDU同样不会直接发射比特流而是要加物理层自己的“脑袋”——前导码Preamble和PLCP头Physical Layer Convergence Protocol Header。PLCP头里写明了这帧用的是什么调制方式、传输速率、长度信息接收端才能正确解析后面的数据。前导码的作用则是让接收端的射频电路完成信号同步。前导码、PLCP头、PSDU三者合在一起才构成真正在空气里传播的PPDUPHY Protocol Data Unit物理层协议数据单元。所以整条链路用一句话概括就是用户数据 → MSDU → MPDU → PSDU → PPDU。后者总是前者加了一层“包装”的结果。你只需要记住MAC层上面叫MSDUMAC层下面是MPDUPHY层上面叫PSDUPHY层下面是PPDU这个对应关系就再也丢不了了。3. 帧聚合机制下SDU和PDU的形态发生了哪些变化3.1 聚合的动机一帧传一包太浪费早期的802.11a/b/g时代每传一个数据帧链路都需要先竞争信道包括DIFS等待和随机退避传完后接收方还要回复ACK这个ACK又得再等一个SIFS短帧间隔。每个MSDU都这么单独走一遍完整流程真正的数据吞吐效率其实低得可怜尤其是在小包很多的场景下大量时间都耗在了“排队等红灯”上。你可以想象一下从办公室到仓库每取一份文件你都得走一遍完整的下楼、过门禁、上车的流程取一百份文件要重复一百次。如果能把一百份文件一次性塞进一个拖车拉走效率翻几倍。Wi-Fi的MAC层和PHY层也正是在这个问题上动了脑筋这就是帧聚合Frame Aggregation。3.2 A-MSDU多个SDU共享一个MAC头A-MSDU全称Aggregate MSDU是在MAC层上方做文章。它把多个MSDU拼接成一个更大的数据块这个数据块整体作为MPDU的Frame Body只加一次MAC头和FCS成为一整个大MPDU发出去。A-MSDU的每个子帧结构是Subframe Header包含目的地址DA、源地址SA和长度LengthData一个完整的MSDUPadding按4字节对齐填充保证接收方能整齐地切分各子帧正常情况下A-MSDU最多可以封装7935字节的载荷能塞下很多小数据包。它的价值在于节省了MAC头的重复传输也减少了竞争信道的次数。但它的短板也很明显因为整个A-MSDU被当作一个MPDU来传输如果空中传输过程出现错误FCS校验不过整个大帧就得整体重传无法只重传其中某一个受损的小MSDU。3.3 A-MPDU多个MPDU各自保留脑袋物理层打包A-MPDU全称Aggregate MPDU思路和A-MSDU完全相反。它不碰MSDU而是在MPDU层面做聚合把多个完整的MPDU每一个都带自己的MAC头和FCS拼装成一个大的PSDU交给PHY层封装成PPDU发送。MPDU之间用MPDU分隔符隔开分隔符里记录着这个MPDU的长度和校验信息。A-MPDU的好处是每个MPDU自带FCS接收端可以逐一判断哪个子帧坏了。配合Block ACK机制发送端只需要重传那些真正传错的MPDU而不是把整个聚合块都推倒重来。这也是为什么在高吞吐的802.11n/11ac/11ax时代A-MPDU成为提升Wi-Fi吞吐量的主力手段。3.4 A-MSDU和A-MPDU的一组对比选型思路更清晰对比维度A-MSDUA-MPDU聚合对象多个MSDU多个MPDUMAC头数量全部子帧共用一个MAC头每个MPDU保留各自的MAC头整体开销更小头部压缩效果明显较大但每个子帧独立可校验错误恢复一个MPDU出错整体重传或丢弃可定位到子MPDU按需重传典型组合常用于小包密集、时延敏感场景常用于高带宽、大流量传输场景实际设备上两者经常叠加使用先把多个MSDU聚合为A-MSDU再把包含A-MSDU的多个MPDU聚合成A-MPDU。这样既省了MAC头又保留了逐个MPDU确认的能力。理解这一点之后再看抓包文件里那些长达一两千字节的数据帧你就知道里面其实打包了不止一个用户数据包。4. 在Wireshark抓包里怎么一眼认出SDU和PDU的不同形态4.1 抓Wi-Fi的PDU需要先切换到监听模式很多人在Windows下用普通无线网卡抓包打开Wireshark看到的都是Ethernet帧而不是802.11帧。原因很简单普通模式下网卡驱动已经完成了解封装把收到的802.11帧还原成Ethernet帧再上交操作系统你根本看不到MAC头更别提MPDU、管理帧这些原始形态了。想看到真正的MPDU和PPDU相关信息需要把无线网卡切到监听模式Monitor Mode。在Linux下一般这样操作sudo ip link set wlan0 down sudo iw dev wlan0 set type monitor sudo ip link set wlan0 up切完后Wireshark就能抓到带802.11 MAC头的帧。但要注意不是所有网卡都支持监听模式Intel的部分无线网卡在Linux下可以很多Realtek芯片的USB网卡需要额外装驱动而某些厂商的网卡固件直接锁死了监听能力。如果你是想长期做Wi-Fi抓包分析建议备一块官方支持监听模式的USB无线网卡不然在驱动上会浪费大量时间。4.2 一帧一帧拆解从Radiotap到MAC头到Data在Wireshark里打开监听模式抓到的包你会发现每一帧都有固定的几个解剖层。首先是Radiotap头它记录了物理层的信息比如信道频率、信号强度、数据速率、MCS索引、是否属于聚合帧等。这就是你离PPDU最近的地方因为在普通抓包方式下Wireshark拿到的是经过物理层处理后交给上层的PSDU数据前导码和完整的PLCP头已经由硬件消费掉了Radiotap头里保留下来的只是物理层参数的“收据”。然后是802.11 MAC头这就是MPDU的身份证明。展开后能看到Frame Control里记录着帧类型管理帧/控制帧/数据帧和子类型Address字段记录着接收地址、发送地址、BSSID等。再往下是Frame Body这个区域承载的就是MSDU。如果你看到Frame Body里又套了多个DA/SA/Length子结构说明这帧是A-MSDU聚合帧Wireshark会专门把子帧拆开来展示。4.3 一个真实抓包案例看HTTP请求如何穿成穿那串术语有一次排查手机连接AP后网页打开慢的问题我用监听模式在AP旁抓了一个HTTP请求的完整交互。具体流程大致是这样的手机上的TCP层发一个HTTP请求经IP封装后交给LLC层LLC加上SNAP头封装成MSDU。这个MSDU进入MAC层后被打进一个QoS Data帧一种带有QoS优先级的802.11数据帧即MPDUAddress1写的是AP的BSSIDAddress2写的是手机的MAC地址Address3写的是网关的MAC地址QoS Control字段记录着访问类别的TID。如果此时AP启用了A-MPDU聚合这个MPDU会和旁边几个MPDU拼在一起变成一个大PSDU再到PHY层被包装成携带MCS索引和带宽信息的PPDU发射出去。在Wireshark里你看到的就是一条“QoS Data”记录Radiotap头里是速率和信道信息802.11头里是四种地址Data区域是一个完整的IP报文。把这几个字段串一遍你就等于用肉眼完整走了一遍从MSDU到PPDU的封装之旅。4.4 判断聚合是否生效字段不会骗人做Wi-Fi吞吐优化时我经常在抓包里先看三个指标来判断聚合策略有没有生效抓包文件里数据帧的平均长度、Radiotap头里是否出现A-MPDU聚合标志、以及Wireshark的“Analyze”菜单下的流量统计里有没有大量非数据开销帧。如果信号强度很好Ping延迟正常但大流量下载时吞吐上不去打开抓包一看每个数据帧的Frame Body都只有几百字节而且几乎看不到A-MPDU聚合标志那问题多半不在信号而在驱动或AP配置把帧聚合关掉了或者在用很保守的聚合参数。沿这条线索去查驱动日志、AP配置往往比盲目调天线方向管用得多。5. 别再把电源PDU和Wi-Fi的PDU混为一谈顺便聊聊S7协议里的PDU5.1 “PDU”这个缩写在不同行业里是同一个词、完全不同的东西因为PDU三个字母太通用不同领域都拿它当缩写用所以搜索“PDU”经常搜到完全无关的东西。最典型的就是机架式PDU电源分配单元比如公牛GNE-108E这种1.8米电源线的机架式插排它是给数据中心机柜里的服务器供电用的。这一类PDU是电力设备不是网络协议数据单元和服务数据单元SDU更是八竿子打不着。还有一个热度不低的搜索词叫“西门子S7协议PDU”。S7是西门子PLC的通信协议它跑在ISO-on-TCP之上S7 PDU承载在TPKT的包体里。这里的PDU也确实是“协议数据单元”的意思用于携带S7协议的请求和响应数据但从协议栈归属来说它是工业现场总线/工控网络里的概念跟Wi-Fi 802.11里的PHY、MAC层PDU完全是两个体系。这种“同名不同义”其实特别考验一个排查人员的术语敏感度。如果你看到一个技术文档出现PDU第一反应一定不要默认它是某一种东西而是先确认它出现在哪个协议栈、哪个层、哪个行业语境里。在Wi-Fi语境里聊PDU你讨论的是802.11协议数据单元在机柜配电语境里聊PDU你讨论的是电源分配单元在TIA/EIA综合布线里也有PDU这个缩写那又可能是配线设备的意思。一字之差概念差出整个行业。5.2 初学者最容易踩的三个概念坑第一个坑是把MSDU和MPDU的关系想成“一定一一对应”。没有帧聚合时确实一个MSDU装进一个MPDU但启用A-MSDU后多个MSDU被拼在一个MPDU里启用A-MPDU后多个MPDU又拼在一个PSDU里。所以看到MPDU就去猜里面只有一个MSDU在11ac/11ax时代常常会猜错。第二个坑是以为Wireshark能直接显示PPDU。说实话普通网卡抓包后Wireshark展示的更多是MPDU和MSDU层面的信息PHY层的前导码和完整PLCP头已经由硬件消化掉了你只能通过Radiotap头间接了解物理层参数。执着于在抓包里找到“完整PPDU”的bit级视图是没有必要的。第三个坑是不带参考层直接问“这个包是SDU还是PDU”。同一个包站在LLC层看是LLC PDU站在MAC层看是MSDU站在PHY层看又是PSDU。你得先固定自己站在哪一层才能给这段数据正确地命名否则永远吵不明白。5.3 把SDU和PDU搞清楚Wi-Fi排障会顺手很多我个人体会最深的是SDU和PDU这套概念不是书斋里的名词游戏而是排查Wi-Fi性能问题时的思维地图。比如你分析一个“信号满格但网速上不去”的问题脑子里如果有MSDU→MPDU→PSDU→PPDU这条链路你就会自然地去想瓶颈出现在哪一次封装是MAC层竞争开销太大是帧聚合策略不对还是PHY层速率因为环境干扰被迫降到了最低不同的瓶颈位置对应的调整手段完全不同。之前调一个办公室无线的吞吐问题信号强度始终在-45dBm左右链路质量看起来很好但出网测速就是跑不满。起初一直在AP天线和信道干扰上折腾没什么起色。后来把AP侧抓包翻出来看发现数据帧的聚合程度非常低A-MPDU里经常只带两三个子帧而且子帧全是小包。顺着这条线索查下去发现是网关侧有大量TCP小包触发Nagel算法延迟导致MSDU堆积节奏不佳聚合器“无货可聚”。调整MTU和TCP确认机制后聚合效率明显改善吞吐也跟着上去了。这个过程里如果没有“发送大包和聚合单位”的概念作指引很容易在射频信号层面空转。6. 最后分享一个自用的理解方法如果你现在还是觉得SDU和PDU容易绕我建议你做一个特别简单的动作去Wireshark自带的示例抓包文件里找一条802.11数据帧把它展开把MAC Header里每一个字段都念一遍然后在心里复述一遍“这是MPDU的开头后面的Frame Body就是MSDURadiotap里的速率和带宽信息说明它曾经是一个PPDU的一部分”。亲手拆一帧比看十篇理论推导都有用。再补充一个技巧在Wireshark里给802.11数据帧加一个显示过滤器比如只显示QoS Data且长度大于1000字节的帧你会很直观地看到聚合帧长什么样。挑几帧长度超过1500字节的展开Data部分看它包含多少个小包那一刻你对A-MSDU和A-MPDU的体会会比读任何文档都深。Wi-Fi协议栈里的SDU和PDU说难也难毕竟缩写套缩写说简单也简单核心就是一句话每一层把上一层的货物打包、贴上面单、交给下一层一层一层传下去到了对端再一层一层拆开。理解了这套封装和拆解的节奏再看802.11里的各种术语心里就有了一幅清晰的路线图。后面如果想进一步深入可以从EAPOL握手看MSDU如何承载认证流程也可以从Block ACK机制看MPDU如何被逐个确认这些内容我们就留到系列后面再聊。
返回列表