☰
802.11帧控制字段逐位解析:从抓包实验到tshark自动化验证
2026/9/27 1:20:10 网站建设 项目流程

简介:这份PDF实验报告面向计算机网络与无线通信方向的学生及自学者,围绕802.11协议帧格式展开抓包分析,适合作为课程实验参考或协议入门的实操范例。资源包共1个文件,为537KB的PDF文档,内容完整呈现实验目的、环境搭建、抓包步骤与结果分析,便于直接查阅与对照学习。报告基于Ubuntu系统与Wireshark工具,逐位解析了数据帧、RTS控制帧与信标管理帧的帧控制字段,涵盖To DS、From DS、retry、powermgt、protected等标志位含义,并强调大端模式下的阅读顺序,帮助读者建立对MAC层帧结构的直观认识。目前已有400人学习,适合需要理解无线局域网通信原理、完成同类实验或复习802.11帧格式的读者参考。

1. 从一份 802.11 抓包实验报告说起:为什么帧控制字段值得逐位抠

很多人第一次用 Wireshark 抓 802.11 的包,看到满屏的十六进制和0x0a08、0x0080这种帧控制字段,第一反应是直接展开协议树看 Wireshark 帮我们翻译好的字段名,很少有人愿意回到原始字节一位一位地对。这份《无线局域网抓包实验.pdf》恰恰反着来——它把数据帧、RTS 控制帧、信标管理帧的帧控制字段拆成二进制,逐位标注 version、type、subtype、To DS、From DS、retry、powermgt 这些标志位,再对照 802.11 标准里的帧格式表验证。它解决的不是"怎么装 Wireshark"这种入门问题,而是"抓到的这串字节到底哪几位是类型、哪几位是地址、为什么大端模式下要从左往右读"这类真正卡人的细节。适合已经能跑通抓包、但对 MAC 帧结构还停留在"看得懂协议树、看不懂原始字节"阶段的同学,也适合要带实验课、需要一份可对照的帧解析样例的助教。

2. 实验环境搭建:VirtualBox 里跑 Ubuntu 10.04 加 Wireshark 的完整链路

2.1 为什么这份实验选 Ubuntu 10.04 而不是新版

实验手册里明确要求 Ubuntu 10.04,这不是随便定的。802.11 抓包对网卡驱动和内核的 monitor 模式支持很敏感,Ubuntu 10.04 自带的内核版本对当时常见的无线网卡(比如 Atheros、Ralink 系列)在 monitor 模式下的兼容性比较稳,Wireshark 版本也停留在 1.0.x 到 1.2.x 这个区间,抓 802.11 管理帧和控制帧时不会像新版那样默认过滤掉一部分 radiotap 头信息。如果你用 Ubuntu 22.04 直接装最新 Wireshark,会发现抓到的包 radiotap 头字段更丰富,但帧控制字段的原始字节展示方式有变化,对照实验报告里的0x0a08这种写法时容易对不上。常见做法是:要么老老实实按手册用 Ubuntu 10.04 虚拟机,要么在新系统上抓包后手动切到"原始字节"视图,忽略 Wireshark 的字段翻译,自己按位拆。

2.2 VirtualBox 虚拟机配置与 Ubuntu 10.04 安装

先装 VirtualBox,新建虚拟机时注意几个参数:内存给 1024MB 以上,硬盘 8GB 够用,网络模式选"桥接网卡"而不是 NAT——桥接才能让虚拟机的无线网卡直接看到空口上的管理帧和广播帧,NAT 模式下很多 802.11 管理帧会被宿主机过滤掉。Ubuntu 10.04 的 ISO 镜像现在官方源已经归档,需要从旧版本归档站找ubuntu-10.04.4-desktop-i386.iso这个文件。

# 在 VirtualBox 宿主机上创建虚拟机(命令行方式,也可以直接用 GUI) VBoxManage createvm --name "WLAN-Lab" --register VBoxManage modifyvm "WLAN-Lab" --memory 1024 --nic1 bridged --bridgeadapter1 eth0 VBoxManage storagectl "WLAN-Lab" --name "SATA" --add sata VBoxManage storageattach "WLAN-Lab" --storagectl "SATA" --port 0 --device 0 --type dvddrive --medium ubuntu-10.04.4-desktop-i386.iso

这段命令做了三件事:注册一台名为 WLAN-Lab 的虚拟机、把内存设为 1024MB 并把第一块网卡设为桥接模式、挂载 Ubuntu 10.04 的 ISO 作为光驱。--bridgeadapter1 eth0里的eth0要换成你宿主机实际的有线网卡名,用ip link或ifconfig能看到。桥接模式下虚拟机会从宿主机所在网络拿一个独立 IP,抓包时能看到同一网段内其他设备的 802.11 帧。

