OSI 模型的数据链路层(第 2 层)实际上由两个子层组成:媒体访问控制 (MAC) 子层和逻辑链路控制 (LLC) 子层。 MAC 子层控制设备交互。 LLC 子层处理寻址和复用。
网络连接的物理寻址存在于数据链路层。在数据链路层传输的协议单元称为帧(frame)。 数据链路层将数据位组合成称为帧的实体。 以太网等网络拓扑存在于数据链路层。 网络交换机是数据链路层最常见的网络设备。
以太网帧概述
在以太网中,设备使用数据包共享数据。 它们包含除其他外的以太网帧,该帧被分成多个数据集。 这些记录由提供重要信息的二进制代码组成,例如地址、控制信息、有效载荷数据和校验和。
根据以太网标准,以太网帧的结构不同,可能包含更多或更少的数据字段,具体取决于网络协议。
虽然IEEE 802.3标准号称要取代Ethernet II,但由于二者的相似以及Ethernet II作为IEEE 802.3的基础这一事实,通常将这两者均视为以太网。
以太网帧的类型有哪些
目前共有4种类型的以太网帧格式:
- Ethernet II
即DIX 2.0,是Xerox与DEC、Intel在1982年制定的以太网标准帧格式,已成为事实上的以太网帧标准。
- RAW 802.3
Novell在1983年公布的专用以太网标准帧格式。该格式以前当时尚未正式发布的 802.3标准为基础,与后来的IEEE正式发布的802.3标准并不兼容。它只支持IPX/SPX一种协议,只能用在IPX网络。
- IEEE 802.3/802.2 LLC
这是1985年由IEEE正式发布的802.3标准,由Ethernet V2发展而来
- IEEE 802.3/802.2 SNAP
这是1985年IEEE为了保证在802.2 LLC上支持更多的上层协议,同时更好地支持IP协议而发布的标准
以太网帧长度与MTU
最小的以太网帧长度为64字节。最大的以太网帧长度为1518字节。驱动程序要确保帧满足最小帧长度规范的要求,如果某个帧不能满足最小帧长度64字节要求,那么驱动程序必须填充相应的数据字段。
Ethernet II和IEEE 802.3/802.2 SNAP要传输的数据包长度都有一个限制,其最大值分别是1500和1492字节。
链路层的这个特性称作最大传输单元(Maximum Transmission Unit,MTU)。不同类型的网络大多数都有一个上限,如果IP层有一个数据报要传,而且数据长度比链路层的MTU还大,那么IP层就需要进行分片,将数据报分成若干片,让每一片都小于MTU。
通过以太网传输数据时,以太网帧主要负责正确制定规则和成功传输数据包。 本质上,通过以太网发送的数据由帧承载。 以太网帧的大小在 64 字节到 1,518 字节之间,具体取决于要传输的数据的大小。
Ethernet II帧格式
在 OSI 模型中,帧位于数据链路层,负责无错传输和将比特流分成块。
Ethernet II帧比较简单,由以下5个字段组成:
目的地址:长度为6字节,指定目的的主机的数据链路地址。
源地址:长度为6字节,指定发送方的硬件地址。该字段仅仅包含单播地址,不能包含广播或多播地址。
类型:长度为2字节,标识正在使用该帧类型协议。这是由IANA管理的已分配协议以太网类型(Ether Type)编号。
const value_string etype_vals[] = {
{ 0x0800, "IPv4" },
{ 0x86DD, "IPv6" },
{ 0x8100, "802.1Q Virtual LAN" },
{ 0x0806, "ARP" },
{ 0x872D, "Cisco Wireless Lan Context Control Protocol" },
{ 0x8783, "Motorola Media Independent Network Transport" },
{ 0x2452, "IEEE 802.11 (Centrino promiscuous)" },
{ 0x0600, "XNS Internet Datagram Protocol" },
{ 0x0805, "X.25 Layer 3" },
{ 0x0842, "Wake on LAN" },
{ 0x08F0, "WiMax Mac-to-Mac" },
{ 0x3E3F, "EPL_V1" },
{ 0x8035, "RARP" },
{ 0x8038, "DEC LanBridge" },
{ 0x809B, "AppleTalk LLAP bridging" },
{ 0x80D5, "SNA-over-Ethernet" },
{ 0x80E1, "EtherNet/IP Device Level Ring" },
{ 0x80F3, "AARP" },
{ 0x8137, "Netware IPX/SPX" },
{ 0x0BAD, "Vines IP" },
{ 0x0BAF, "Vines Echo" },
{ 0x1984, "Netmon Train" },
/* Ethernet Loopback */
{ 0x9000, "Loopback" },
{ 0x885A, "Foundry proprietary" },
{ 0x80FF, "Wellfleet Compression Protocol" },
{ 0x8181, "Spanning Tree Protocol" },
/* for ISMP, see RFC 2641, RFC 2642, RFC 2643 */
{ 0x81FD, "Cabletron Interswitch Message Protocol" },
{ 0x81FF, "Cabletron SFVLAN 1.8 Tag-Based Flood" },
/* In www.iana.org/assignments/ethernet-numbers, 8203-8205 description is
* Quantum Software. Now the company is called QNX Software Systems. */
{ 0x8204, "QNX 6 QNET protocol" },
{ 0x8863, "PPPoE Discovery" },
{ 0x8864, "PPPoE Session" },
{ 0x886C, "HomePNA, wlan link local tunnel" },
{ 0x886D, "Intel ANS probe" },
{ 0x886F, "MS NLB heartbeat" },
{ 0x8870, "Jumbo LLC" },
{ 0x8874, "Broadcom tag" },
{ 0x887B, "Homeplug" },
{ 0x88E1, "Homeplug AV" },
{ 0x88E3, "MRP" },
{ 0x88A8, "802.1ad Provider Bridge (Q-in-Q)" },
{ 0x88E5, "802.1AE (MACsec)" },
{ 0x893A, "1905.1a Convergent Digital Home Network for Heterogenous Technologies" },
{ 0x88E7, "802.1ah Provider Backbone Bridge (mac-in-mac)" },
{ 0x893F, "802.1br Bridge Port Extension E-Tag" },
{ 0x888E, "802.1X Authentication" },
{ 0x88C7, "802.11i Pre-Authentication" },
{ 0x8847, "MPLS label switched packet" },
{ 0x8848, "MPLS multicast label switched packet" },
{ 0x3C07, "3Com NBP Datagram" },
{ 0x6000, "DEC proto" },
{ 0x6001, "DEC DNA Dump/Load" },
{ 0x6002, "DEC DNA Remote Console" },
{ 0x6003, "DEC DNA Routing" },
{ 0x6004, "DEC LAT" },
{ 0x6005, "DEC Diagnostics" },
{ 0x6006, "DEC Customer use" },
{ 0x6007, "DEC LAVC/SCA" },
{ 0x8041, "DEC LAST" },
{ 0x6558, "Transparent Ethernet bridging" },
{ 0x2001, "Cisco Group Management Protocol" },
{ 0x22E5, "Gigamon Header" },
{ 0x22EA, "802.1Qat Multiple Stream Reservation Protocol" },
{ 0x88F6, "802.1ak Multiple Mac Registration Protocol" },
{ 0x894F, "Network Service Header" },
{ 0x8988, "PA HB Backup" },
{ 0x22F0, "IEEE 1722 Audio Video Bridging Transport Protocol" },
{ 0x22F1, "Robust Header Compression(RoHC)" },
{ 0x22F3, "Transparent Interconnection of Lots of Links" },
{ 0x22F4, "Intermediate System to Intermediate System" },
{ 0x8808, "MAC Control" },
{ 0x8809, "Slow Protocols" },
{ 0x9021, "Real-Time Media Access Control" },
{ 0x9022, "Real-Time Configuration Protocol" },
{ 0x8881, "CDMA2000 A10 Unstructured byte stream" },
{ 0x8884, "ATM over Ethernet" },
{ 0x8892, "PROFINET" },
{ 0x8899, "Realtek Layer 2 Protocols" },
{ 0x88A2, "ATA over Ethernet" },
{ 0x88A4, "EtherCAT frame" },
{ 0x88A1, "Telkonet powerline" },
{ 0x88AB, "ETHERNET Powerlink v2" },
{ 0x88AD, "XiMeta Technology" },
{ 0x889B, "CSM_ENCAPS Protocol" },
{ 0x88B5, "Local Experimental Ethertype 1" },
{ 0x88B6, "Local Experimental Ethertype 2" },
{ 0x88B7, "IEEE 802a OUI Extended Ethertype" },
{ 0x88B8, "IEC 61850/GOOSE" },
{ 0x88B9, "IEC 61850/GSE management services" },
{ 0x88BA, "IEC 61850/SV (Sampled Value Transmission" },
{ 0x88CA, "Transparent Inter Process Communication" },
{ 0x88CC, "802.1 Link Layer Discovery Protocol (LLDP)" },
{ 0x88D2, "CDMA2000 A10 3GPP2 Packet" },
{ 0x891D, "TTEthernet Protocol Control Frame" },
{ 0x88D8, "Circuit Emulation Services over Ethernet (MEF8)" },
{ 0x88D9, "Link Layer Topology Discovery (LLTD)" },
{ 0x88DC, "(WAVE) Short Message Protocol (WSM)" },
{ 0x88DE, "VMware Lab Manager" },
{ 0x8819, "Cirrus Cobranet Packet" },
{ 0x8133, "Juniper Netscreen Redundant Protocol" },
{ 0x9104, "EERO Broadcast Packet" },
/*
* NDISWAN on Windows translates Ethernet frames from higher-level
* protocols into PPP frames to hand to the PPP driver, and translates
* PPP frames from the PPP driver to hand to the higher-level protocols.
*
* Apparently the PPP driver, on at least some versions of Windows,
* passes frames for internal-to-PPP protocols up through NDISWAN;
* the protocol type field appears to be passed through unchanged
* (unlike what's done with, for example, the protocol type field
* for IP, which is mapped from its PPP value to its Ethernet value).
*
* This means that we may see, on Ethernet captures, frames for
* protocols internal to PPP, so we list as "Ethernet" protocol
* types the PPP protocol types we've seen.
*/
{ 0x8021, "PPP IP Control Protocol" },
{ 0xc021, "PPP Link Control Protocol" },
{ 0xc023, "PPP Password Authentication Protocol" },
{ 0x80fd, "PPP Compression Control Protocol" },
{ 0xCAFE, "Veritas Low Latency Transport (not officially registered)" },
{ 0x8902, "IEEE 802.1ag Connectivity Fault Management (CFM) protocol" },
{ 0x8903, "Data Center Ethernet (DCE) protocol(Cisco)" },
{ 0x8906, "Fibre Channel over Ethernet" },
{ 0x890d, "IEEE 802.11 data encapsulation" },
{ 0x8911, "LINX IPC Protocol" },
{ 0x8914, "FCoE Initialization Protocol" },
{ 0x8917, "Media Independent Handover Protocol" },
{ 0x88EE, "Ethernet Local Management Interface (MEF16)" },
{ 0x88F7, "PTPv2 over Ethernet (IEEE1588)" },
{ 0x88F8, "Network Controller Sideband Interface" },
{ 0x88FB, "Parallel Redundancy Protocol (PRP) and HSR Supervision (IEC62439 Part 3)" },
{ 0x8901, "Flow Layer Internal Protocol" },
{ 0x8915, "RDMA over Converged Ethernet" },
{ 0xD00D, "Digium TDM over Ethernet Protocol" },
{ 0x88B4, "WAI Authentication Protocol" },
{ 0x8926, "VN-Tag" },
{ 0x892B, "Schweitzer Engineering Labs Layer 2 Protocol" },
{ 0x892F, "High-availability Seamless Redundancy (IEC62439 Part 3)" },
{ 0x08FF, "AX.25" },
{ 0x8909, "CiscoMetaData" },
{ 0x8947, "GeoNetworking" },
{ 0xC0DE, "eXpressive Internet Protocol" },
{ 0xC0DF, "Neighborhood Watch Protocol" },
{ 0x892D, "bluecom Protocol" },
{ 0x9100, "QinQ: old non-standard 802.1ad" },
{ 0x99FE, "Technically Enhanced Capture Module Protocol (TECMP)" },
{ 0xA0ED, "6LoWPAN" },
{ 0xD28B, "Arista Timestamp" },
{ 0xAEFE, "eCPRI" },
{ 0xB4E3, "CableLabs Layer-3 Protocol" },
{ 0xFFF2, "Cisco ACI ARP gleaning" },
{ 0xF1C1, "802.1CB Frame Replication and Elimination for Reliability" },
{ 0, NULL }
};
以太网(Ether Type)是以太网帧中的一个重要字段,用来指明应用于帧数据段的协议,即要封装的上层协议类型。
数据(Data):存储被封装的上层数据,长度在46字节到1500字节之间。
帧校验序列(Frame Check Sequence):简称FCS,长度为4字节,包含了CRC计算的结果。
Ethernet 802.3 raw 帧格式
Ethernet 802.3 raw又称 Novell Ethernet,它将Ethernet II帧首部中的类型字段变成了长度字段,紧接着用来个内容为十六进制数0xFFFF字段标识Novell以太网类型,数据字段缩小为44~1498个字节。
这个 802.3 数据包的粗略版本,被命名为“以太网 802.3”,是在 IEEE 802.3 标准和流行的 IPX/SPX 协议广泛建立之前由 Novell 提出的,不幸的是,它经常与 IEEE 标准混淆。因此,Novell 在名称中添加了“raw”。
Ethernet IEEE 802.3
以太网 IEEE 802.3 是目前最流行和最广泛使用的 LAN 帧结构。 但是,某些网络和协议需要更多空间来存储特定信息。 因此,存在 IEEE 802.3 帧的变体,为特定信息提供附加数据块,其中包括 SNAP 扩展和 VLAN 标记。
目的服务访问点(Destination Service Access Point):简称DSAP,用于标识目的协议。如十六进制数0x06代表IP协议数据,十六进制数0xE0代表Novell类型协议数据。
源服务访问点(Source Service Access Point):简称SSAP,用于指定源协议(通常与目的协议相同)
控制(Control):指明该帧是无编号格式还是信息/监督格式,一般设为0x03。指明采用无连接服务802.2无编号数据格式。
Ethernet IEEE 802.3 SNAP
Ethernet IEEE 802.3 SNAP帧格式与上述的802.3帧最大的区别是增加了一个5字节SNAP标识。另外,这两个字节DSAP和SSAP字段内容被固定下来,其值为0xAA。控制字段内容也被固定保存下来,其值为十六进制0x03
总结
对于目前存在的4种以太网帧格式,网络设备就是根据上述规定进行识别的,首先识别出Ethernet II帧,如果帧首部源地址后面的两字节(长度、类型字段)的值大于1500,则此帧格式为Ethernet II格式。否则为其他格式。
接着我们在区分其他3种格式,长度字段和类型字段为值0xFFFF,则为Novell Ether(Ethernet 802.3 raw )帧,如果值为0xAAAA,则为Ethernet IEEE 802.3 SNAP,剩下就是IEEE 802.3格式的帧。
参考:RFC 894、RFC 1042