在上一篇文章中,我们研究了两台主机直接相互通信所发生的一切。在本文中,我们将添加一个常见的网络设备:交换机。我们将看看通过交换机从主机到主机的通信会发生什么。

交换机的功能

交换机主要有四种功能:学习(Learning)、泛洪(Flooding)、转发(Forwarding)和过滤(Filtering)。

学习(Learning)

作为第二层设备,交换机将根据第二层数据头中的信息做出所有后续操作。具体来说,交换机会使用数据头中的源 MAC 地址和目标 MAC 地址来做出决策。

交换机的功能之一是维护一个 MAC 地址表,将其每个交换机端口与所连接设备的 MAC 地址建立映射关系。

MAC 地址表一开始是空的,每次交换机收到任何东西时,它都会查看传入帧的源 MAC 地址字段。它使用源 MAC 和接收帧的交换机端口在 MAC 地址表中构建条目。

慢慢的每个连接的设备都不可避免地会发送一些数据包给交换机,交换机的 MAC 地址表将记录所有与之相连的设备的 MAC 地址。之后,交换机就可以轻松的进行数据转发了。

泛洪(Flooding)

尽管交换机有学习能力,但是当交换机接收到一个它不知道的设备的 MAC 地址时,交换机会简单地复制这个数据帧并将其发送到所有端口。这就是泛洪。

泛洪可以确保如果目标设备存在并且它连接到交换机,它肯定会收到帧。

每个连接到这个交换机的设备会接收这个数据帧并查看目标 MAC 地址字段。如果这个设备发现这个 MAC 地址不是自己的,那么设备会默默地丢弃这个数据帧。

如果这个设备是要发送数据的目的设备,那么,这个设备在接收到数据之后,会生成一个响应发送给交换机。当发送到交换机时,交换机会将未知设备映射到其交换机端口,存在 MAC 地址表中。

转发(Forwarding)

理想情况下,对于遇到的每个目标 MAC,交换机在其 MAC 地址表中都有一个条目。

当接收到数据帧时,交换机会将帧转发到适当的交换机端口。

交换机有三种方法来转发数据帧:

  • 存储和转发 交换机将整个帧(数据头 + 数据)复制到内存缓冲区中,并在转发之前检查该帧是否存在错误。这种方法是最慢的,但允许最好的错误检测和附加功能,例如优先处理某些类型的流量以加快处理速度。
  • 直通 交换机不存储任何内容,只检查读取目标 MAC 地址和转发帧所需的最低限度。这种方法是最快的,但不提供错误检测或附加功能的能力。
  • Fragment Free 这种方法是前两种方法的混合。在转发帧之前,交换机仅检查帧的第一部分(64 字节)。如果发生传输错误,通常会在前 64 个字节内会有提现。因此,这种方法提供了“足够好”的错误检测,同时获得了避免在转发之前将整个帧存储在其内存中的速度和效率。

值得指出的是,在现代,使用线速交换,这三者之间的速度差异可以忽略不计,并且大多数交换机以存储和转发模式运行。

过滤(Filtering)

过滤功能可以保证交换机永远不会将数据帧转发回接收到数据帧的同一端口。

通常情况下,当交换机需要泛洪帧时会依赖过滤功能。帧将被复制并发送到每个交换机端口,除了接收帧的交换机端口。

如果接收到的数据帧的目标 MAC 地址就是源 MAC 地址,通常情况下,交换机会认为发生了错误或者受到攻击,会丢弃该数据帧。

交换机是如何工作的

下图展示了交换机的工作过程。通常情况下,图中的主机需要借助于 ARP 协议找到目标主机的 MAC 地址,简便起见,图中省略了这部分的过程。

交换机的工作过程

主机 A 需要给主机 B 发送一些数据。

在初始状态下,交换机的 MAC 地址表是空的。只有在收到帧时交换机才会填充 MAC 地址表。

当主机 A 向交换机发送帧时,它包含 aaaa.aaaa.aaaa 的源 MAC 地址。交换机在 MAC 地址表中增加一条端口 1 到 MAC 地址 aaaa.aaaa.aaaa 的映射。

然后,转发这个数据帧的时候,交换机发现 MAC 地址表中没有 bbbb.bbbb.bbbb 相关的记录。此时,交换机就会复制这个数据帧并将其从除了端口 1 以外的所有端口发出。

这个数据帧随后被主机 C 和主机 B 接收。主机 C 在检查第二层数据头时发现这个数据帧不是发送给它的,于是就丢弃了数据。当主机 B 收到数据帧时,发现这个数据帧是发给自己的,于是接受这个数据帧,同时生成响应。

当响应到达交换机时,交换机知道了目标 MAC 地址的映射端口,于是在 MAC 地址表中增加一条端口 2 到 MAC 地址 bbbb.bbbb.bbbb 的映射。

之后,交换机开始查找目标 MAC 地址 (aaaa.aaaa.aaaa) ,并发现该地址存在于端口 1。于是交换机就简单地转发这个数据帧,因为它知道目标 MAC 地址的位置。

广播(Broadcasts)

关于广播和交换机的泛洪行为,经常会出现一些混淆。因为这两种行为的最终结果是相同的,但理解区别也很重要。

广播的数据帧是发给本地网络上每一个设备的数据帧。一个广播帧的数据头与普通数据帧的数据头除了目标 MAC 地址被设置成了一个特殊地址:ffff.ffff.ffff 以外,其他别无不同。“全F”地址是专门为广播保留的。

根据定义,如果交换机遇到目标 MAC 地址为 ffff.ffff.ffff 的数据包,它将始终泛洪该数据帧。换一种方式,由于地址 ffff.ffff.ffff 是保留的,因此交换机无法建立 MAC 地址表映射。因此,任何以该 MAC 地址为目的地的数据帧都将被泛洪出去。

综上所述,广播是发送给本地网络上所有设备的帧 (ffff.ffff.ffff),而泛洪是交换机可以执行的操作。根据定义,广播帧将始终被交换机泛洪。但是交换机永远不会广播帧(因为广播不是交换机的功能)。

总结

本文我们介绍了交换机的四种能力:学习、泛洪、转发和过滤。

同时,我们通过一个样例描述了在交换机的工作过程中,这四种能力是如何发挥作用的。

之后,我们对泛洪和广播做了说明,阐述了两者之间的区别。

关注微信公众号,获取最新推送~