1. MAC地址概述
MAC地址(介质访问控制地址,Media Access Control Address)是一种用于网络通信的唯一标识符。由IEEE 802.3标准定义,用于在局域网(LAN)和城域网(MAN)中标识网络设备。
1.1 MAC地址的组成
在IEEE 802.3标准中,MAC地址被定义为48位(6字节)的地址。MAC地址的前24位称为组织唯一标识符(OUI),由IEEE分配给厂商,剩下的24位是网络接口标识符,表示厂商生产的网络设备的序列号。
OUI中,第一字节的b0位,I/G位(Individual/Group)表示单播还是多播,如果I/G=0,表示单播地址;如果I/G=1,表示多播地址。
OUI中,第一字节的b1位,G/L位(Global/Local,也称为U/L位,其中U表示Universal)位,如果G/L=0,表示全局管理地址,由IEEE分配;如果G/L=1,表示本地管理地址。

根据第一字节的b0和b1位的值的不同,地址可以分为四类,以下是对四类地址的简要说明。
| 第一字节 b0位 | 第一字节 b1位 | MAC地址类型 | 地址数 比例 | 地址总数 |
| 0 | 0 | 单播地址 全球管理 厂商网络设备的地址,生产时烧录 | 1/4 | 2^48 (二百八十万亿+) |
| 0 | 1 | 单播地址 本地管理 由网络管理员分配的覆盖网络接口的全球管理单播地址 | 1/4 | |
| 1 | 0 | 多播地址 全球管理 标准网络设备支持的多播地址 | 1/4 | |
| 1 | 1 | 多播地址 本地管理 用户针对主机多播组的软件配置 (48位全为1时,表示广播地址) | 1/4 |
1.2 MAC地址的表示
MAC地址用十六进制表示,有以下几种表示方式:
01-23-45-67-89-AB
01:23:45:67:89:AB
0123.4567.89AB
PS:更多文章也可以参看:
2. 数据帧的分类

如上图中,A~D是同一局域网中的网络设备。因为网络中的每个设备都有MAC地址作为其唯一的标识,所以它们之间通信的数据帧中可以携带本设备和目的设备的MAC信息,这样目的设备收到数据帧后就可以知道该数据帧是不是发送给自己的以及是谁发送的。例如以太网的Ethernet II帧的格式定义中就包含了目的MAC(DMAC)和源MAC(SMAC)。

根据数据帧中目的MAC填的内容,可以将数据帧分为三类,单播帧、多播帧和广播帧。以下,对三类帧进行简单的分析。
2.1 单播帧
单播帧就是一对一,如下图,A要给C发送单播帧,那么发出的数据帧中的DMAC填C的MAC地址即可,B/D收到后检查发现DMAC与本机MAC不匹配,丢弃,C收到后检查发现DMAC与本机MAC匹配,处理。

2.2 多播帧
多播帧就是一对多,如下图,A要发送多播帧,那么发出的数据帧中的DMAC是多播地址(多播地址有特定的要求,详细参见上文),B收到后检查发现DMAC不在本机多播组列表中,丢弃,C/D收到后检查发现DMAC在本机多播组列表中,处理。

2.3 广播帧
广播帧就是要所有设备都处理,如下图,A要发送广播帧,那么发出的数据帧中的DMAC填全F即可,B/C/D收到后检查发现DMAC是全F,按照广播帧处理。

3. MAC地址表
通过上文可以看出,不管是单播帧,还是多播帧,A设备都会将其发到B/C/D上,由B/C/D去判断处理,即属于共享式以太网。早期的由集线器(HUB)组建的网络就是这样,存在着冲突严重、广播泛滥、无任何安全性等问题。为了解决这些问题,出现了网桥(BRIDGE)和交换机(SWITCH),即交换式以太网。交换机由网桥演化而来,两者的异同可以看下表。
| 功能点 | 网桥 | 交换机 |
| 转发数据帧 | 支持 | 支持 |
| 过滤数据帧 | 支持 | 支持 |
| 端口个数 | 一般是两个 | 很多端口 |
| 传输速率 | 较慢 | 快 |

