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

ops/2024/9/18 12:38:00/ 标签: 计算机网络, macos, 网络, mac, 网络协议

文章目录

  • 一、MAC 层的硬件地址
    • 1、介绍
    • 2、注意点
    • 3、定制标准
  • 二、MAC 帧的格式
    • 1、结构
    • 2、工作原理
    • 3、其他

一、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} 1x1014时,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字节的前同步码和帧开始定界符。有些教科书也是这样引用的。不过这并不影响我们对以太网工作原理的理解。

http://www.ppmy.cn/ops/12886.html

相关文章

【从零开始学习IO机制 | 第一篇】I/O的演进之路

前言: 自诞生以来,Java 一直是软件开发领域的重要一环。作为一种广泛应用于各种应用程序和系统的编程语言,Java 一直致力于提供高效、可靠的 I/O(输入/输出)操作,以满足不断增长的软件需求和用户期望。 Ja…

实施阶段(2024年4月)

本次探究内容是算法中的“二分法”,“二分法”是分治策略的典型应用,分治策略是将一个难以直接解决的大问题分割成一些比较小的同类问题,各个击破,最终达到解决问题的目的。二分查找又叫折半查找,通过与中点位置的元素…

网站卡顿的各种情况分析

首先,确定这些问题是否存在。 1.服务器带宽是否超出? 2.服务器里面是否还存在着运行其他软件导致服务器卡顿? 3.服务器配置是否达到标准需求? 4.服务器是否会超出延迟标准,或者PING值掉包严重? 以上四个问题…

YOLOv8改进 添加倒置残差注意力机制iRMB

一、iRMB论文 论文地址:2301.01146.pdf (arxiv.org) 二、RethinkingMobileBlock注意力结构 iRMB结构主要由两个部分组成:多分支注意力模块和倒置残差连接。多分支注意力模块用于提取图像特征,倒置残差连接用于优化模型的训练。 多分支注意力模块由多个分支组成,每个分支…

古董展新风尚:山海鲸数据大屏引领科技潮流

在数字化浪潮的推动下,传统文化与现代科技正日益融合,展现出独特的魅力。近日,山海鲸推出了一款古董展览数据可视化大屏,将古董藏品的丰富内涵以直观、生动的形式呈现在观众面前,让人们在欣赏古董之美的同时&#xff0…

条件编译 #和##运算符

目录 1. #运算符2. ##运算符3. 条件编译4. 题目分享总结 正文开始 前言: 本章为C语言语法完结撒花, 下文将进行C语言中#和##操作符以及条件编译的讲解, 来进一步让我们了解C语言. 作者主页: 酷酷学!!! 1. #运算符 #运算符将宏的⼀个参数转换为字符串字⾯量。它仅允许出现在带…

如何实现调接口控制 - 每次最多只能同时进行n个请求

题目:调接口时限制每次最多只能有两个接口同时请求,最终让所有接口都完成请求。 思考: 计数:每次调接口加一,调完减一,如果正在执行的接口 > 2,则等待,否则继续执行 如何阻止继…

2. TLS/SSL的工作原理

TLS/SSL全称安全传输层协议(Transport Layer Security), 是介于TCP和HTTP之间的一层安全协议,不影响原有的TCP协议和HTTP协议,所以使用HTTPS基本上不需要对HTTP页面进行太多的改造。 TLS/SSL的功能实现主要依赖三类基本算法&#…

Next实现 i18n 传递 locales 给 getStaticPaths

在 Next.js 中实现国际化(i18n)时,可以通过配置 next.config.js 文件来传递 locales 给 getStaticPaths 函数。下面是一个示例代码,演示如何在 next.config.js 中配置 locales,并在 getStaticPaths 中获取并使用这些 …

数据科学与大数据(2)

数据分析,要从能解决问题,常常解决的问题有4个问题:1.是什么?2.为什么?3.怎么做?4.做多少?,然后第3点和第4点往往是三年以上的数据分析师来干的,刚进入的小白往往是从事第1类和第2类问题。第1类问题是用数据去量化企…

hot100-图论/岛屿问题

问题模板 为什么要将格子标记为【已遍历】—避免 重复遍历 (这是因为,网格结构本质上是一个「图」,我们可以把每个格子看成图中的结点,每个结点有向上下左右的四条边。在图中遍历时,自然可能遇到重复遍历结点。这时候&…

爱普生实时时钟模块(RTC)

爱普生是一家IC和晶体自主研发的公司,有自己的IC和晶振产线。所以我们能将RTC IC晶体单元外结电容封装在一起,组成独立RTC模块。外围不需要在接晶体和匹配电容。爱普生RTC能够简化客户的设计和生产制成。 时钟精度:时钟精度的校准晶体筛选、格外的检测 …

leetcode:438. 找到字符串中所有字母异位词

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。 示例 1: 输入: s "cbaebabacd", p "…

前端发送请求之fetch跟axios的区别

前端开发工程师在针对页面UI设计稿还原之后,还需要与后端开发工程师进行接口对接,发送请求获取后端接口数据后进行逻辑处理呈现给用户。 常见的发送请求的方式是:Fecth,Axios 以下概念来自AI Fecth与Axios的区别: AP…

PHP中的错误处理机制是怎样的?

HP中的错误处理机制是一个关键组件,它帮助开发者识别、记录和处理在代码执行过程中出现的各种问题。这种机制确保了程序的稳定性和可维护性,使开发者能够迅速定位并修复错误。 PHP中的错误处理主要包括以下几个方面: 错误级别: P…

SQL存储引擎

一、MySQL体系结构 连接层 最上层是一些客户端和链接任务,主要完成一些类似于连接处理、授权认证以及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。 服务层 第二层架构主要完成大多数的核心服务功能,如SQL接口&#xff…

【驱动】AM437x中出现很多bioset进程,杀不掉,有影响吗?

1、问题描述 查看linux系统进程时,发现很多bioset进程 2、问题分析 1)bioset进程是内核线程 这些bioset进程与Linux内核的块I/O(Block Input/Output)层有关,它们是内核线程,不是用户空间的进程。 Linux的块I/O层负责管理磁盘和其他块设备的数据传输。当系统读写磁盘…

C++笔试强训day6

目录 1.Fibonacci数列 2.单词搜索 3.杨辉三角 1.Fibonacci数列 链接 解析题目本意就是找到离斐波那契数最近的那个输入数的距离。 很简单的思路,直接一边建立斐波那契数列,一边判断是否已经小于这个斐波那契数,直接break中断循环&#xf…

【Redis(3)】深入理解Redis三种高可用方案,以做出明智的选择

通过上一篇文章详细介绍了Redis的持久化方式RDB和AOF配置,这一篇主要介绍Redis的几种高可用方案。 Redis作为一个成熟的远程字典服务,提供了三种常用的高可用设计方案,Redis的每种高可用性方案都各有千秋,选择时需要细致考虑业务…

SIT3088E:3.0V~5.5V 供电,14Mbps 半双工 RS485/RS422 收发器

特点: 3.0V~5.5V 宽电源范围,半双工;  总线端口 ESD 保护能力 HBM 达到 15kV 以上;  总线容错耐压达到15V;  1/8 单位负载,允许最多 256 个器件连接到总线;  驱动器短路输出保护&…