计算机网络3——数据链路层3以太网的MAC层

文章目录

一、MAC 层的硬件地址

1、介绍

在局域网中,硬件地址又称为物理地址或 MAC地址(因为这种地址用在MAC帧中)。

大家知道,在所有计算机系统的设计中,标识系统(identification system)"都是一个核心问题。在标识系统中,地址就是识别某个系统的一个非常重要的标识符。在讨论地址问题时,很多人常常引用著名文献ISHOC78]给出的如下定义:

"名字指出我们所要寻找的那个资源,地址指出那个资源在何处,路由告诉我们如何到达该处。"

2、注意点

这个非形式的定义固然很简单,但有时却不够准确。严格地讲,名字应当与系统的所在地无关。这就像我们每一个人的名字一样,不随我们所处的地点而改变。为此IEEE 802标准为局域网规定了一种 48位的全球地址(一般都简称为"地址"),这就是局域网上的每一台计算机中固化在适配器的 ROM 中的地址。因此,请特别注意下面两点:

  • 假定连接在局域网上的一台计算机的适配器坏了而我们更换了一个新的适配器,那么这台计算机的局域网的"地址"也就改变了,虽然这台计算机的地理位置一点也没有变化所接入的局域网也没有任何改变。
  • 假定我们把位于南京的某局域网上的一台笔记本电脑携带到北京,并连接在北京的某局域网上。虽然这台电脑的地理位置改变了,但只要电脑中的适配器不变,那么该电脑在北京的局域网中的"地址"仍然和它在南京的局域网中的"地址"一样。

由此可见,局域网上的某台主机的"地址"并不指明这台主机位于什么地方。因此,严格地讲,局域网的"地址"应当是每一个站的"名字"或标识符[PERLO0]。不过,计算机的名字通常都是比较适合人记忆的不太长的字符串,而这种48位二进制的"地址"却很不像一般计算机的名字。但现在人们还是习惯于把这种 48 位的"名字"称为"地址"。本书也采用这种习惯用法,尽管这种说法并不严格。

请注意,如果连接在局域网上的主机或路由器安装有多个适配器,那么这样的主机或路由器就有多个"地址"。实际上,这种48位"地址"应当是某个接口的标识符。

3、定制标准

在制定局域网的地址标准时,首先遇到的问题就是应当用多少位来表示一个网络的地址字段。为了减少不必要的开销,地址字段的长度应当尽可能地短些。起初人们觉得用两个字节(共16位)表示地址就够了,因为这一共可表示6万多个地址。但是,由于局域网的迅速发展,而处在不同地点的局域网之间又经常需要交换信息,这就希望在各地的局域网中的站具有互不相同的物理地址。为了使用户在买到适配器并把机器连到局域网后马上就能工作,而不需要等待网络管理员给他先分配一个地址,IEEE802标准规定MAC地址字段可采用6字节(48位)或2字节(16位)这两种中的一种。6字节地址字段对局部范围内使用的局域网的确是太长了,但是由于6字节的地址字段可使全世界所有的局域网适配器都具有不相同的地址,因此现在的局域网适配器实际上使用的都是6字节MAC地址。

现在 IEEE 的注册管理机构 RA(Registration Authority)是局域网全球地址的法定管理机构[W-IEEERA],它负责分配地址字段的6个字节中的前三个字节(即高位24位)。世界上凡要生产局域网适配器的厂家都必须向IEEE购买由这三个字节构成的这个号(即地址块)这个号的正式名称是组织唯一标识符 OUI(Organizationally Unique Identifier),通常也叫作公司标识符(company _id)[RFC 7042]。

但应注意,24 位的 OUI不能够单独用来标志一个公司因为一个公司可能购买了几个 OU,也可能有几个小公司合起来购买一个 OU。例如,华为公司购买了多个 OUI,其中的一个是 A8-E5-44。地址字段中的后三个字节(即低位 24位)则是由厂家自行指派,称为扩展标识符(extended identifier),只要保证生产出的适配器没有重复地址即可。