安装完 Ubuntu 10.04 后,先更新源再装 Wireshark。10.04 的默认源地址已经失效,需要把/etc/apt/sources.list里的archive.ubuntu.com换成old-releases.ubuntu.com。

# 替换源地址后更新并安装 Wireshark sudo sed -i 's/archive.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list sudo apt-get update sudo apt-get install wireshark

sed那行是把源列表里的域名批量替换成归档站,apt-get update刷新包索引,最后装 Wireshark。安装过程中会弹出一个对话框问是否允许非 root 用户抓包,选"是",这样后面不用每次sudo wireshark。装完后用wireshark --version确认版本,实验报告里用的应该是 1.0.x 或 1.2.x 系列。

2.3 网卡 monitor 模式配置与抓包参数

Wireshark 默认抓的是普通模式下的包,只能看到发给本机或广播的帧。要抓全空口的 802.11 帧,得先把无线网卡切到 monitor 模式。

# 查看无线网卡名,通常是 wlan0 iwconfig # 关闭网卡,切换模式,再开启 sudo ifconfig wlan0 down sudo iwconfig wlan0 mode monitor sudo ifconfig wlan0 up # 确认模式已切换 iwconfig wlan0

iwconfig wlan0 mode monitor是核心命令,把网卡从 managed 模式切到 monitor 模式。切完后iwconfig输出里会显示Mode:Monitor。如果这一步报错说"设备不支持",说明虚拟机桥接的物理网卡驱动不支持 monitor 模式,常见做法是换一块支持 monitor 模式的外置 USB 无线网卡,在 VirtualBox 里把 USB 设备直通给虚拟机。

启动 Wireshark 后,在接口列表里选wlan0,双击开始抓包。抓包过滤器里填wlan.fc.type == 0只看管理帧,或者wlan.fc.type == 1只看控制帧,wlan.fc.type == 2只看数据帧。实验报告里分析的三种帧正好对应这三个 type 值。

提示:Ubuntu 10.04 的 NetworkManager 可能会在网卡切到 monitor 模式后自动把它切回 managed 模式,抓包前先sudo stop network-manager停掉网络管理服务。

3. 三种帧的逐位拆解:数据帧、RTS 控制帧、信标管理帧对照分析

3.1 数据帧的帧控制字段:0x0a08 到底怎么读

实验报告里第一个例子是数据帧,帧控制字段两字节是0x0a08。这里有个血泪经验:Wireshark 显示的字节顺序和实际传输顺序是反的。报告里写的是0x0a08,二进制展开成0000 1010 0000 1000,但 802.11 帧控制字段实际传输时第一个字节是0x08,第二个字节是0x0a。报告里按大端模式从左往右读,把0x0a08拆成:

字段位值含义
Protocol Version200802.11 版本 0
Type210数据帧
Subtype40000普通数据帧
To DS10不发给分布系统
From DS11来自分布系统(AP)
More Frag10无后续分片
Retry11重传帧
Power Mgmt10发送方未进入节电模式
More Data10无更多数据
Protected10帧体未加密
Order10不要求严格顺序

Type=10对应数据帧,Subtype=0000对应普通数据帧。From DS=1说明这帧是从 AP 发往终端的,Retry=1说明是重传。后面的 Duration 字段d500表示这帧和它的确认帧会占用信道多长时间,单位是微秒。地址字段0022698EA744是发送方(AP 的 MAC),0611b51a0a05是接收方(终端的 MAC)。最后四字节040a3032是 CRC 校验码。

在 Wireshark 里对照时,展开 IEEE 802.11 协议树,找到 Frame Control 字段,把每个子字段的值和上表对一遍。如果 Wireshark 显示的字节顺序和报告里不一致,在 Wireshark 的"视图"菜单里把"字节序"切到"网络序"再看。

3.2 RTS 控制帧:0x00b4 的 type 和 subtype 怎么定位

RTS 帧的帧控制字段是0x00b4,二进制0000 0000 1011 0100。按同样的拆法:

  • Protocol Version:00
  • Type:01,对应控制帧
  • Subtype:1011,对应 RTS
  • To DS、From DS、More Frag 等标志位:全 0

