以太网头的长度必须是14?

htt*_*ret 5 c networking ethernet

这里的代码片段:

void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
    ....
    /* retireve the position of the ip header */
    ih = (ip_header *) (pkt_data +
        14); //length of ethernet header
    ....
Run Code Online (Sandbox Code Playgroud)

但是这张图片并没有说它必然是14:

替代文字http://www.dcs.gla.ac.uk/~lewis/networkpages/m04s03EthernetFrame_files/image002.gif

我该怎么做呢?

Ign*_*ams 6

在802.3中,源地址和目标地址都是48位MAC地址.6 + 6 + 2 = 14


use*_*049 5

是的,对于终端站场景,大多数情况下为 14。除非你有一个 802.1Q 帧,否则你会再错过 4 个字节。802.1Q 主要用于路由器/路由器通信中的 VLAN 标记和 QoS。

前导码和起始帧定界符主要由低级固件用于捕获帧。当我们(应用程序)可以访问以太网帧时,通常我们没有前导码和起始帧分隔符。

据我所知,mac 地址的 2 字节长度是以太网 I 的一部分,从未真正获得认可。而具有 6 字节地址的以太网 II/802.3 是我们现在使用的真正常见的以太网。

还想提一下,填充是 0-46,其中 46 来自以太网帧上用于冲突检测 (CD) 目的的最小 64 字节约束。46(pad) + 14(dmac,smac,type) + 4(CRC) = 64 字节