可见购买了一个OU,就可以生成出 2 24 2^{24} 224个不同的6字节(48位)MAC 地址,这种地址又称为EUI-48,这里 EUI表示扩展的唯一标识符(Extended UniqueIdentifier)。EUI-48 的使用范围并不局限于局域网的硬件地址,而是可以用于软件接口。在生产适配器时,这种6字节的MAC地址已被固化在适配器的ROM中。因此,MAC地址也叫作硬件地址(hardware address)或物理地址。

IEEE 规定地址字段的第一字节的最低有效位为I/G位。IG表示Individual/Group。当I/G 位为0时,地址字段表示一个单个站地址。当 I/G 位为1时表示组地址,用来进行多播(以前曾译为组播)。需要指出,有的书把上述最低有效位写为"第一位",但"第一"的定义是含糊不清的。这是因为在地址记法中有两种标准:第一种记法是把每一字节的最低位(即最低有效位)写在最左边(第一位)。IEEE802.3标准就采用这种记法。例如,十进制数 11的二进制表示是1011,最高位写在最左边。但若使用IEEE 802.3标准的记法,就应当记为 1101,把最低位写在最左边。当我们阅读802.3标准的有关文档时,需要特别注意。第二种记法是把每一字节的最高位(即最高有效位)写在最左边(这也叫第一位)。

在发送数据时,两种记法都是按照字节的顺序发送,但每一个字节中先发送哪一位则不同:第一种记法先发送最低位,但第二种记法则先发送最高位。

IEEE还考虑到可能有人并不愿意向EEE的RA购买OUI。为此,IEEE把地址字段第一字节的最低第二位规定为G几位,表示 Global/Local。当G儿位为0时是全球管理(保证在全球没有相同的地址),厂商向IEEE购买的OUI都属于全球管理。当地址字段的G儿 位为1时是本地管理,这时用户可任意分配网络上的地址。采用2字节地址字段时全都是本地管理。但应当指出,以太网几乎不理会这个G位。

这样,在全球管理时,对每一个站的地址可用46位的二进制数字来表示(最低位和最低第二位均为0时)。剩下的46位组成的地址空间可以有 2 46 2^{46} 246个地址,已经超过70万亿个可保证世界上的每一个适配器都可有一个唯一的地址。当然,非无限大的地址空间总有用完的时候。但据测算,至少在近期还不需要考虑 MAC 地址耗尽的问题。

当路由器通过适配器连接到局域网时,适配器上的硬件地址就用来标志路由器的某个接口。路由器如果同时连接到两个网络上,那么它就需要两个适配器和两个硬件地址。

我们知道适配器有过滤功能。当适配器从网络上每收到一个MAC帧就先用硬件检查MAC 帧中的目的地址。如果是发往本站的帧则收下,然后再进行其他的处理。否则就将此帧丢弃,不再进行其他的处理。这样做就不浪费主机的处理机和内存资源了。这里"发往本站的帧"包括以下三种帧:

  • 单播(unicast)帧(一对一),即收到的帧的 MAC 地址与本站的 MAC 地址相同。
  • 广播(broadcast)帧(一对全体),即发送给本局域网上所有站点的帧(全1地址)。
  • 多播(multicast)帧(一对多),即发送给本局域网上一部分站点的帧。

所有的适配器都至少应当能够识别前两种帧,即能够识别单播和广播地址。有的适配器可用编程方法识别多播地址。当操作系统启动时,它就把适配器初始化,使适配器能够识别某些多播地址。显然,只有目的地址才能使用广播地址和多播地址。

以太网适配器还可设置为一种特殊的工作方式,即混杂方式(promiscuous mode)。工作在混杂方式的适配器只要"听到"有帧在以太网上传输就都悄悄地接收下来,而不管这些帧发往哪个站。请注意,这样做实际上是"窃听"其他站点的通信而并不中断其他站点的通信网络上的黑客(hacker 或 cracker)常利用这种方法非法获取网上用户的口令。因此,以太网上的用户不愿意网络上有工作在混杂方式的适配器。

