我正在开发一个IEEE802.11
帧parsing器程序,使用Linux内的libpcap
和原始的C
。 我可以轻松parsingRadioTap
和IEEE802.11
头文件,但是我找不到在IEEE802.11
MPDU内部封装的协议名称。 不幸的是, IEEE802.11
头中没有任何字段表示封装的协议(如Ethernet
报头中的protocol
字段)。
任何解决scheme
对于封装数据的802.11
帧,头类型/子类型将在0x20
和0x2F
之间(尽管帧通常是0x20
(Data)或0x28
(QoS-Data))。 将会有一个5字节的SNAP头部,其中包含有效载荷的类型(如本答案所述 )。 如果OID(SNAP头的前三个字节)是0x000000
,则接下来的两个字节是以太网类型。
以太网类型对于EAPoL( 源 )将是0x888e
。 那就是你要检查的封装协议的字段(IP 0x0806
0x0800
,ARP 0x0806
等)。
以太网类型是一个很好的思科文档,以及如何使用它们来过滤某些协议: http : //www.cisco.com/c/en/us/td/docs/ios/12_2/ibm/vol1/command/ reference / fibm_r1 / br1fethc.pdf 。
下面是一个关于无线嗅探器跟踪的好思科文档,其中包括对802.11
类型/子类型字段的描述: https : //supportforums.cisco.com/document/52391/80211-frames-starter-guide-learn-wireless-sniffer-痕迹 。
IEEE802.11
数据包的数据封装在LLC
头(见这里 ):
如果且仅当它是数据帧时,802.11帧应包含LLC头。 帧类型和子类型是MAC报头中的帧控制字段的一部分; 数据是框架类型值之一(其他是控制和管理)。 子类型无关紧要 – 所有的数据帧都应该包含一个LLC头,而不应该有其他帧。
LLC
头有两种:3字节,8字节。 IEEE 802.11
使用第二个(见这里 )。 其中, LLC
头的最后两个字节相当于Ethernet
协议中的Ether Type
字段。 所以这个字段的0x800
意味着IPv4
。