我需要直接在C中处理以太网帧。我对以太网帧头中的字段顺序感到困惑。这是一个编程问题,所以请不要将其标记为offtopic。
下图来自“TCP / IP Illustrated Volume 1,2nd Edition”一书的第85页。
如图所示,“长度或类型”字段位于“P / Q标记”字段之前(如果有)。
然而,在我收到的帧被重叠后,我意识到我收到的帧“长度或类型”跟在“P / Q Tag”之后。见下文
0100 5e00 007b Destination MAC (multicast)
000f 5325 fb00 Source MAC
8100 Q-tagged frame. (802.1q standard uses it to denote VLAN).
0065 Prio (3 bits), CFI (1bit), VLAN ID(12 bit)
0800 EtherType (Type field)
4500 IP packet starts from here.
问题1:这两个字段的顺序是什么 问题2:如何正确检查以太网帧头的大小。需要知道IP数据包的起始位置。
答案 0 :(得分:2)
教科书中的错误(仅在第2版中,请参阅EJP的评论)。不仅我的代码显示Q-Tag在“长度/类型”字段之前。另请参阅OpenOnload中的以下开源代码。
openonload-201405-U1 / SRC /包含/ CI /净/ ethernet.h
typedef struct ci_ether_hdr_s {
ci_uint8 ether_dhost[ETH_ALEN];
ci_uint8 ether_shost[ETH_ALEN];
ci_uint16 ether_type;
} ci_ether_hdr;
typedef struct {
ci_uint8 ether_dhost[ETH_ALEN]; /* destination eth addr */
ci_uint8 ether_shost[ETH_ALEN]; /* source ether addr */
ci_uint16 ether_vtype; /* vlan type field 0x8100 */
ci_uint16 ether_vtag; /* vlan tag */
ci_uint16 ether_type; /* packet type ID field */
} ci_ethhdr_vlan_t;