但混杂方式有时却非常有用。例如,网络维护和管理人员需要用这种方式来监视和分析以太网上的流量,以便找出提高网络性能的具体措施。有一种很有用的网络工具叫作嗅探器(Snifer)就使用了设置为混杂方式的网络适配器。此外,这种嗅探器还可帮助学习网络的人员更好地理解各种网络协议的工作原理。因此,混杂方式就像一把双刃剑,是利是弊要看你怎样使用它。

二、MAC 帧的格式

常用的以太网 MAC 帧格式有两种标准,一种是DIXEthermet V2标准(即以太网 V2 标准),另一种是IEEE的802.3标准。这里只介绍使用得最多的以太网V2的MAC 帧格式(如下图所示)。图中假定网络层使用的是IP协议。实际上使用其他的协议也是可以的。

1、结构

以太网 V2的 MAC 帧较为简单,由五个字段组成。前两个字段分别为6字节长的目的地址和源地址字段。

第三个字段是2字节的类型字段,用来标志上一层使用的是什么协议,以便把收到的 MAC 帧的数据上交给上一层的这个协议。例如,当类型字段的值是0x0800时,就表示上层使用的是I数据报。

第四个字段是数据字段,其长度在46到1500字节之间(46字节是这样得出的:最小长度64字节减去18字节的首部和尾部就得出数据字段的最小长度)。最后一个字段是4字节的帧检验序列FCS(使用CRC检验)。当传输媒体的误码率为 1 x 1 0 − 14 1x10^{-14} 1x10−14时,MAC 子层可使未检测到的差错小于1x10-14。FCS检验的范围就是整个的 MAC 帧,从目的地址开始到 FCS 为止的这五个字段,但不包括物理层插入的8字节的前同步码和帧开始定界符。

2、工作原理

这里我们要指出,在以太网V2的MAC 帧格式中,其首部并没有一个帧长度(或数据长度)字段。那么,MAC 子层又怎样知道从接收到的以太网帧中取出多少字节的数据交付上一层协议呢?我们在前面讲述曼彻斯特编码时已经讲过,这种曼彻斯特编码的一个重要特点就是:在曼彻斯特编码的每一个码元(不管码元是1或0)的正中间一定有一次电压的转换(从高到低或从低到高)。当发送方把一个以太网帧发送完毕后,就不再发送其他码元了(既不发送1,也不发送0)。因此,发送方网络适配器的接口上的电压也就不再变化了。这样,接收方就可以很容易地找到以太网帧的结束位置。在这个位置往前数4字节(FCS字段长度是4字节),就能确定数据字段的结束位置。

当数据字段的长度小于46字节时,MAC 子层就会在数据字段的后面加入一个整数字节的填充字段,以保证以太网的 MAC帧长不小于64字节。我们应当注意到,MAC帧的首部并没有指出在数据字段中是否有填充字段。接收端的MAC子层在剥去MAC帧的首部和尾部后,就把剩下的部分交给上面的IP层。那么IP层怎样知道这里有没有填充字段呢?大家知道,IP协议的首部有一个"总长度"字段。如果IP 数据报的"总长度"超过或等于 46字节,那么肯定就没有填充字段。反之,如果"总长度"小于46字节,那么就很容易把填充字段计算出。例如,若IP数据报的总长度为42字节,填充字段就应当是4字节。当MAC 帧把 46 字节的数据上交给IP 层后,IP层就把其中最后4字节的填充字段丢弃。

