08_OSI_第二层的设备:交换机和_CA
网络协议那些事儿
内容简介 前言 第二层的设备:交换机 帧转发和 CAM 表 总结 1. 前言 之前的课程里,我们已经学习了 OSI 第一层和相关的硬件。
内容简介
-
前言
-
第二层的设备:交换机
-
帧转发和 CAM 表
-
总结
-
前言
之前的课程里,我们已经学习了 OSI 第一层和相关的硬件。我们又一起开始了 OSI 第二层的学习,了解了它的作用、MAC 地址和以太网协议等等。
这一课,我们来学习一个革命性的设备,它对网络领域的革新起到了很大的推动作用,这个明星设备就是:交换机。
我们会学习机器是如何通过交换机互连的,以及交换机带给网络领域的突破性技术。
- 第二层的设备:交换机
交换机,英语是 switch。switch 这个单词的本义是 “开关,交换,改变,转换”。
交换机简单来说就是一个能够互连机器的设备。
交换机从外观上来看就是一个拥有多个 RJ45 接口(母头)的盒子,可以通过双绞线来连接多个机器。下面是交换机的示意图:

网络领域有一个设备叫 “网桥”,英语是 bridge(“桥,桥梁” 的意思)。网桥其实就是 “拥有两个 RJ45 端口的交换机” 罢了,目前基本已被交换机所取代。
我们可以把其它机器(电脑、打印机、传真机、扫描仪,等等)连接到一个交换机,或者把别的交换机连接上去。如下图所示:

你也许要问了:“如果像上图这样有这么多设备连接到交换机,那交换机怎么知道要把以太网帧(Ethernet Frame)发送给谁呢?”
- 帧转发和 CAM 表
为了将以太网帧(或简称 “帧”)发送到正确的机器,交换机需要知道此帧中的目标 MAC 地址(Destination MAC Address),这个地址是在帧头中的,我们上一课已经学习过。我们再来复习一下以太网帧的结构,如下图所示:

交换机比之前我们学过的集线器(hub)强大得多,主要是因为它有一个表(维护在交换机的内存中),可以将交换机的一个 RJ45 接口(母头)和一个 MAC 地址相关联。这个表就是著名的 CAM 表。
CAM 是 Content Addressable Memory 的缩写。content 是 “内容” 的意思,addressable 是 “可寻址的” 的意思,memory 是 “内存” 的意思,所以 CAM 表示 “内容可寻址内存” 或“内容可寻址存储器”。因此,CAM 表的术语是 “内容可寻址寄存表”。
我们举一个例子来说明 CAM 表的工作原理:

上图表示 “三台机器连接到交换机”。
上图中的交换机的 CAM 表就是这样的:
| 端口 | MAC 地址 |
|---|---|
| 1 | 23 号机器的网卡的 MAC 地址 |
| 2 | 24 号机器的网卡的 MAC 地址 |
| 3 | 25 号机器的网卡的 MAC 地址 |
当 23 号机器想要发送一个帧给 25 号机器时,交换机就读取帧里面包含的目标 MAC 地址,根据 CAM 表中 MAC 地址与 RJ45 端口号的对应关系,就知道要发送给哪个端口(port)了。
下文中,如果简单地说 “xxx 的 MAC 地址”,是表示 “xxx 的网卡的 MAC 地址”。
下图表示 “从 23 号机器发送给 25 号机器的帧”:

在我们的例子中,交换机就会把帧发送到端口 3 上,继而这个帧又会到达 25 号机器,因为只有 25 号机器连接着端口 3。
交换机就是依据帧里面的目标 MAC 地址,和交换机自己的 CAM 表来把帧转发到正确的机器上的。
那么,CAM 表是如何被构建的呢?如果我在交换机上连接一个新的机器,交换机将如何记录这个新的机器呢?
CAM 表的更新
交换机的 CAM 表是以动态的方式被构建的,也就是说交换机会随着流经的帧去不断 “学习”:哪个机器连接在哪个端口。
我们还是用之前的例子来讲解。假设交换机的 CAM 表是空的,我们才刚刚按下图所示将各个机器连接到交换机:

一开始,交换机的 CAM 表是空的:
假设此时 23 号机器发送了一个帧给 25 号机器:

