华为HCIA-Datacom认证指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.2 以太网帧结构

3.2.1 MAC地址

MAC(Media Access Control,媒体访问控制)地址是一个硬件地址,并且MAC地址是全球唯一的,用来唯一标识以太网中的一台设备。它就像我们的身份证一样,每个人都有一个不一样的身份证号码,如果你想找到这个人,可以通过身份证号找到他。MAC地址是以太网中的概念,原因是以太网是一种广播型的网络,在这个广播型网络中存在N台设备,那如何准确定位网络的某一台设备并和它进行单独通信呢?这就需要一个能够唯一标识设备的地址,这就是MAC地址。有了MAC地址,可以在广播网中实现一对一的单播通信。

MAC地址结构如图3-2所示。MAC地址的长度为48位,被分为了两部分。前24位是一部分,其中第一位为1表示广播MAC地址;第二位为1表示是本地唯一MAC地址,如果为0表示全球唯一MAC地址。后面的22位是OUI(Organizationally Unique Identifier,组织唯一标识符,又称厂商唯一代码)部分,用来表示网卡的厂商。OUI部分需要网卡厂商向IANA(The Internet Assigned Numbers Authority,互联网号码分配机构)注册申请,并且不能出现重复,这也是不存在重复MAC地址的原因。如果经常使用Wireshark进行抓包,你会发现借助Wireshark能分析出数据帧中的MAC地址是来自哪个厂商的,这是如何实现的呢?实际上,Wireshark可通过OUI部分来映射厂商信息。后面的24位为第二部分,这部分内容是由网卡厂商自定义的。

图3-2 MAC地址结构

在MAC地址中可以标识出MAC地址类型,是广播地址、组播地址还是单播地址。

① 广播地址:如果MAC地址中第一个字段的第一位被置1,则该地址为广播MAC地址。

② 组播地址:如果第一个字节的最后一位被置1,则该地址为组播地址。

③ 单播地址:如果第一个字节的最后一位被置0,则该地址为单播地址。

注释:广播和组播MAC地址只能作为目的MAC地址使用,不能作为源MAC地址使用。

3.2.2 以太帧格式

在以太网中有两种数据帧封装格式,分别是IEEE 802.3和Ethernet II(以太网二型)。

以太网物理层规范如图3-3所示,该图展示了IEEE 802.3中定义的以太网物理层规范。

两种以太网数据封装结构如图3-4所示,该图描述了IEEE 802.3和Ethernet II(以太网二型)两种协议的封装结构。

通过观察可以发现,Ethernet II和IEEE 802.3数据结构很类似,无论Ethernet II还是IEEE 802.3,数据帧的封装长度都是一样的,帧头为14字节,帧尾(FCS)为4字节,共计18字节,但是它们也有一些具体的区别,具体分析如下。Ethernet II数据帧封装如图3-5所示。

图3-3 以太网物理层规范

图3-4 两种以太网数据封装结构

图3-5 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的头部中并没有“以太网类型”字段,那么它是怎么来标识上层协议封装的呢?实际上,IEEE 802.3是通过携带IEEE 802.2的报头来标识上层协议封装的。如图3-6所示描述了IEEE 802.2封装结构。

图3-6 IEEE 802.2封装结构

由图3-6可知,从DSAP开始到Protocol ID结束是IEEE 802.2的封装结构,IEEE 802.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+协议报文结构如图3-7所示,该图显示了思科私有协议PVST+的报文封装,IEEE 802.2通过携带SNAP扩展头部来标识PVST+私有协议。一般情况下,IEEE 802.3的帧承载二层协议数据。

图3-7 IEEE 802.2封装PVST+协议报文结构