一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情。
交换机工作模式
顺着网络传输的路径,本文我们来探索下交换机。
交换机的设计是将网络包原样转发到目的地。
我们先来探索下交换机的工作模式。
交换机内部结构可以简单理解为有两个模块:接收模块 和 MAC 模块。
首先,信号到达网线接口,并由接收模块进行接收,这一部分和集线器是相同的。接下来,接收模块会将网线中的信号转换为通用格式,然后传递给 MAC
模块。MAC
模块将信号转换为数字信息,然后通过包末尾的 FCS 校验错误,如果没有问题则存放到缓冲区中(如果检测到错误就丢弃这个包
)。
将包存入缓冲区后,接下来需要查询一下这个包的接收方 MAC 地址是否已经在 MAC 地址表 中有记录了。MAC 地址表主要包含两个信息,一个是设备的 MAC 地址,另一个是该设备连接在交换机的哪个端口上,具体结构如下表所示:
MAC 地址 | 端口 | 控制信息 |
---|---|---|
00-02-B3-1C-9C-F9 | 2 | ... |
AA-BB-CC_DD-EE-FF | 7 | ... |
... | ... | ... |
MAC 地址是和端口号一一对应的。通过这张表就能够判断出收到的包应该转发到哪个端口。举个例子,如果收到的包的接收方 MA C地址为 00-02-B3-1C-9C-F9,则与上表中的第 1 行匹配,根据端口列的信息,可知这个地址位于 2 号端口上,然后就可以通过交换电路将包发送到相应的端口了。
交换电路的结构如下图所示,它可以将输入端和输出端连接起来。其中,信号线排列成网格状,每一个交叉点都有一个交换开关,交换开关是电子控制的,通过切换开关的状态就可以改变信号的流向。 交换电路的输入端和输出端分别连接各个接收端口和发送端口,网络包通过这个网格状的电路在端口之间流动。每个交叉点上的交换开关都可以独立工作,因此只要路径不重复,就可以同时传输多路信号。
MAC 地址表的维护
交换机在转发包的过程中,还需要对 MAC 地址表的内容进行维护,维护操作分为两种。
第一种是收到包时,将发送方 MAC 地址以及其输入端口的号码写入 MAC 地址表中。 由于收到包的那个端口就连接着发送这个包的设备,所以只要将这个包的发送方 MAC 地址写入地址表,以后当收到发往这个地址的包时,交换机就可以将它转发到正确的端口了。交换机每次收到包时都会执行这个操作,因此只要某个设备发送过网络包,它的 MAC 地址就会被记录到地址表中。
另一种是删除地址表中某条记录的操作,这是为了防止设备移动时产生问题。 如果连接在某个交换机上的设备突然移动或断开,那么当交换机收到发往这台已经消失的设备的包,它依然会将包转发到原来的端口,通信就会出错,因此必须想办法删除哪些过时的记录。然而,交换机没有办法知道某台设备是否从原来的端口移走。因此地址表中的记录不能永久有效,而是要在一段时间不使用后就自动删除。
过时记录从地址表中删除的时间一般为几分钟,因此在过时记录被删除之前,依然可能有发给该设备的包到达交换机。这时,交换机会将包转发到老的端口,通信就会发生错误,这种情况尽管罕见,但的确也有可能发生。遇到这样的情况,只要重启一下交换机,地址表就会被清空并更新正确的信息,然后网络就又可以正常工作了。
特殊场景
上面我们学习了交换机的基本工作模式,下面我们来看一些特殊场景下交换机的一些操作。
源端口和目标端口是同一个
如下图所示,计算机 A 发送的包到达集线器后会被集线器转发到所有端口上,也就是会到达交换机和计算机 B。这时,交换机转发这个包之后,这个包会原路返回集线器,然后,集线器又把包转发到所有端口,于是这个包又到达了计算机 A 和计算机 B。所以计算机 B 就会收到两个相同的包,这会导致无法正常通信。因此,当交换机发现一个包要发回到原端口时,就会直接丢弃这个包。
找不到 MAC 地址
还有另外一种特殊情况,就是地址表中找不到指定的 MAC 地址。这可能是因为具有该地址的设备还没有向交换机发送过包,或者这个设备一段时间没有工作导致地址被从地址表中删除了。这种情况下,交换机无法判断应该把包转发到哪个端口,只能将包转发到除了源端口之外的所有端口上,无论该设备连接在哪个端口上都能收到这个包。这样做不会产生什么问题,因为以太网的设计本来就是将包发送到整个网络的,然后只有相应的接收者才接收包,而其他设备则会忽略这个包。
此外,如果接收方 MAC 地址是一个广播地址(广播地址(broadcast address)是一种特殊的地址,将广播地址设为接收方地址时,包会发送网络中的所有的设备。MAC 地址中的 FF:FF:FF:FF:FF:FF 和 IP 地址中的 255.255.255.255 都是广播地址
),那么交换机会将包发送到除源端口之外的所有端口。
参考文档
- 《网络是怎样连接的》—— 户根勤
往期文章
- 网络是怎样连接的(一)—— 浏览器访问 Web 服务器过程概览
- 网络是怎样连接的(二)—— 浏览器生成 HTTP 消息
- 网络是怎样连接的(三)—— 通过 DNS 服务器查询 IP 地址
- 网络是怎样连接的(四)—— DNS 服务器工作介绍
- 网络是怎样连接的(五)—— 委托操作系统进行收发消息过程概览
- 网络是怎样连接的(六)—— 协议栈内部探索步骤
- 网络是怎样连接的(七)—— 协议栈的内部结构
- 网络是怎样连接的(八)—— 探索套接字
- 网络是怎样连接的(九)—— 连接连的到底是啥
- 网络是怎样连接的(十)—— 连接操作的实际过程
- 网络是怎样连接的(十一)—— 协议栈发送数据特性
- 网络是怎样连接的(十二)—— 数据收发操作中重要标志位 ACK
- 网络是怎样连接的(十三)—— 从服务器断开并删除套接字
- 网络是怎样连接的(十四)—— 网络包传输概览(IP 模块视角)
- 网络是怎样连接的(十五)—— 网络包传输概览(IP 模块视角)
- 网络是怎样连接的(十六)—— 生成包含接收方 IP 地址的 IP 头部
- 网络是怎样连接的(十七)—— 生成以太网用的 MAC 头部
- 网络是怎样连接的(十八)—— 将服务器的响应包从 IP 传递给 TCP
- 网络是怎样连接的(十九)—— UDP协议的收发操作
- 网络是怎样连接的(二十)—— 信号在网线和集线器中传输