上图中,由交换机将A~D四台设备连接起来,四台设备之间的通信数据帧由交换机负责中转。那么对于这台交换机而言,如何知道数据帧应该从哪个端口发出去呢?MAC地址表应运而生。
3.1 MAC地址表的学习
当交换机收到数据帧时,会在设备上记录一条MAC地址表,由MAC地址(数据帧中的源MAC)+端口(收到数据帧的端口)组成,称之为MAC地址表的学习。如上图中交换机上学习到的MAC表如下所示。
| MAC地址 | 端口 |
| MAC A | PORT 1 |
| MAC B | PORT 2 |
| MAC C | PORT 3 |
| MAC D | PORT 4 |
当交换机要发送的数据帧中目的MAC填的是MAC C时,可以查询MAC表,得到需要将报文发送到PORT 3端口,称之为查MAC地址表转发。如果MAC地址表查不到该MAC,就发送到源端口之外的每一个端口,等待端口应答,这称之为泛洪。
这样,数据帧就会被分类送到不同的端口,冲突严重、广播泛滥等问题在一定程度上得到了缓解。概括起来看,交换机的转发行为就是基于源MAC学习,基于目的MAC转发,详细的转发行为会在后面的文章中介绍。
3.2 MAC地址表项的分类
3.2.1 动态MAC地址表项
上文中所讲的在交换机上学习到的MAC地址表项,被称之为动态MAC地址表项。动态表项可以被老化,即在一定时间内,不再收到该源MAC的数据帧时,此表项就会被删除。此外,我们还可以通过手动配置来增加MAC地址表项。
3.2.2 静态MAC地址表项
手动配置的静态MAC地址表项不会被老化,转发行为和动态表项一致。
3.2.3 黑洞MAC地址表项
手动配置的黑洞MAC地址表项可以起到拦截部分数据帧的作用,即数据帧中源MAC或目的MAC是该MAC的会被丢弃,黑洞表项也不会被老化。
3.2.4 三类MAC地址表项的比较
三类MAC地址表项的特点如下表。
| 功能点 | 动态表项 | 静态表项 | 黑洞表项 |
| 表项来源 | 报文学习 | 手工配置 | 手工配置 |
| 转发行为 | 根据目的MAC查表项转发 | 根据目的MAC查表项转发 | 源MAC或目的MAC是该MAC的报文会被丢弃 |
| 是否会老化 | 会老化 | 不会老化 | 不会老化 |
| 是否会丢失 | 系统复位、接口板热插拔或接口板复位,动态表项会丢失 | 系统复位、接口板热插拔或接口板复位,静态表项不会丢失 | 系统复位、接口板热插拔或接口板复位,黑洞表项不会丢失 |
| 其他限制 | 无 | 一条静态MAC表项,只能绑定一个出接口 | 无 |
4. 以太帧(扩展介绍)
上文中我们讲到了Ethernet II帧,这是以太帧的一种,是当前使用最广泛的一种帧封装。此外,以太帧还有其他的类型,让我们逐一简单的介绍一下。
4.1 Ethernet II以太帧
Ethernet II以太帧,也称为Ethernet V2帧,是如今局域网里最常见的以太帧,是以太网事实标准。如今大多数的TCP/IP应用(如HTTP、FTP、SMTP、POP3等)都是采用Ethernet II以太帧承载。

