7

来自这里的代码片段:

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
    ....

但是这张图片并没有说它一定是14

替代文字
(来源:www.dcs.gla.ac.uk 的 lewis

我应该如何正确地做到这一点?

4

4 回答 4

7

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

于 2010-05-09T07:34:56.960 回答
5

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

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

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

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

于 2012-10-07T07:03:50.227 回答
1

以太网报头是固定宽度的,但是用于 vlan/qos 的 802.1q 等扩展协议很常见,并且有效地扩展了 L2 报头。

于 2010-05-09T21:34:48.683 回答
0

维基百科有一个很好的框架图片

维基

IPv4 / v6 是第 3 层协议。

于 2010-05-09T21:09:09.593 回答