gpt4 book ai didi

c - 以太网帧头中的 "P/Q tag"字段是在 "Length/Type"字段之前吗?

转载 作者:太空宇宙 更新时间:2023-11-03 23:26:11 25 4
gpt4 key购买 nike

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

下图摘自《TCP/IP Illustrated Volume 1, 2nd Edition》一书第85页。 IEEE Packet Structure

如图所示,“长度或类型”字段位于“P/Q 标签”字段之前(如果有的话)。

然而,在对我收到的帧进行 hexdump 后,我意识到我收到的帧在“P/Q 标签”之后有“长度或类型”。见下文

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.

问题一:这两个字段的顺序是什么?
问题2:如何正确查看以太网帧头的大小。需要知道 IP 数据包从哪里开始。

最佳答案

这是教科书上的一个错误(只有第二版,见EJP的评论)。不仅我的代码显示 Q-Tag 在“长度/类型”字段之前。另请参阅来自 OpenOnload 的以下开源代码.

openonload-201405-u1/src/include/ci/net/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;

关于c - 以太网帧头中的 "P/Q tag"字段是在 "Length/Type"字段之前吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27053273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com