以太网MAC帧有两种标准,一种是IEEE的802.3标准,另外一种是以太网V2标准(注:来自《计算机网络》)。后者用得比较多。
不过,国外的书中找不到MAC帧这种说法,只说“以太网封装格式”。下面这张图片就是从《TCP/IP详解》中截图出来的。图片中的数字表示字节。一个IP数据包范围是46字节~1500字节,这是有根据的。
可以看到,IP包与ARP包是独立的,或者说它们下面的就是以太帧了。传输层(或以上)的各种数据包(报文)就是填充到上面那个图中的第2个框图的“IP数据报”的。
在Linux中,以太网帧头部的结构体如下:
/* 10Mb/s ethernet header */
struct ether_header
{
u_int8_t ether_dhost[ETH_ALEN]; /* destination eth addr */
u_int8_t ether_shost[ETH_ALEN]; /* source ether addr */
u_int16_t ether_type; /* packet type ID field */
} __attribute__ ((__packed__));
其中的ETH_ALEN为6,因为地址为6个字节,共48位——这个地址就是常说的物理地址,或MAC地址。它的第3个成员ether_type是以太帧类型,有如下这些:
/* Ethernet protocol ID's */
#define ETHERTYPE_PUP 0x0200 /* Xerox PUP */
#define ETHERTYPE_SPRITE 0x0500 /* Sprite */
#define ETHERTYPE_IP 0x0800 /* IP */
#define ETHERTYPE_ARP 0x0806 /* Address resolution */
#define ETHERTYPE_REVARP 0x8035 /* Reverse ARP */
#define ETHERTYPE_AT 0x809B /* AppleTalk protocol */
#define ETHERTYPE_AARP 0x80F3 /* AppleTalk ARP */
#define ETHERTYPE_VLAN 0x8100 /* IEEE 802.1Q VLAN tagging */
#define ETHERTYPE_IPX 0x8137 /* IPX */
#define ETHERTYPE_IPV6 0x86dd /* IP protocol version 6 */
#define ETHERTYPE_LOOPBACK 0x9000 /* used to test interfaces */