一,MAC

MAC是媒体访问控制器。以太网MAC由IEEE-802.3以太网标准定义。它实现了数据链路层。最新的MAC同时支持10/100/1000Mbps速率。通常情况下,它实现MII/GMII/RGMII接口,来同行业标准PHY器件实现接口。

MAC由硬件控制器及MAC通信协议构成。该协议位于OSI七层协议中数据链路层的下半部分,主要负责控制与连接物理层的物理介质。MAC硬件框图如下图所示:

在发送数据的时候,MAC协议可以事先判断是否可以发送数据,如果可以发送将给数据加上一些控制信息,最终将数据以及控制信息以规定的格式发送到物理层;在接收数据的时候,MAC协议首先判断输入的信息并是否发生传输错误,如果没有错误,则去掉控制信息发送至LLC(逻辑链路控制)层。该层协议是以太网MAC由IEEE-802. 3以太网标准定义。一般以太网MAC芯片的一端连接PCI总线,另一端连接PHY芯片上通过MII接口连接。

扩展

       以太网数据链路层其实包含MAC(介质访问控制)子层和LLC(逻辑链路控制)子层。一块以太网卡MAC芯片的作用不但要实现MAC子层和LLC子层的功能,还要提供符合规范的PCI界面以实现和主机的数据交换。
  MAC从PCI总线收到IP数据包(或者其他网络层协议的数据包)后,将之拆分并重新打包成最大1518Byte、最小64Byte的帧。这个帧里面包括了目标MAC地址、自己的源MAC地址和数据包里面的协议类型(比如IP数据包的类型用80表示,最后还有一个DWORD(4Byte)的CRC码。
  可是目标的MAC地址是哪里来的呢?这牵扯到一个ARP协议(介乎于网络层和数据链路层的一个协议)。第一次传送某个目的IP地址的数据的时候,先会发出一个ARP包,其MAC的目标地址是广播地址,里面说到:“谁是xxx.xxx.xxx.xxx这个IP地址的主人?”因为是广播包,所有这个局域网的主机都收到了这个ARP请求。收到请求的主机将这个IP地址和自己的相比较,如果不相同就不予理会,如果相同就发出ARP响应包。这个IP地址的主机收到这个ARP请求包后回复的ARP响应里说到:“我是这个IP地址的主人”。这个包里面就包括了他的MAC地址。以后的给这个IP地址的帧的目标MAC地址就被确定了。(其它的协议如IPX/SPX也有相应的协议完成这些操作)
  IP地址和MAC地址之间的关联关系保存在主机系统里面,叫做ARP表。由驱动程序和操作系统完成。在Microsoft的系统里面可以用arp-a 的命令查看ARP表。收到数据帧的时候也是一样,做完CRC校验以后,如果没有CRC效验错误,就把帧头去掉,把数据包拿出来通过标准的接口传递给驱动和上层的协议栈。最终正确的达到我们的应用程序。

这里还需要理解一个重要概念就是MAC地址,下面详细介绍相关知识。

二、MAC 地址

MAC 地址用于识别数据链路中互连的节点(如图 3.4),以太网或 FUDI 中,根据IEEE802.3的规范使用 MAC 地址。其他诸如无线 LAN ( IEEE802.lla/b/g/n等) 、 蓝牙等设备中也是用相同规格的 MAC 地址。

图8‑5通过MAC地址判断目标地址

在总线型与环路型的网络中,先暂时获取所有目标站的帧,然后再通MAC寻址如果是发给自已的就接收,如果不是就丢弃(在令牌环的这种情况下,依次转发给下一个站)。

MAC 地址长 48 比特,结构如图XX所示。 在使用网卡 ( NIC ) 的情况下,MAC 地址一般会被烧人到 ROM 中。因此,任何一个网卡的 MAC 地址都是唯一。

图8‑6 IEEE802.3 规范的 MAC地址格式

MAC 地址中 3 ~ 24 位 ( 比特位) 表示厂商识別码, 每个 NIC 厂商都有特定唯一的识别数宇。 25 ~ 48 位是厂商内部为识別每个网卡而用。 因此. 可以保证全世界不会有相同MAC 地址的网卡。

IEEE802.3 制定 MAC 地址规范时没有限定数据链路的类型,即不论哪种数据链路的网络 (以太网 、 FDD1 , ATM 、 无线 LAN 、 蓝牙等), 都不会有相同的 MAC地址出现。

MAC 地址是不是一定是唯一的?

在全世界,MAC 地址也并不总是唯一的。实际上,即使 MAC 地址相同,只要不是同属一个数据链路就不会出现问题。

例如,人们可以在自己的网卡上自由设置自己的 MAC 地址。 再例如,一台主机上如果启动多个虚拟机,由于没有硬件的网卡只能由虚拟软件自己设定 MAC 地址给多个虚拟网卡,这时就很难保证所生成的 MAC 地址是独一无二的了。

但是,无论哪个协议成员通信设备,设计前提都是 MAC 地址的唯一性。这也可以说是网络世界的基本准则。

三、参考资料

1、https://mp.weixin.qq.com/s/hZ4VhLKv7FTOJnzg6oAKUg

2、https://blog.csdn.net/zcshoucsdn/article/details/80090802#comments

最新文章

  1. ATL封装IE内核启示:使用Win32/ATL建立窗口
  2. mybatis 获取自增ID
  3. 引用google的jQuery文件
  4. GCD使用dispatch_semaphore_t创建多线程网络同步请求
  5. libpcap报文解析: ipv4、ipv6(待优化)
  6. JQ 选择器大全
  7. 关于 tomcat 集群中 session 共享的三种方法
  8. QT:多线程HTTP下载文件
  9. 2014 Web开发趋势
  10. find查找大于1M小于10M的文件 $ find . -size +1M -size -10M
  11. 【Android进阶】Activity的四种加载模式
  12. Spark 倾斜连接
  13. opencv-jni -调试出错taking address of temporary [-fpermissive]
  14. matlab函数:residue和residuez的用法
  15. QT制作窗口切换的小程序
  16. 用 label 控制 Pod 的位置 - 每天5分钟玩转 Docker 容器技术(128)
  17. 【BZOJ 2673】[Wf2011]Chips Challenge
  18. python 进程介绍 进程简单使用 join 验证空间隔离
  19. elasticsearch简单操作(一)
  20. IQuerable与IEnumable的区别

热门文章

  1. Leetcode No.1 Two Sum(c++哈希表实现)
  2. Java学习之注解篇
  3. Scala学习——面向对象
  4. IPV6改造?华为云如此简单
  5. U盘启动盘安装win10出现cdboot:couldn't find ntldr
  6. 第五十三篇 -- MFC美化界面2
  7. sql select 1 和 exists
  8. IDEA web项目小坑
  9. 类加载机制+JVM调优实战+代码优化
  10. PASS-单组目标值法的样本量计算