上一章我们聊到了网络地址、子网掩码、和广播地址如何计算的问题,这一章节我们来进行一次深潜,聊聊 MAC 层的那些事。

Hub 集线器

相信不少读者在大学时代都联机打过游戏,最简单的方法是直接将一根网线连接两台电脑,便形成了一个小型局域网。光两个人玩 CS 不过瘾,宿舍里的其他小伙伴都想加入,此时该怎么办?别急,有办法,大家众筹买个 Hub 集线器就可以了,这样组网也就成功了。

Hub 是什么?Hub 叫集线器,是我们上学时那个年代的东西。 集线器没有大脑,它完全在物理层工作。它会将自己收到的每一个字节,都复制到其他端口上去。但是光这样还不够,这仅仅是第一层物理层联通的方案。

Hub 采取的是广播的模式,如果每一台电脑发出的包,宿舍的每个电脑都能收到,那就麻烦了。所以这就需要解决几个问题:

  1. 这个包是发给谁的?谁应该接收?
  2. 大家都在发,会不会产生混乱?有没有谁先发、谁后发的规则?
  3. 如果发送的时候出现了错误,怎么办?

MAC 层

上面的问题就是数据链路层,即 MAC 层要解决的问题。MAC 的全称是 Medium Access Control,即媒体访问控制。控制的就是在往媒体上发数据的时候,谁先发、谁后发的问题。也就是上面的第二个问题。这个问题中的规则学名就叫做多路访问。多路访问的控制规则有很多,比如:

  • 方式一:分多个车道。每个车一个车道,你走你的,我走我的。这在计算机网络里叫作信道划分;
  • 方式二:今天单号出行,明天双号出行,轮着来。这在计算机网络里叫作轮流协议;
  • 方式三:不管三七二十一,有事儿先出门,发现特堵,就回去。错过高峰再出。我们叫作随机接入协议。著名的以太网,用的就是这个方式。

ARP 协议

接下来要解决第一个问题,这里要用到一个物理地址,叫链路层地址。因为第二层主要解决媒体接入控制的问题,所以它常被称为 MAC 地址。

这里又引入另一个问题,一个广播的网络里面接入了 N 台机器,怎么知道每个 MAC 地址是谁呢?这就是 ARP 协议。也就是已知 IP 地址,求 MAC 地址的协议。

下面看两张图,详细解释了 ARP 协议的工作原理:

在一个局域网里面,当知道了 IP 地址,不知道 MAC 怎么办呢?靠“吼”。

广而告之,发送一个广播包,谁是这个 IP 谁来回答。具体询问和回答的报文就像下面这样:

为了避免每次都用 ARP 请求,机器本地也会进行 ARP 缓存。当然机器会不断地上线下线,IP 也可能会变,所以 ARP 的 MAC 地址缓存过一段时间就会过期。

CRC 冗余校验码

对于第三个问题,让我们回归到二层的数据包格式。对于以太网,看下图:

除了最开始的目标的 MAC 地址和源的 MAC 地址。还有最后一个 CRC 字段,也就是循环冗余检测。通过 XOR 异或的算法,来计算整个包是否在发送的过程中出现了错误。第三个问题也就迎刃而解。

总结

这一章我们从学生时代的宿舍联机游戏引入了 MAC 层,介绍了什么是 MAC 层,并顺带提出了 MAC 层所结局的三个核心问题,并依次对三个抛出的问题进行了解答。