Ethernet II以太帧字段含义如下:
| 字段 | 长度(字节) | 含义 |
| DMAC | 6 | 目的MAC地址,IPV4为6字节,该字段确定帧的接收者 |
| SMAC | 6 | 源MAC地址,IPV4为6字节,该字段表示发送帧的工作站 |
| Type | 2 | 协议类型,下表列出了部分协议 |
| Data | 46~1500 | 负载 |
| FCS | 4 | 帧校验序列FCS(Frame Check Sequence)是为接收者提供判断是否传输错误的一种方法,如果发现错误,丢弃此帧。 FCS只是通用叫法,具体的FCS还可以细分多种校验方法。在以太帧中,FCS通常采用循环冗余码校验CRC(Cyclical Redundancy Check)。 |
| Type值 | 协议 |
| 0x0800 | Internet Protocol Version 4 (IPv4) |
| 0x0801 | X.75 Internet |
| 0x0805 | X.25 Level 3 |
| 0x0806 | Address Resolution Protocol (ARP) |
| 0x0808 | Frame Relay ARP |
| 0x22F3 | TRILL |
| 0x22F4 | L2-IS-IS |
| 0x6558 | Trans Ether Bridging |
| 0x6559 | Raw Frame Relay |
| 0x8035 | Reverse Address Resolution Protocol (RARP) |
| 0x809b | Appletalk |
| 0x8100 | IEEE Std 802.1Q - Customer VLAN Tag Type (C-Tag, formerly called the Q-Tag) (initially Wellfleet) |
| 0x8137 | Novell NetWare IPX/SPX (old) |
| 0x8138 | Novell, Inc. |
| 0x814C | SNMP over Ethernet |
| 0x86DD | IP Protocol version 6 (IPv6) |
| 0x876B | TCP/IP Compression |
| 0x876C | IP Autonomous Systems |
| 0x876D | Secure Data |
| 0x8808 | IEEE Std 802.3 - Ethernet Passive Optical Network (EPON) |
| 0x880B | Point-to-Point Protocol (PPP) |
| 0x880C | General Switch Management Protocol (GSMP) |
| 0x8847 | MPLS (multiprotocol label switching) |
| 0x8848 | MPLS with upstream-assigned label |
| 0x8863 | PPP over Ethernet (PPPoE) Discovery Stage |
| 0x8864 | PPP over Ethernet (PPPoE) Session Stage |
| 0x888E | IEEE Std 802.1X - Port-based network access control |
| 0x88A8 | IEEE Std 802.1Q - Service VLAN tag identifier (S-Tag) |
| 0x88B7 | IEEE Std 802 - OUI Extended Ethertype |
| 0x88C7 | IEEE Std 802.11 - Pre-Authentication (802.11i) |
| 0x88CC | IEEE Std 802.1AB - Link Layer Discovery Protocol (LLDP) |
| 0x88E5 | IEEE Std 802.1AE - Media Access Control Security |
| 0x88F5 | IEEE Std 802.1Q - Multiple VLAN Registration Protocol (MVRP) |
| 0x88F6 | IEEE Std 802.1Q - Multiple Multicast Registration Protocol (MMRP) |
| 0x893B | TRILL Fine Grained Labeling (FGL) |
| 0x8946 | TRILL RBridge Channel |
我们可以看到,最小帧是6+6+2+46+4=64字节,最大帧是6+6+2+1500+4=1518字节。那么,这两个值是怎么来的呢?
首先我们看最小帧为什么是64字节呢?假设A、B是网络上相距最远的两台设备,A检测到网络空闲,在t0时刻开始发数据帧。数据帧到达B之前,B也检测到网络空闲,在t1时刻也开始发数据帧。t0+T时刻(T表示数据帧从A到B所需的时间)数据帧开始到达B,此时B检测到碰撞,发送碰撞信号,碰撞信号会在t0+2T时刻到达A。此时,如果A数据帧的发送还未结束,该帧就会重传;如果A已经结束了数据帧的发送,那么A就不会重传这个数据帧,该帧就会丢失。所以,要求一帧数据发送的时间大于2T。IEEE定义了这个标准,要求最远的两台设备之间数据帧来回的时间要小于512位时,对应的字节数就是512/8=64字节。(根据IEEE定义的标准,10Mbps以太网采用中继器时,连接最大长度为2500m,最多经过4个中继器。所以,对于10Mbps以太网,规定一帧最小的发送时间为51.2us。51.2us可以传输512位数据,所以这个时间也被称为512位时。)
那么最大帧为什么是1518字节呢?这个是由数据链路层的MTU决定的,早期由于设备的缓存和CPU处理能力的限制,无法处理巨型帧,所以规定IP MTU的值为1500,就是帧里面的Data字段的最大长度为1500。实际上,现在的交换机等设备都可以传输巨型帧。
4.2 Novell Netware 802.3 Raw以太帧
Novell Netware 802.3 Raw以太帧是Novell在1983年公布的专用以太网标准帧格式,其对IEEE 802.3的数据字段进行了专门分隔,以便传输NetWare类型的数据。

