来自here的代码段:
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 :
alt text http://www.dcs.gla.ac.uk/~lewis/networkpages/m04s03EthernetFrame_files/image002.gif
我该怎么做呢?
答案 0 :(得分:5)
在802.3中,源地址和目标地址都是48位MAC地址。 6 + 6 + 2 = 14
答案 1 :(得分:3)
是的,在大多数情况下,终端站场景为14。 除了你有一个802.1Q帧的情况,这会让你失去另外4个字节。 802.1Q主要用于路由器/路由器通信上的VLAN标记和QoS。
前导码和起始帧定界符主要由低级固件用于捕获帧。 当我们(应用程序)访问以太网帧时,通常我们没有前导码和起始帧分隔符。
据我所知,2字节长度的mac地址是以太网I的一部分,从未真正获得认可。具有6字节地址的Ethernet II / 802.3是我们现在使用的真正的通用以太网。
另请注意,填充为0-46,其中46来自以太网帧上的最小64字节约束,用于冲突检测(CD)目的。 46(pad)+ 14(dmac,smac,type)+ 4(CRC)= 64字节
答案 2 :(得分:1)
以太网报头是固定宽度,但扩展协议(如802.1q for vlan / qos)很常见,并且有效地扩展了L2报头。
答案 3 :(得分:0)