RTS 帧的作用是发送方在发数据前先发一个 RTS,告诉接收方"我要发数据了,请准备好",接收方回一个 CTS 帧,其他站点听到 CTS 后就推迟发送,避免冲突。RTS 帧的 Duration 字段6709表示这次传输会占用信道多久,后面的接收方地址和发送方地址各六字节,最后四字节 CRC。实验报告里提到"接收方地址、发送方地址、校验码等等全都为 0",这可能是抓包时抓到了一个不完整的 RTS 帧,或者 Wireshark 解析时把某些字段标成了 0。实际抓包时 RTS 帧的地址字段一般不会全 0,如果遇到全 0 的情况,先检查是不是抓到了帧的尾部而不是头部。

# 在 Wireshark 里用显示过滤器只看 RTS 帧 wlan.fc.type == 1 && wlan.fc.subtype == 11

wlan.fc.type == 1过滤控制帧,wlan.fc.subtype == 11过滤 RTS(subtype 值 11 对应二进制 1011)。CTS 帧的 subtype 是 12,ACK 帧是 13。用这个过滤器能快速定位到实验报告里分析的那类帧。

3.3 信标管理帧:0x0080 与 BSSID 字段解析

信标帧的帧控制字段是0x0080,二进制0000 0000 1000 0000。Type=00对应管理帧,Subtype=1000对应信标帧。信标帧是 AP 定期广播的,用来通告网络的存在,里面包含 SSID、支持速率、信道等信息。

信标帧的帧结构比数据帧多几个字段:Duration 两字节、目的地址六字节(通常是广播地址ff:ff:ff:ff:ff:ff)、源地址六字节(AP 的 MAC)、BSSID 六字节(通常和源地址相同)、序列号两字节、帧体(包含 SSID 等参数)、CRC 四字节。实验报告里提到"六字节的 bssid 两字节的帧序列,数据,最后是校验序列",这个顺序是对的。

在 Wireshark 里抓信标帧时,显示过滤器用:

wlan.fc.type == 0 && wlan.fc.subtype == 8

wlan.fc.type == 0过滤管理帧,wlan.fc.subtype == 8过滤信标帧。抓到的信标帧展开后能看到 SSID 参数、Supported Rates、DS Parameter Set(信道号)等。如果抓不到信标帧,检查网卡是不是在 monitor 模式,以及是不是在正确的信道上——信标帧只在 AP 所在信道上广播,网卡如果锁在别的信道就抓不到。

注意:Ubuntu 10.04 下 Wireshark 抓 802.11 帧时,radiotap 头里会包含信道和信号强度信息,但不同网卡驱动的 radiotap 头长度不一样,解析帧控制字段前先确认 radiotap 头的长度,跳过它再读 802.11 帧头。

4. 避坑与排查:抓不到帧、字段对不上、模式切不过去怎么办

4.1 抓不到任何 802.11 帧

现象:Wireshark 接口列表里选了 wlan0,开始抓包后一个包都没有,或者只有零星几个广播包。

原因:网卡没切到 monitor 模式,或者虚拟机网络模式是 NAT 而不是桥接。NAT 模式下虚拟机只能看到自己的流量,空口上的管理帧和控制帧全被宿主机过滤了。

解决:先iwconfig wlan0确认Mode:Monitor,如果不是就按 2.3 节的命令切。再检查 VirtualBox 虚拟机设置里的网络模式,改成"桥接网卡"并选对宿主机物理网卡。如果宿主机用的是无线网卡,有些驱动不支持桥接,常见做法是换有线网卡桥接,或者用 USB 无线网卡直通给虚拟机。

4.2 帧控制字段的字节顺序和报告对不上

现象:Wireshark 里看到的帧控制字段是0x080a,但实验报告里写的是0x0a08。

原因:Wireshark 默认按小端模式显示多字节字段,而 802.11 帧在实际传输时是按大端模式逐字节发送的。报告里按大端模式读,所以顺序相反。

解决:在 Wireshark 的"视图"菜单里找到"字节序"选项,从"主机序"切到"网络序"。或者在解析时手动把两个字节交换后再展开二进制。这个坑在分析 Duration、序列号等多字节字段时也会遇到,养成先确认字节序再读值的习惯。

4.3 Ubuntu 10.04 源失效导致装不上 Wireshark

现象:apt-get update报一堆 404,apt-get install wireshark提示找不到包。

原因:Ubuntu 10.04 已经过了支持周期,官方源移到了归档站,默认的archive.ubuntu.com地址已经不可用。

解决:按 2.2 节的命令把/etc/apt/sources.list里的archive.ubuntu.com替换成old-releases.ubuntu.com,再apt-get update。如果还报错,检查源列表里有没有security.ubuntu.com也需要替换。替换完记得apt-get upgrade一次,把包索引更新到最新。

