如何找出IEEE802.11帧内的封装协议?

我正在开发一个IEEE802.11帧parsing器程序,使用Linux内的libpcap和原始的C 。 我可以轻松parsingRadioTapIEEE802.11头文件,但是我找不到在IEEE802.11 MPDU内部封装的协议名称。 不幸的是, IEEE802.11头中没有任何字段表示封装的协议(如Ethernet报头中的protocol字段)。

任何解决scheme

对于封装数据的802.11帧,头类型/子类型将在0x200x2F之间(尽管帧通常是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