从上图可看出,在传输媒体上实际传送的要比MAC帧还多8个字节。这是因为当一个站在刚开始接收 MAC 帧时,由于适配器的时钟尚未与到达的比特流达成同步,因此MAC 帧的最前面的若干位就无法接收,结果使整个的MAC成为无用的帧。为了接收端迅速实现位同步,从MAC子层向下传到物理层时还要在帧的前面插入8个字节(由硬件生成),它由两个字段构成。第一个字段是7个字节的前同步码(1和0交替码),它的作用是使接收端的适配器在接收 MAC 帧时能够迅速调整其时钟频率,使它和发送端的时钟同步,也就是"实现位同步"(位同步就是比特同步的意思)。第二个字段是帧开始定界符,定义为10101011。它的前六位的作用和前同步码一样,最后的两个连续的1就是告诉接收端适配器"MAC 帧的信息马上就要来了,请适配器注意接收。"MAC 帧的 FCS 字段的检验范围不包括前同步码和帧开始定界符。顺便指出,在使用SONET/SDH进行同步传输时则不需要用前同步码,因为在同步传输时收发双方的位同步总是一直保持着的。

还需注意,在以太网上传送数据时是以帧为单位传送的。以太网在传送帧时,各帧之间还必须有一定的间隙。因此,接收端只要找到帧开始定界符,其后面的连续到达的比特流就都属于同一个 MAC帧。可见以太网不需要使用帧结束定界符,也不需要使用字节插入来保证透明传输。

3、其他

IEEE 802.3标准规定凡出现下列情况之一的即为无效的 MAC 帧:

  • 帧的长度不是整数个字节;
  • 用收到的帧检验序列 FCS 查出有差错:
  • 收到的帧的 MAC 客户数据字段的长度不在 46~1500 字节之间。考虑到 MAC 帧首部和尾部的长度共有18字节,可以得出有效的 MAC帧长度为64~1518字节之间。

对于检查出的无效 MAC 帧就简单地丢弃。以太网不负责重传丢弃的帧。最后要提一下,IEEE 802.3标准规定的MAC帧格式与上面所讲的以太网V2MAC帧格式的区别就是以下三点。

  • 第一,IEEE 802.3 规定的MAC帧的第三个字段是"长度/类型"。由于以太网有效帧的最大长度是1518字节。因此当这个字段值大于0x0600时(相当于十进制的1536),这个字段就表示"类型"。这样的帧格式就和以太网V2MAC帧格式完全一样。只有当这个字段值小于 0x0600 时才表示"长度",即MAC帧的数据部分长度。显然,在这种情况下,若数据字段的长度与实际的长度字段的值不一致,则该帧为无效的 MAC 帧。实际上,前面我们已经讲过,由于以太网采用了曼彻斯特编码,长度字段本来并无实际意义。
  • 第二,当"长度/类型"字段值小于 0x0600时,数据字段必须装入上面的逻辑链路控制LLC 子层的 LLC 帧。
  • 第三,在802.3标准的文档中,MAC帧的帧格式包括了8字节的前同步码和帧开始定界符。有些教科书也是这样引用的。不过这并不影响我们对以太网工作原理的理解。
相关推荐
hakesashou7 分钟前
Python中常用的函数介绍
java·网络·python
C++忠实粉丝18 分钟前
计算机网络socket编程(4)_TCP socket API 详解
网络·数据结构·c++·网络协议·tcp/ip·计算机网络·算法
九州ip动态19 分钟前
做网络推广及游戏注册为什么要换IP
网络·tcp/ip·游戏
Estar.Lee23 分钟前
时间操作[取当前北京时间]免费API接口教程
android·网络·后端·网络协议·tcp/ip
蝶开三月25 分钟前
php:使用socket函数创建WebSocket服务
网络·websocket·网络协议·php·socket
G丶AEOM38 分钟前
SSL/TLS,SSL,TLS分别是什么
网络·网络协议·网络安全
儒道易行42 分钟前
【DVWA】RCE远程命令执行实战
网络·安全·网络安全
Koi慢热2 小时前
路由基础(全)
linux·网络·网络协议·安全
soulteary2 小时前
突破内存限制:Mac Mini M2 服务器化实践指南
运维·服务器·redis·macos·arm·pika
hzyyyyyyyu3 小时前
内网安全隧道搭建-ngrok-frp-nps-sapp
服务器·网络·安全