Novell Netware 802.3 Raw以太帧字段含义如下:
| 字段 | 长度(字节) | 含义 |
| DMAC | 6 | 目的MAC地址 |
| SMAC | 6 | 源MAC地址 |
| Length | 2 | 指后续数据的字节长度,不包含CRC校验码的长度 |
| Data | 44~1498 | 负载 |
| FCS | 4 | 帧校验序列FCS(Frame Check Sequence)是为接收者提供判断是否传输错误的一种方法,如果发现错误,丢弃此帧。 FCS只是通用叫法,具体的FCS还可以细分多种校验方法。在以太帧中,FCS通常采用循环冗余码校验CRC(Cyclical Redundancy Check)。 |
我们可以看出,相对于Ethernet II以太帧,IEEE 802.3标准的定义中,将Type字段换成了Length,这是什么原因呢?
上文我们讲过以太帧最小长度是64字节,如果实际数据不足64字节,就存在填充的场景,那么我们就需要知道数据的真实长度,所以需要用Length字段指明数据的真实长度。由于Ethernet II封装使用非常广泛,后来802.3协议选择接纳了此类封装。但是,两种封装如何能够兼容呢?
Ethernet II以太帧最早是DIX(DEC、Intel和Xerox)发布的,所以Ethernet II以太帧也叫DIX帧。由于当时只有三种协议(0x0600 XNS、0x0800 IP和0x6003 DECNET),而这些协议都有各自的长度,所以不需要在以太帧头里指明数据的实际长度,只需要指定类型即可。而且,Ethernet II以太帧中Type定义的最小值是0x0600=1536,而Data数据最大长度是1500字节,所以根据值的大小就可以判断出这个字段代表的是Type还是Length。
4.3 IEEE 802.3 LLC以太帧
IEEE 802.3 LLC以太帧,也称为IEEE 802.3 SAP以太帧,是IEEE 正式的802.3标准,它由Ethernet II发展而来。

IEEE 802.3 LLC以太帧字段含义如下:
| 字段 | 长度(字节) | 含义 |
| DMAC | 6 | 目的MAC地址 |
| SMAC | 6 | 源MAC地址 |
| Length | 2 | 指后续数据的字节长度,不包含CRC校验码的长度 |
| DSAP | 1 | 目的服务访问点,若后面类型为IP帧值设为0x06 |
| SSAP | 1 | 源服务访问点,若后面类型为IP帧值设为0x06 |
| Ctrl | 1 | 该字段值通常设为0x03,表示无连接服务的IEEE 802.2无编号数据格式 |
| Data | 43~1497 | 负载 |
| FCS | 4 | 帧校验序列FCS(Frame Check Sequence)是为接收者提供判断是否传输错误的一种方法,如果发现错误,丢弃此帧。 FCS只是通用叫法,具体的FCS还可以细分多种校验方法。在以太帧中,FCS通常采用循环冗余码校验CRC(Cyclical Redundancy Check)。 |
4.4 IEEE 802.3 SNAP以太帧
IEEE 802.3 SNAP以太帧,是IEEE为保证在802.3 LLC上支持更多的上层协议同时更好的支持IP协议而发布的标准。

IEEE 802.3 SNAP以太帧字段含义如下:
| 字段 | 长度(字节) | 含义 |
| DMAC | 6 | 目的MAC地址 |
| SMAC | 6 | 源MAC地址 |
| Length | 2 | 指后续数据的字节长度,不包含CRC校验码的长度 |
| DSAP | 1 | 目的服务访问点,若后面类型为IP帧值设为0x06 |
| SSAP | 1 | 源服务访问点,若后面类型为IP帧值设为0x06 |
| Ctrl | 1 | 该字段值通常设为0x03,表示无连接服务的IEEE 802.2无编号数据格式 |
| SNAP-ID | 5 | 由OUI和Type两部分组成 |
| OUI | 3 | 组织唯一标识符,其值通常等于MAC地址的前3字节 |
| Type | 2 | 标识以太网帧所携带的上层数据类型 |
| Data | 38~1492 | 负载 |
| FCS | 4 | 帧校验序列FCS(Frame Check Sequence)是为接收者提供判断是否传输错误的一种方法,如果发现错误,丢弃此帧。 FCS只是通用叫法,具体的FCS还可以细分多种校验方法。在以太帧中,FCS通常采用循环冗余码校验CRC(Cyclical Redundancy Check)。 |



1万+

被折叠的 条评论
为什么被折叠?



