一、数据帧格式概述
以太网是一种局域网技术,以太网数据帧是在以太网上传输的基本单位,其格式如下:
+--------+--------+--------+--------+------------------+-------------------+ | 前导码 | 目的地址| 源地址 | 类型/长度 | 数据 | 帧校验序列(FCS) | +--------+--------+--------+--------+------------------+-------------------+ | 8 字节 | 6 字节 | 6 字节 | 2 字节或4 字节 | 46~1500 字节| 4 字节 | +--------+--------+--------+--------+------------------+-------------------+
以上数据帧格式中,各字段的含义如下:
- 前导码:使用8个字节的连续的101010...(以二进制表示)作为二进制同步序列,用于标识接入网线的信号开始,以及同步接收方时钟。
- 目的地址:指示数据帧的接收方MAC地址,6个字节,第7位为0,标识为单播地址;第7位为1,标识为多播地址。第8位还可以用于指示组播地址。
- 源地址:指示数据帧的发送方MAC地址,同样为6个字节。
- 类型/长度:两个字节,用于指示数据帧的类型,或标识长度子网中,以太网最小数据长度为64字节,如果数据帧长度不足64字节,则需在数据部分中填充空数据,以凑齐长度要求。(类型字段会使第一个字节数值小于等于0x05DC)。
- 数据:数据部分,长度为46~1500字节之间。
- 帧校验序列(FCS):4个字节,用于检查数据帧在传输过程中是否出现错误。
二、目的地址解析
数据帧的目的地址是6个字节的MAC地址,其中第1个字节表示最高位,第6个字节表示最低位。前3个字节是IEEE组织的注册号,用来唯一标识网络设备厂商;后3个字节由厂商自行分配使用。目的地址的第7位表示地址类型,0表示单播地址,1表示组播地址。如果目的地址的第一位(最高位)为0,则表示这是一个全球唯一标识的MAC地址,由IEEE组织统一分配,如:"00-60-08-6B-AC-00"。
如果在局域网中,发送数据时不知道目的MAC地址,可以使用广播地址(目的地址的第一位全部为1),如:"FF-FF-FF-FF-FF-FF"。任何接收方都能接收到广播数据帧。
三、类型/长度字段
类型/长度字段中,类型字段为2个字节,用于指示数据帧的类型,如IP数据报、ARP请求等等。长度字段也为2个字节,在以太网中,如果长度字段小于或等于0x05DC,表示该字段表示数据的长度;若大于0x05DC,则表示该字段是类型字段(Type)。
在IEEE802.3中,如果长度字段值大于0x05DC,那么它表示数据部分的长度。例如,对于Gigabit以太网,长度字段上限是0xFFFF,表示帧最大大小为1518字节(包括前导码、数据、帧校验序列)。
四、帧校验序列(FCS)
FCS字段用于检查数据的传输错误,对数据帧的每个字节(除了FCS字段)进行一系列的算法运算,产生一个32 位的校验和,作为 FCS字段的值,接收方将会使用相同的算法运算,对接收到的数据帧进行验证,如果验算失败,则接收方会请求重发。
对于以太网数据帧,采用的多项式为CRC32,其生成多项式为x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1。定义一个32位寄存器,与多项式生成器进行异或,便可以生成FCS。
#define POLY 0xEDB88320UL unsigned long crc32(unsigned long crc, const unsigned char* buffer, size_t size) { for(size_t i=0; i> 1) ^ (-(crc & 1u) & POLY); } } return crc; }
五、结语
以上是以太网数据帧格式的详细解析,由于以太网是一种非常基础的局域网技术,应用非常广泛,这个格式的认识是十分必需的。通过对数据帧格式的分析,不仅可以加深对以太网的了解,也可以掌握数据传输过程中部分概念及技术实现,如CRC校验算法等等。