我正在分析一个Wi-Fi捕获(.pcap
)并且遇到了我认为802.11规范与Wireshark对数据的解释之间的不一致。具体而言,我试图拆分的是2字节802.11 帧控制字段。
取自http://www4.ncsu.edu/~aliu3/802.bmp,帧控制字段的子字段格式如下:
以下是数据包的Wireshark屏幕上限让我感到困惑:
根据Wireshark屏幕截图,帧控制字段的标志部分(最后8位)是0x22,这很好。如何将版本/类型/子类型0x08
与Wireshark的框架描述相匹配,这让我感到困惑。
0x08
= 0000 1000b
,我认为会转换为版本= 00
,Type = 00
(我认为这意味着管理而不是 data frame)和Subtype = 1000
(我认为它将是一个信标帧)。所以我希望这个帧是一个管理帧,更具体地说,是一个信标帧。然而,Wireshark将其报告为数据框架。令我困惑的第二件事是Wireshark甚至从行0x20
中提取Type/Subtype: Data (0x20)
。
任何人都可以澄清我对802.11 spec / Wireshark捕获的解释以及为什么两者不一致?
答案 0 :(得分:18)
由于帧控制(FC)的该字节的布局,您示例中的数据帧为0x08。 0x08 = 00001000 - 前4位(0000)是子类型。 0000是此帧的子类型 - 接下来的2位(10)是类型,它是2位小数,因此是数据类型帧 - 最后2位(00)是版本,即0
下表为多种帧类型转换FC的子类型 - 版本字节的十六进制值。将QoS数据与正常数据帧进行比较可能真的有助于减少这种情况。请注意,桌子可能有一两个错误,因为我刚刚把它掀起来。
你是对的,1000是一个信标帧,你只是看错了位。
你有一个radiotap标头,你可以从pcap API获得类似的dec表示:
int type = pkt_data[20] >> 2;
答案 1 :(得分:3)
这是一个常见的错误,并且肯定会多次咬我。
归结为Byte Ordering。
如果要表示一个多字节数字,那么问题是您先放入/发送哪个字节?
自然(人类)字节顺序是首先放置大部分,然后是它之后的较小部分,从左到右,也称为Big Endian。请注意,从程序员的角度来看,每个字节中的位从来都不是错误的方法。
e.g。 1234十进制需要2个字节,04D2十六进制。 你写/发送04 D2,还是D2 04? 第一个是Big-endian,第二个是Little-endian。
为了更加混淆,所涉及的机制可能使用不同的字节顺序。
有网络字节顺序,在这种情况下是Little-endian,架构字节顺序(每个CPU架构可以不同),数据可能在缓冲区中,因此它会根据您是否读取缓冲区而有所不同从上到下,或从下到上。
对于哪些位做什么也可以“倒退”的解释没有帮助,就像你原来的帖子一样。
答案 2 :(得分:0)
我在Windows上使用wireshark version-2.4.3
。我的数据帧捕获文件如下所示。
Frame control field = 0x0842 i.e., in binary format 0000 1000 0100 0010
Framecontrol flag field = 0x42.i.e., in binary format 0100 0010
因此,根据我的理解,framecontrol字段中的LSB 8bits
将对应于标志。
MSB 8bits将对应于子类型,类型,版本,即在我的情况下0000-subtype
& 10-type
& 00-version
。
哪个是子类型0的数据框。
你的案子可能是wireshark的错误。它应该将控制字段显示为0x0822
而不是0x2208。
标志字段正确显示为0x22
。
在我的情况下,我正在使用wireshark-2.4.3
并且帧控制字段的显示是正确的0x0842
,其中flags是0x42
。
<强> My_capture_file:强>