On this page
交换机是一种多端口的网桥,在数据链路层使用MAC地址转发数据。交换机分为有线交换机和无线交换机,有线交换机一般是多级交换机之间互相连接,最下级交换机连接终端设备,形成网络拓扑,来将数据包分发至终端设备。无线交换机则可以使用广播功能,将数据包广播给多台设备。
通常情况下,链路层会将MAC地址封装进以太网帧,然后发给交换机,这一过程高度依赖于ARP协议,即地址解析协议,Address Resolution Protocol,ARP协议基于IPv4地址来确定对应的MAC地址,其工作流程如下:
- ARP请求:请求者需要知道特定IP地址的MAC地址时,它会在局域网内广播一个ARP请求。这个请求包含发送者的IP和MAC地址,以及它正在寻找的IP地址的MAC地址。
- 网络广播:ARP请求以广播形式发送,局域网内所有设备都会接收到这个请求,每个设备都会检查ARP请求中的目标IP地址。
- ARP回复:称为响应者发现ARP请求中的目标IP地址与自己的IP地址匹配,它就会向请求者发送一个ARP回复。这个回复包含响应者的IP地址和对应的MAC地址。
- 缓存MAC地址:请求者接收到ARP回复后,它会将响应者的IP地址和MAC地址存储在本地的ARP缓存中,以便将来进行通信时可以直接使用,避免重复ARP请求过程。
- 数据包发送:一旦请求者获得了目标MAC地址,它就可以将数据封装在以太网帧中,并通过MAC地址发送给目标设备。
ARP协议的现实场景
如下图可见一个ARP协议广播查询和单播回复的场景。
我的路由器发送了一个广播消息,询问"Who has 192.168.0.80"。
然后我的机器单播向路由器返回了我的IP和MAC地址。
在帧到达交换机后,交换机会检查Header中的目标MAC地址,并尝试和自己的MAC地址表(或称转发数据库)中的记录进行匹配,基于匹配结果,有下面四种行为:
泛洪
交换机没有在MAC地址表中找到和目标MAC地址匹配的记录,则交换机将数据帧发送到自己的全部端口,也就是"广播"给下游的所有设备;下游设备也会检查Header,如果发现目标MAC地址和自己的不符,则会默默丢弃。
学习
交换机其中一个主要功能是维护一个 MAC 地址表,将每个交换机端口与所连接设备的 MAC 地址建立映射关系。交换机的MAC地址表一开始是空的,因此每次当交换机接收到数据帧时,都会查看Header,将数据帧中的源MAC地址和接收到数据帧的端口进行映射,并存储在自己的MAC地址表中。慢慢地,每个连接到交换机的设备都会发出一些数据,MAC地址表中的记录会逐渐增加,直到这个局域网下的所有设备的MAC地址和端口映射都存储到了自己的MAC地址表中。因此,交换机只会将数据帧的发送方的MAC地址存储在MAC地址表,对于所有在表中没有记录的MAC地址,会一律使用泛洪作为应对。
当MAC地址表满了时,最新学习到的MAC地址会覆盖最长时间没有数据帧发送的MAC地址。不过现在即使是家用交换机,一般也可以存储5000以上的MAC地址,MAC地址表满了的情况比较少见。
转发
交换机在MAC地址表中找到和目标MAC地址匹配的记录,交换机将数据帧转发到对应的端口。
过滤
基本上只有泛洪功能会依赖过滤。过滤主要是为了防止数据帧在泛洪时被发回给来源端口。
练习
考虑一个简单的交换机,它只有一个 MAC 地址表,用于存储网络中三个设备的位置,并且以空的 MAC 地址表开始。对于所选输入数据中的每个帧,指示交换机是否会转发、过滤或泛洪该帧,并指示处理每个帧后的 MAC 地址表内容。
交换数据:
A sends to E
E sends to D
E sends to C
E sends to D
D sends to C
E sends to C
B sends to D
D sends to A
A sends to B
A sends to C
解
A sends to E
操作:泛洪(E的位置未知)
MAC地址表更新:A
E sends to D
操作:泛洪(D的位置未知)
MAC地址表更新:A, E
E sends to C
操作:泛洪(C的位置未知)
MAC地址表更新:A, E, C(此时表已满)
E sends to D
操作:泛洪(D的位置未知)
MAC地址表保持不变:A, E, C
D sends to C
操作:转发(C的位置已知)
MAC地址表更新:D替换A(因为需要存储最近使用的设备),变为D, E, C
E sends to C
操作:转发(C的位置已知)
MAC地址表保持不变:D, E, C
B sends to D
操作:泛洪(因为B不在表中,D的位置虽已知但需要泛洪以学习B的位置)
MAC地址表更新:B替换E,变为D, B, C
(实际上不知道B的位置也可以将数据帧转发到D,在这里交换机使用泛洪的根本目的是学习B的位置)
D sends to A
操作:泛洪(A的位置未知)
MAC地址表更新:D保持,因为A不在表中且表已满,D,B,C
A sends to B
操作:泛洪(因为A不在表中)
MAC地址表更新:A替换D,变为A, B, C
A sends to C
操作:转发(因为C的位置已知)
MAC地址表保持不变:A, B, C