由于需要做一个分析网卡接收的数据包的Project,需要了解以太网帧结构并解析,发现有很多内容从一般网络方面的知识是不够的,因此查阅了相关资料再此做一个记录以备忘。
以太网是目前最流行的有线的局域网技术,特别是上世纪九十年后发展的交换式局域网增加了有效数据速率,同时集线器和交换机等普通且便宜的硬件更助长了其普及程度。以太网的数据帧格式如下图所示:
数据字段:在交换式以太网中,一台主机向局域网中的另一台主机发送一个IP数据报,这个数据报封装在以太网帧结构中作为其有效载荷,以太网的最大传输单元(MTU)是1500字节,也就是限制了一个IP数据报最大为1500字节,如果超过1500字节,就要启用IP协议的分片策略进行传输。同时,数据字段最小长度为46字节,如果不够必须要填充到46字节。如IP数据报和填充部分会被网络层利用IP数据报首部的长度字段去除相关填充。
MAC地址字段:6个字节共128位的MAC物理地址,用于标识局域网中的每个主机,目的MAC可以是某个机器的物理地址,也可以是FF-FF-FF-FF-FF-FF广播MAC地址。
前同步码:前7字节都是10101010,最后一个字节是10101011。用于将发送方与接收方的时钟进行同步,主要是有不同的以太网类型,同时发送接收速率也不会完全精确的帧速率传输,因此需要在传输之前进行时钟同步。
CRC:循环冗余校验,用来让接收方的网卡适配器检查接收的到数据帧是否有错误,是否有比特翻转引入差错,如果引入了差错就会丢弃,这是网卡适配器直接从硬件响应的。此字段是发送方发送时由适配器从该帧中除了前同步码之外的其他比特进行映射计算获得。
类型字段:这是网络协议分层设计减小耦合度的精心设计,这允许以太网多路复用网络层协议,可以支持除了IP协议之外的其他不同网络层协议,或者是承载在以太网帧里的协议(如ARP协议)。接收方根据此字段进行多路分解,从而达到解析以太网帧的目的,将数据字段交给对应的上层网络层协议,这样就完成了以太网作为数据链路层协议的工作。
通过上述分析,可以看出,前同步码由网卡适配器接收帧时同步时钟使用,不会再接收方显示,CRC字段用来校验帧,如果校验不合格就丢弃了,只有合格的数据帧才会被网卡接收,故CRC字段也不用管理。因此解析以太网数据帧的关键就是获取类型字段,然后根据类型字段将数据字段的数据交给上层协议进行处理。同时保存下目的MAC地址和源MAC地址,以供后续其他使用。
根据 IEEE802.3,以太网类型字段(EtherType 字段)是两个八字节的字段。在量化评估中,字段中的第一个八位字节是最重要的。而当字段值大于等于十进制值 1536(即十六进制为 0600)时, EtherType 字段表示为 MAC 客户机协议(EtherType 解释)的种类。该类字段值取自 IEEE EtherType 字段寄存器。EtherType 字段是个极限空间,因此其分配是有限的。只有开发新的数据传输协议的人员需要使用 EtherType 字段,而不管他们实际上是否真正生产任何设备。IEEE RAC EtherType 字段批准权威机构负责检查和批准。具体详细定义如下:
以太类型值(16进制)对应协议 <