802.11 帧封装
Radiotap Header v0, Length 18
0000 00 00 12 00 2e 48 00 00 00 02 6c 09 a0 00 d4 00
0010 00 00
Radiotap Header v0, Length 18
Header revision: 0
Header pad: 0
Header length: 18
Present flags
Flags: 0x00
Data Rate: 1.0 Mb/s
Channel frequency: 2412 [BG 1]
....
radiotap.h
struct ieee80211_radiotap_header {
uint8_t it_version;
uint8_t it_pad;
uint16_t it_len;
uint32_t it_present;
};
其中第一个字段it_version表示版本号,当前为0。
第二个字段it_pad没有使用,仅仅是为了结构体对齐。(但是协议里也有这个字段呀?)
第三个字段it_present表示长度,包括了radiotap头部和数据两部分。此设计的好处在于,如果不需要了解radiotap,则可以跳过直接到ieee802.11头部。——半个月前写抓包程序时,还不了解radio,就是直接跳过的。
第四个字段it_present表示radiotap数据的位掩码。radiotap的数据紧跟其头部。当其中的位掩码为true时,表示有对应的数据,可以认为每一比特表示一种类型。比如bit5为1表示有通道数据,则可以获取到信号强度。反之就是没有对应的数据。因此radiotap的长度其实是不固定的。bit31为1表示还有多个it_present。不过目前笔者还没有碰到此情况,没有深入了解。
802.11 数据帧
IEEE 802.11 Probe Request, Flags: ……..
0000 40 00 00 00 ff ff ff ff ff ff f0 79 60 c4 33 e3
0010 ff ff ff ff ff ff 40 58
/*
802.11 data frame from AP
,-------------------------------------------------------------------.
Bytes | 2 | 2 | 6 | 6 | 6 | 2 | 0..2312 | 4 |
|------|------|---------|---------|---------|------|---------|------|
Desc. | ctrl | dura | DA/RA | TA | SA | Sequ | frame | fcs |
| | tion | (BSSID) | | | ence | data | |
`-------------------------------------------------------------------'
Total: 28-2340 bytes
*/
struct ieee80211_header_data {
u16 frame_ctl;
u16 duration_id;
u8 addr1[6];
u8 addr2[6];
u8 addr3[6];
u16 seq_ctrl;
};
帧控制 2_bytes+ 持续时间 2_bytes + BSSID 2_bytes + TA(发送端地址) 2_bytes + SA(该帧的来源地址) 2_bytes + ……
IEEE 802.11 Probe Request, Flags: ........
Type/Subtype: Probe Request (0x0004)
Frame Control Field: 0x4000
.000 0000 0000 0000 = Duration: 0 microseconds
Receiver address: Broadcast (ff:ff:ff:ff:ff:ff)
Destination address: Broadcast (ff:ff:ff:ff:ff:ff)
Transmitter address: Apple_c4:33:e3 (f0:79:60:c4:33:e3)
Source address: Apple_c4:33:e3 (f0:79:60:c4:33:e3)
BSS Id: Broadcast (ff:ff:ff:ff:ff:ff)
.... .... .... 0000 = Fragment number: 0
0101 1000 0100 .... = Sequence number: 1412(0x4058)