以太帧格式,在以太网中有两种数据帧封装格式,分别是IEEE 802.3和Ethernet II(以太网二型)。
以太网物理层规范如图1所示,该图展示了IEEE 802.3中定义的以太网物理层规范。
图1 以太网物理层规范
两种以太网数据封装结构如图2所示,该图描述了IEEE 802.3和Ethernet II(以太网二型)两种协议的封装结构。
图2 两种以太网数据封装结构
通过观察可以发现,Ethernet II和IEEE 802.3数据结构很类似,无论Ethernet II还是IEEE 802.3,数据帧的封装长度都是一样的,帧头为14字节,帧尾(FCS)为4字节,共计18字节,但是它们也有一些具体的区别,具体分析如下。Ethernet II数据帧封装如图3所示。
图3 Ethernet II数据帧封装
1、以太网二型(Ethernet II)数据帧格式
① 前导码:长度为8字节,为交替的0和1,在每个分组的开头提供5 MHz的时钟信号,让接收设备能够跟踪到来的比特流。
② 目的地址:长度为6字节,是接收者的MAC地址,标识数据帧的接收者。目的地址类型可以是单播MAC地址、组播MAC地址或者广播MAC地址,不同类型的MAC地址对应的接收者不同。
单播MAC地址是一对一的通信,只有真正的接收者才能接收数据帧;组播MAC地址是一对多的通信,接收者需要先加入对应的组播组才会接收数据帧,非组播组成员不会接收;广播MAC地址也是一对多的通信,和组播MAC地址的区别在于广播MAC地址是针对所有设备的,同一广播域中的所有设备都能接收数据帧。
③ 源地址:长度为6字节,是发送者的MAC地址,标识数据帧的发送者,源地址类型只能使用单播MAC地址,不能使用组播或广播地址。
④ 类型:长度为2字节,用于标识网络层封装协议。常见的以太类型有:0x0800,代表IPv4;0x86DD,代表IPv6;0x0806,代表ARP;0x8100,代表IEEE 802.1q;等等。
⑤ 数据:长度为46~1500字节,是网络层可以填充的数据长度。
⑥ FCS:frame Check Sequence,帧校验序列,长度为4字节。FCS字段用于存储CRC(Cyclic Redundancy Check,循环冗余校验)结果。接收者收到数据帧后会首先对数据帧头进行CRC校验,将校验结果和FCS中的内容进行对比,如果一致则接收数据帧,如果不一致则丢弃数据帧。
在采用Wireshark 抓包时看不到前导码和FCS(帧尾),这是由于网卡收到数据包后会先去掉前导码并对数据帧头进行CRC校验,只有校验正确才会将数据帧交给上层应用处理,之前的校验步骤都是由网卡驱动完成的,所以当采用Wireshark 抓包时是看不到前导码和FCS(帧尾)的。一般情况下,以太网二型数据帧承载业务数据。
2.IEEE 802.3数据帧格式
IEEE 802.3的数据帧格式和Ethernet II的数据帧格式类似,具体说明如下。
① 前导码:长度为7字节,为交替的0和1,在每个分组的开头提供5 MHz的时钟信号,让接收设备能够跟踪到来的比特流。
② 帧起始位置分隔符(SOF):长度为1字节,其值为10101011,其中最后的两个1让接收者能够识别中间0和1交替模式,从而同步并检测到数据开头。
③ 目的地址:长度为6字节,是接收者的MAC地址,标识数据帧的接收者。作用和以太网二型数据帧中的目的MAC地址相同。
④ 源地址:长度为6字节,是发送者的MAC地址,作用和以太网二型数据帧中的源MAC地址相同。
⑤ 长度:长度为2字节,标识IEEE 802.3数据帧的长度。
⑥ IEEE 802.2报头和数据:长度为46~1500字节,是IEEE 802.2报头和网络层可以填充的数据长度。
⑦ FCS:frame Check Sequence,帧校验序列,长度为4字节。FCS字段用于存储CRC(Cyclic Redundancy Check,循环冗余校验)的结果。接收者收到数据帧后会首先对数据帧头进行CRC校验,将校验结果与FCS中的内容进行对比,如果一致则接收数据帧,如果不一致则丢弃数据帧。
介绍完IEEE 802.3的数据帧结构,大家会发现一个问题,在IEEE 802.3的头部中并没有“以太网类型”字段,那么它是怎么来标识上层协议封装的呢?实际上,IEEE802.3是通过携带IEEE 802.2的报头来标识上层协议封装的。
如图4所示描述了IEEE 802.2封装结构。
图4 IEEE 802.2封装结构
由图4可知,从DSAP开始到Protocol ID结束是IEEE 802.2的封装结构,IEEE802.2的封装分为两部分,分别是IEEE 802.2 LLC(Logical link Control,逻辑链路控制)头部和SNAP(Subnetwork Access Protocol,子网访问协议)扩展。
① IEEE 802.2 LLC Header(IEEE 802.2 LLC头部)长度为3字节,具体说明如下。
●DSAP(Destination Service Access Point,目的服务访问点):1字节,标识数据接收者的网络层逻辑地址(封装协议);
●SSAP(Source Service Access Point,源服务访问点):1字节,标识数据发送者的网络层逻辑地址(封装协议);
●Control(控制字段):1或2字节,用于标识数据格式,共有以下3种类型。
◆ U-fromat(Unnumbered format)PDU(无编号格式PDU):使用1字节的控制字段,标识用户无连接服务的IEEE 802.2无编号数据格式,通常数据格式被设置为U-format;
◆ I-format(Information transfer format)PDU(信息传输格式PDU):使用2字节的控制字段填充序列号,标识面向连接的数据格式。
◆ S-format(Supervisory format)PDU(管理格式PDU):使用2字节的控制字段,标识在LLC中采用的管理数据格式。
② SNAP Extension(SNAP扩展)长度为5字节,由OUI和Type两部分组成。
●OUI(Organizationally Unique Identifier,组织唯一标识符,又称厂商唯一代码):通常等于 MAC地址的前3字节,标识网卡厂商。
●Protocol ID(Ethernet Type):标识网络层封装协议,作用和以太网类型字段相同。
在IEEE 802.2的LLC头部中已经可以通过DSAP和SSAP标识上层的封装协议,那为什么还需要SNAP扩展呢?这是因为LLC的SSAP字段只有1字节,只能标识标准协议,像一些私有协议是无法标识的,这就需要通过SNAP扩展中的OUI和Protocol ID字段来标识厂商和上层协议。
SNAP扩展头部是可选的,只有在封装非标准协议时才需要SNAP扩展头部。IEEE 802.2封装PVST+协议报文结构如图5所示,该图显示了思科私有协议PVST+的报文封装,IEEE 802.2通过携带SNAP扩展头部来标识PVST+私有协议。
一般情况下,IEEE 802.3的帧承载二层协议数据。
图5 IEEE 802.2封装PVST+协议报文结构