上图表示 “从 23 号机器发送给 25 号机器的帧”。
那么,以下事件将依序发生:
-
帧从 23 号机器被发送到交换机;
-
交换机读取此帧,看到源 MAC 地址(Source MAC Address),是 23 号机器的网卡的 MAC 地址;
-
交换机发现这个帧是从端口 1 过来的,因此它就把端口 1 和 23 号机器的网卡的 MAC 地址关联起来,放入交换机的 CAM 表中;
-
CAM 表被更新。
更新后的 CAM 表如下所示:
| 端口 | MAC 地址 |
|---|---|
| 1 | 23 号机器的网卡的 MAC 地址 |
此时,帧中的目标 MAC 地址(也就是 25 号机器的网卡的 MAC 地址)还没有在交换机的 CAM 表中,因此交换机还不知道应该把此帧发送到哪个端口。
为了保证目标机器能够接收到此帧,交换机就会把此帧发送给除了源 MAC 所关联的机器(此处是 23 号机器)以外的所有机器。在我们的例子中,就是发送给除了端口 1 以外的所有连接着机器的端口。这种操作通常被称为 flooding(泛洪),将从某个接口收到的数据向除该接口之外的所有接口发送出去。
这样,25 号机器也会接收到这个帧,根据帧中的源 MAC 地址,它知道是 23 号机器发送此帧给自己的,“噢,原来是你小子”,因此它就可以回复 23 号机器了。25 号机器会发送一个帧给 23 号机器,这个帧的内容如下:

上图表示 “从 25 号机器发送给 23 号机器的帧”。
那么,以下事件将依序发生:
-
帧从 25 号机器被发送到交换机;
-
交换机读取此帧,看到源 MAC 地址,是 25 号机器的网卡的 MAC 地址;
-
交换机发现这个帧是从端口 3 过来的,因此它就把端口 3 和 25 号机器的网卡的 MAC 地址关联起来,放入交换机的 CAM 表中;
-
CAM 表被更新。
更新后的 CAM 表如下所示:
| 端口 | MAC 地址 |
|---|---|
| 1 | 23 号机器的网卡的 MAC 地址 |
| 3 | 25 号机器的网卡的 MAC 地址 |
因此:
-
当交换机读取一个流经的帧,它就去更新 CAM 表;
-
如果交换机在它的 CAM 表中找不到此帧中的目标 MAC 地址,那么它就会把这个帧发送给除了此帧来源以外的所有机器。
好了,我们现在已经了解了交换机的工作原理。但是聪明如你,应该也发现了:CAM 表的内容会不断增加,毕竟我们会一直 “喂” 给它新的数据。
如何比较有效地解决这样的问题呢?我们来学习一个新的知识点:TTL(生存时间)。
CAM 表的生存时间
在网络领域,我们经常会提及 TTL。
TTL 是 Time To Live 的缩写,表示 “生存时间”。因此,TTL 代表了一段时间。
TTL(生存时间)的主要原理是让数据有效一段时间,一旦超过这段时间,数据就变成无效的了。有点类似食物的保质期,一旦过了保质期,食物就只能被丢弃,作废了。
对于 CAM 表中的数据来说也是一样。表中的数据有一个生存时间,一旦超过这个时间,我们就把这段数据从 CAM 表中移除。这样,过期的数据将被删除,CAM 表中的数据就可以一直更新。
CAM 表中的所有数据都高喊:“宝宝这么可爱,怎么可以删宝宝… 我真的还想再活五百年!”。
我们还是拿之前那个 CAM 表来做例子,如下:
| 端口 | MAC 地址 |
|---|---|
| 1 | 23 号机器的网卡的 MAC 地址 |
| 3 | 25 号机器的网卡的 MAC 地址 |
我们在 CAM 表中添加一列,表示 TTL(生存时间):
| 端口 | MAC 地址 | TTL |
|---|---|---|
| 1 | 23 号机器的网卡的 MAC 地址 | 120 秒 |
| 3 | 25 号机器的网卡的 MAC 地址 | 150 秒 |
可以看到 CAM 表中有两行数据,第二行数据是比较新的,因为它的 TTL 时间(150 秒)比第一行的 TTL 时间(120 秒)要多。
经过 121 秒之后,如果 23 号机器和 25 号机器都没有发送信息,那么 CAM 表将变成这样(150 - 121 = 29):
| 端口 | MAC 地址 | TTL |
|---|---|---|
| 3 | 25 号机器的网卡的 MAC 地址 | 29 秒 |
现在,如果 25 号机器再次发送一个帧,它的 TTL 时间就会被重置,因为交换机重新知悉了 “25 号机器连接着端口 3”,那么 CAM 表将变成这样:
| 端口 | MAC 地址 | TTL |
|---|---|---|
| 3 | 25 号机器的网卡的 MAC 地址 | 150 秒 |
这样,交换机在每次接收到以太网帧的时候都会扩充 CAM 表的内容或者更新已有的内容。如果过了很久,交换机都没有收到任何帧,那么它的 CAM 表就会被清空。
几个补充问题
问题 1 :交换机能主动获知网络中的机器的 MAC 地址吗?
答:通常不能。因为这不是交换机的角色,交换机是一个被动的元器件。此外,机器在知道自己的网卡连接到交换机之后,在大多数情况下会发送帧到网络。交换机查看这个帧,依此更新其 CAM 表。
问题 2 :交换机有 MAC 地址吗?
答:通常没有。没有机器需要真的与交换机通信(“可怜的交换机,傻傻没人爱”),交换机只是一个类似中间人或中继(relay)的角色,负责转发信息,有点类似邮局的包裹处理系统。因此交换机不需要有 MAC 地址。
然而,有些交换机被称为 “可管理的”,这意味着我们可以连接到交换机上,对其进行设置。在这种情况下,交换机需要有一个 MAC 地址,以便在网络中被识别。
CAM 表的实例
下面展示一张真实的交换机的 CAM 表。Port 表示 “端口”,MAC Address 表示 “MAC 地址”:

