前言
数据包在以太网物理介质上传播之前必须封装头部和尾部信息,封装后的数据包称为数据帧,数据帧中封装的信息决定了数据如何传输。
以太网上传输的数据帧有两种格式,选择哪种格式由TCP/IP协议簇中的网络层决定。
帧格式
以太网上使用两种标准帧格式。
第一种是上世纪80年代初提出的DIX v2格式,即Ethernet II帧格式。
第二种是1983年提出的IEEE 802.3格式。
这两种格式的主要区别在于Ethernet II格式中包含一个Type字段,标识以太帧处理完成之后将被发送到哪个上层协议进行处理,IEEE 802.3格式中,同样的位置是长度字段。
不同的Type字段值可以用来区别这两种帧的类型
- 当Type字段值小于等于1500(或者十六进制的0x05DC)时,帧使用的是IEEE 802.3格式。
- 当Type字段值大于等于1536 (或者十六进制的0x0600)时,帧使用的是Ethernet II格式。以太网中大多数的数据帧使用的是Ethernet II格式。
- 以太帧中还包括源和目的MAC地址,分别代表发送者的MAC和接收者的MAC,此外还有帧校验序列字段,用于检验传输过程中帧的完整性。
Ethernet_II帧格式
Ethernet_II 帧类型值大于等于1536 (0x0600),以太网数据帧的长度在64-1518字节之间。
Ethernet_II的帧中各字段说明如下:
字段 | 含义 |
---|---|
DMAC(Destination MAC) | 目的MAC地址。 |
SMAC(Source MAC) | 源MAC地址。 |
类型字段(Type) | 用于标识数据字段中包含的高层协议。类型字段取值为0x0800的帧代表IP协议帧;类型字段取值为0x0806的帧代表ARP协议帧。 |
数据字段(Data) | 网络层数据,最小长度必须为46字节以保证帧长至少为64字节,数据字段的最大长度为1500字节。 |
循环冗余校验字段(FCS) | 提供了一种错误检测机制。 |
IEEE802.3帧格式
IEEE802.3帧长度字段值小于等于1500 (0x05DC)
IEEE802.3帧格式类似于Ethernet_II帧,只是Ethernet_II帧的Type域被802.3帧的Length域取代,并且占用了Data字段的8个字节作为LLC和SNAP字段。Length字段定义了Data字段包含的字节数。
逻辑链路控制LLC(Logical Link Control)由目的服务访问点DSAP(Destination Service Access Point)、源服务访问点SSAP(Source Service Access Point)和Control字段组成。
SNAP(Sub-network Access Protocol)由机构代码(Org Code)和类型(Type)字段组成。Org Code三个字节都为0。Type字段的含义与Ethernet_II帧中的Type字段相同。IEEE802.3帧根据DSAP和SSAP字段的取值又可分为以下几类:
1)当DSAP和SSAP都取特定值0xff时,802.3帧就变成了Netware-ETHERNET帧,用来承载NetWare类型的数据。
2)当DSAP和SSAP都取特定值0xaa时,802.3帧就变成了ETHERNET_SNAP帧。ETHERNET_SNAP帧可以用于传输多种协议。
3)DSAP和SSAP其他的取值均为纯IEEE802.3帧。
数据帧传输
数据链路层基于MAC地址进行帧的传输
以太网的MAC地址
MAC地址由两部分组成,分别是供应商代码和序列号。
其中前24位代表该供应商代码,由IEEE管理和分配;
剩下的24位序列号由厂商自己分配。
网络设备的MAC地址是全球唯一的,MAC地址长度为48比特,通常用十六进制表示。
MAC地址包含两部分:
前24比特是组织唯一标识符(OUI,Organizationally Unique Identifier),由IEEE统一分配给设备制造商。
后24位序列号是厂商分配给每个产品的唯一数值,由各个厂商自行分配(这里所说的产品可以是网卡或者其他需要MAC地址的设备)。
常问问题
网络设备如何确定以太网数据帧的上层协议?
以太网帧中包含一个Type字段,表示帧中的数据应该发送到上层哪个协议处理。比如,IP协议对应的Type值为0x0800,ARP协议对应的Type值为0x0806。
终端设备接收到数据帧时,会如何处理?
主机检查帧头中的目的MAC地址,如果目的MAC地址不是本机MAC地址,也不是本机侦听的组播或广播MAC地址,则主机会丢弃收到的帧。
如果目的MAC地址是本机MAC地址,则接收该帧,检查帧校验序列(FCS)字段,并与本机计算的值对比来确定帧在传输过程中是否保持了完整性。如果检查通过,就会剥离帧头和帧尾,然后根据帧头中的Type字段来决定把数据发送到哪个上层协议进行后续处理。