以太网的头部为14字节,6字节源地址,6字节目的地址,2字节类型域。它的定义如下:
[ include/uapi/linux/if_ether.h ]
/*
* This is an Ethernet frame header.
* ETH_ALEN = 6
*/
struct ethhdr {
unsigned char h_dest[ETH_ALEN]; /* destination eth addr */
unsigned char h_source[ETH_ALEN]; /* source ether addr */
__be16 h_proto; /* packet type ID field */
} __attribute__((packed));
其中h_proto为此frame是什么类型,如对于IP协议,类型为
[ include/uapi/linux/if_ether.h ]
#define ETH_P_IP 0x0800 /* Internet Protocol packet */
还有一个特殊的类型:
[ include/uapi/linux/if_ether.h ]
#define ETH_P_ALL 0x0003 /* Every packet (be careful!!!) */
如果通过RAW socket获取所有的包,可以用此类型,如:socket( PF_PACKET, SOCK_RAW, htons( ETH_P_ALL) );
内核对于创建每层的协议头,提供了一个抽象结构,其中创建以太网头部的结构如