可以看到,竟然有 6 台机器连接着此交换机的端口 19,也有 3 台机器连接着端口 25。
这可能吗?还是说这是一个错误?
是的,这是可能的。事实上,我们不能在交换机的一个 RJ45 端口上连接多台机器。但是,我们可以在交换机的一个 RJ45 端口上连接另一台交换机,这样所有连接在第二台交换机上的机器的 MAC 地址就很可能会被显示连接在第一台交换机的这个端口上。
所以,根据上面这张 CAM 表的实例图,我们可以推断应该有第二台交换机连接着我们的交换机的端口 19,还有第三台交换机连接着我们的交换机的端口 25。
一些捣蛋行为
现在我们已经知道了交换机的工作原理,如果我们想要使坏,可以怎么做来干扰交换机的正常运作呢?有很多方法可以做到这一点。
方法 1 :批量发送以达到饱和
如果我们向不存在的目标 MAC 地址发送大量的帧,会发生什么呢?
交换机不知道应该把这些帧发送到哪个端口,就会把它们发送到所有连着机器的端口… 这样交换机马上就会超负荷运作了。
方法 2 :使 CAM 表饱和
如果我们向交换机发送大量的帧,每个帧里面的源 MAC 地址每次变换一下,会发生什么呢?
我们知道在这种情况下,交换机的 CAM 表会逐渐被填充。CAM 表中的数据越多,交换机每次读取数据所花的时间就越长… 不仅交换机的内存会不够用,交换机的资源也会被耗尽。当交换机饱和,没有时间去读取 CAM 表中的庞大数据时,它就会把收到的帧转发到所有连着机器的端口。此时,如果一个黑客的电脑也连接着交换机,那么它就可以获取交换机上的所有数据流。当然,我们之后还会学习到一些更厉害的方法,可以查看交换机上的数据流。
现在,我们已经知道了什么是交换机及其工作原理。下一课,我们将看一下交换机对网络的影响,还会介绍 VLAN(虚拟局域网)。
- 总结
-
交换机就像一个中继(relay)或中转站,会通过学习帧中的数据,来更新它的 CAM 表,以便正确地实现帧转发;
-
TTL(生存时间)可以比较有效地避免交换机中的数据陈旧或者数据量过多;
-
交换机不能主动地获知网络中的机器的 MAC 地址,而只能被动地学习;
-
交换机通常没有 MAC 地址;
-
可以通过一些小技巧来使交换机饱和,干扰它的运作。
}如果您想了解更多技术资源,欢迎加入点击这里钉钉群交流IT技术资源查看“IT技术交流群一”群的钉钉群号: 129605002953