通过了解socket(int domain, int type, int protocol)接口,我们知道利用socket的AF_PACKET
或者PF_PACKET域,和类型SOCK_RAW再加上协议就可以监听获得指定协议的以太帧。
1.获得各个协议的头部
以太协议类型有很多,仅贴上一部分,如下图:
图一
本文仅介绍0x0800(IPV4)的监听与拆分。现在我们就可以利用:
s=socket.socket(socket.PF_PACKET,socket.SOCK_RAW,socket.htons(0x0800))
获得ipv4协议的以太帧。然后就是接收,并根据协议格式拆分了。先看以太帧格式部分,如下:
图二
我们接收的数据没有Preamble部分,此部分被以太网硬件过滤掉了。这里说一下,上图Type/Length
部分是Ethernet-II才有的type,在原始的IEEE 802.3帧此部分是负载的数据长度,怎样区分的呢,数值小于
1500表示帧负载数据长度,而>=1536(十六进制0x0600)表示Ethernet-II的type(见图一ethertype的值)。
另外提一下vlan类型大小是0x8100,此类型的协议现在使用比较广泛,格式如下:
图三
vlan tag中有12bit用来表示vlan id的。此处和本文