据我目前所注意到,局域网中经常会有一个交换机,这些交换机根据 MAC 地址路由数据包,现在如果在局域网中有两个交换机连接到一台 PC,由于我到目前为止还没有看到为交换机设置的 MAC 地址,那么 PC 如何知道将数据包发送到哪个交换机?
答案1
它根本不会把它发送到交换机。它会把它发送到任何界面具有正确的 IP 地址和子网,或如果两者都有效,则选择它认为速度更快或到主机的跳数最少的那个。
如果网络接口具有不同的 IP 地址并按子网隔离,那么这将有效地选择在哪个接口上发送数据包。
每个接口还可以指定一个“指标”它基本上表明“这个接口应该更快”,并且对于更快的接口,数字会更低。您可以让操作系统建立指标,从而建立首选接口,或者您可以在网络接口属性中自行设置。
您的操作系统中的网络系统可能还会使用 TCP/IP 数据包中的 TTL(生存时间)信息来确定哪个链接更短,但这并不是速度的可靠指示。
更智能的系统可能会使用负载平衡和对链路最近延迟的了解来动态调整或覆盖接口度量。
答案2
这取决于您拥有什么样的设置。
您的计算机上可能有两个网络接口,连接到两个完全不同的网络。在这种情况下,数据包将从 IP 路由确定的接口发出,系统可能会也可能不会在两个网络之间路由流量。
例如,此处,前往 的任何内容192.168.0.x
都将通过交换机 #1 发出eth0
。如果您还通过例如 有默认路由192.168.0.1
,则其他所有内容不是去往10.1.2.x
也将前往eth0
路由器。
+----------+ eth0
| | 192.168.0.10/24 +------------+ { other computers }
| computer |-------------------| switch #1 |---- { in 192.168.0.0/24 }
| | +------------+ { ... }
| | eth1
| | 10.1.2.3/24 +------------+
| |-------------------| switch #2 |---- ...
+----------+ +------------+
上面的拓扑结构与您在评论中提到的拓扑结构相同。由于两个交换机之间没有连接,因此相同的两个接口上的 IP 子网只有在系统充当两个网络之间的桥梁时才有意义,允许一端的所有主机访问另一端。单个主机的查找方式与交换机查找它们的方式相同:通过跟踪 MAC 地址出现的位置,如果不知道目标 MAC 的位置,则将流量泛洪到所有端口。
如果没有桥接,当应用程序想要连接到一个同时存在于两个地方的地址时,就没有直接的方法知道该使用哪个网络。这不仅仅是找到在哪里具有该地址的主机已找到,但可能有两个。
另一方面,如果两台交换机是外部连接的(与上述情况不同),则可以将两个网络接口连接到两台交换机,它们都位于同一第 2 层网络和 IP 子网上,而无需桥接。这可用于冗余/容错或增加带宽。
如果操作系统处理接口之间的故障转移,则可以使用一个 IP 地址来实现。例如,如果一个接口发生故障,Linux 绑定驱动程序可以在两个接口之间透明地进行故障转移。然后,流量将沿着当前处于活动状态的链路发送。
如果两个交换机是独立的,则通常无法实现负载平衡。但如果它们是支持负载平衡的单个逻辑平台的一部分,则可以运行链路控制协议在两条链路上,透明地平衡两条链路上的流量。使用 LACP,流量根据对源地址和目标地址的哈希值进行拆分。
bond0: eth0 + eth1, 192.168.0.10/24
+----------+
| | eth0 (bonded) +------------+ { other computers }
| computer |-------------------| switch #1 |---- { in 192.168.0.0/24 }
| | +------------+ { ... }
| | | |
| | eth1 (bonded) +------------+ |
| |-------------------| switch #2 |--------+
+----------+ +------------+
也可以使用两个 IP 地址,由应用程序处理流量分配。这类似于网络上只有两个独立主机。(可能需要基于策略的路由才能让源 IP 地址影响所使用的传出接口。)
+----------+ eth0
| | 192.168.0.10/24 +------------+ { other computers }
| computer |-------------------| switch #1 |---- { in 192.168.0.0/24 }
| | +------------+ { ... }
| | eth1 | |
| | 192.168.0.11/24 +------------+ |
| |-------------------| switch #2 |--------+
+----------+ +------------+
请注意,虽然交换机有 MAC 地址,但它们仅用于控制功能,与数据流量无关。交换机会保留一个表,其中包含它们在每个端口上看到的主机 MAC 地址,并使用该表将数据帧转发到正确的位置。主机只有路由条目,说明“到网络 N 的流量从接口 I 发出”,或“到网络 M 的流量通过接口 J 发送到路由器 R”,或者还考虑源地址的路由条目。主机必须使用 ARP 或类似方法找出目标 MAC 地址,但这是目标的 MAC 地址主持人,而不是开关。
此外,“路由”是网络/IP/第 3 层功能,而不是交换机的功能。交换机“转发”帧,或者可能只是“切换”它们。(我很乐意使用后者,尽管也许有些人可能不同意。)
这两个网络接口是位于单个 (PCI/PCIe) 卡上、位于两个卡上、集成在主板上还是通过 USB 连接等方式并不重要。只要它们是完全独立的接口,而不仅仅是交替的即可身体的同一实际接口的连接器。例如,许多交换机的端口既有铜连接器,又有 SFP 插座,但一次只能工作一个。在过去,10 Mb/s 网卡通常有双绞线、同轴细以太网连接器和D-15 AUI 作为替代品。
答案3
在这个答案中我考虑了评论中给出的更多细节:
拓扑结构:(路由器-----------交换机----------PC-----------交换机----------路由器)
两台 PC 的接口均配置在同一子网
这是错误的。
在这种错误的配置下(在 Linux 中)会发生什么?
路由表对同一子网有两个条目,每个接口和源 IP 地址各一个。例如:
# ip route show
10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.1
10.0.0.0/24 dev eth1 proto kernel scope link src 10.0.0.2
当您尝试 ping 该子网中的某个地址时,仅使用第一个接口。因此,您无法访问第二个路由器。
答案4
PC 通过广播 ARP 消息了解哪些 MAC 地址与 IP 地址相对应。目标应响应“我有 IP,我的 MAC 地址是这个”。然后,PC 将保存一个 ARP 表,其中包含映射设备响应的 IP、MAC 和接口的条目。
只要某个设备能将数据包切换到目的地,PC 就不会关心消息如何到达终点。
大多数交换机都有 MAC 地址并保存 ARP 表。它们会将 ARP 请求转发给所有连接的设备,并且还会记住响应来自何处。哑集线器通常没有记忆功能,只会不断向各个方向广播消息。