4.4 monitor 模式切完后自动变回 managed

现象:iwconfig wlan0 mode monitor执行成功,但过几秒再查又变回Mode:Managed。

原因:NetworkManager 服务在后台运行,检测到网卡模式变化后会自动把它改回受管模式。

解决:抓包前先sudo stop network-manager停掉服务,抓完再sudo start network-manager恢复。如果用的是 Ubuntu 10.04 的桌面版,也可以在网络管理器图形界面里把无线连接禁用,再手动切 monitor 模式。

4.5 RTS 帧地址字段全为 0

现象:抓到的 RTS 帧里接收方地址和发送方地址都是00:00:00:00:00:00。

原因:可能是抓到了帧的尾部而不是头部,或者网卡驱动在 monitor 模式下没有正确填充地址字段。有些廉价无线网卡在 monitor 模式下只抓帧体不抓帧头,导致地址字段丢失。

解决:换一块支持 monitor 模式且驱动成熟的网卡,常见的是 Atheros AR9271 或 Ralink RT3070 芯片的 USB 网卡。在 Wireshark 里检查 radiotap 头是否完整,如果 radiotap 头里没有IEEE80211_RADIOTAP_F_FCS标志,说明帧校验序列可能被截断了。

5. 从逐位解析到自动化验证:用 tshark 批量提取帧控制字段

手动在 Wireshark 里一位一位拆帧适合做实验报告,但如果你要分析几百个帧的 type 和 subtype 分布,手动拆就太慢了。我一般会用 tshark(Wireshark 的命令行版本)批量导出帧控制字段,再用脚本统计。Ubuntu 10.04 下 tshark 随 Wireshark 一起安装,命令是tshark。

# 抓 100 个包并导出帧控制字段到 CSV tshark -i wlan0 -c 100 -T fields -e wlan.fc.type -e wlan.fc.subtype -e wlan.fc.retry -e wlan.fc.fromds -e wlan.fc.tods -E separator=, > fc_fields.csv # 统计各 type 出现次数 cut -d, -f1 fc_fields.csv | sort | uniq -c

第一行命令里,-i wlan0指定抓包接口,-c 100抓 100 个包后停止,-T fields表示按字段输出,-e后面跟要提取的字段名,-E separator=,指定 CSV 分隔符。wlan.fc.type是帧类型,wlan.fc.subtype是子类型,wlan.fc.retry是重传标志,wlan.fc.fromds和wlan.fc.tods是分布系统方向标志。第二行用cut取第一列(type),sort排序后uniq -c统计每个值出现次数。如果输出里 type=0 有 30 个、type=1 有 10 个、type=2 有 60 个,说明管理帧、控制帧、数据帧的比例大概是 3:1:6。

# 用 Python 解析 tshark 导出的 CSV,统计 subtype 分布 import csv from collections import Counter subtype_names = { (0, 8): "Beacon", (0, 5): "Probe Response", (0, 4): "Probe Request", (1, 11): "RTS", (1, 12): "CTS", (1, 13): "ACK", (2, 0): "Data", (2, 4): "Null", (2, 8): "QoS Data" } counter = Counter() with open("fc_fields.csv") as f: reader = csv.reader(f) for row in reader: if len(row) >= 2: key = (int(row[0]), int(row[1])) counter[key] += 1 for (t, s), count in counter.most_common(): name = subtype_names.get((t, s), f"Type{t}-Sub{s}") print(f"{name}: {count}")

这段 Python 脚本读fc_fields.csv,把每行的 type 和 subtype 转成整数后作为键,用Counter统计出现次数。subtype_names字典把常见的 type/subtype 组合映射成可读名称,比如(0, 8)是信标帧,(1, 11)是 RTS,(2, 0)是普通数据帧。输出按出现次数从多到少排列,能快速看出抓到的包里哪种帧最多。如果信标帧占比特别高,说明抓包位置离 AP 很近;如果 RTS 帧很多,说明网络里冲突比较严重,站点频繁用 RTS/CTS 机制避免碰撞。

提示:tshark 在 Ubuntu 10.04 下抓包也需要 root 权限,命令前加sudo。如果提示wlan.fc.type字段不存在,说明 tshark 版本太老,用tshark -G fields | grep wlan.fc查一下支持的字段名。

从那以后我每次做 802.11 抓包分析,都强制先跑一遍tshark -T fields把帧控制字段导出来,用脚本统计完 type 和 subtype 分布,再回到 Wireshark 里挑几个典型帧逐位对照。这样既不会漏掉异常帧,也不会在几百个包里迷路。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询