以太网帧头中的“长度/类型”字段之前的“P / Q标记”字段是什么?

时间:2014-11-21 02:41:38

标签: c networking

我需要直接在C中处理以太网帧。我对以太网帧头中的字段顺序感到困惑。这是一个编程问题,所以请不要将其标记为offtopic。

下图来自“TCP / IP Illustrated Volume 1,2nd Edition”一书的第85页。 IEEE Packet Structure

如图所示,“长度或类型”字段位于“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数据包的起始位置。

1 个答案:

答案 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;