计算机如何知道将数据包发送到哪个交换机?

Tru*_*uth 7 networking switch ping

到目前为止,我已经注意到,局域网中经常有一个交换机,这些交换机根据 MA​​C 地址路由数据包,现在如果有两个交换机连接到局域网中的一台电脑,因为我没有看到 MAC到目前为止为交换机设置的地址,PC如何知道将数据包发送到哪个交换机?

Mok*_*bai 27

它根本不会将其发送到交换机。它从具有正确 IP 地址和子网的任何接口发送它,或者,如果两者都有效,则发送它认为更快或到主机的跳数最少的接口。

如果网络接口具有不同的 IP 地址并且被子网隔离,那么这将有效地选择发送数据包的接口。

还可以为每个接口分配一个“指标”,它基本上说明“这个接口应该更快”,并且对于更快的接口将是一个较低的数字。您可以让操作系统建立指标,从而建立首选接口,也可以在网络接口属性中自行设置。

您操作系统中的网络系统也可能使用 TCP/IP 数据包中的 TTL(生存时间)信息来确定哪个链接更短,但这并不是速度的可靠指示。

更智能的系统可以使用负载平衡和链路上最近延迟的知识来动态调整或覆盖接口度量。

  • @Truth 您应该考虑_网络接口_,而不是网卡。两个 eth 端口是两个网络接口。它们是在一个还是两个 PCB 上都没有关系。 (15认同)

ilk*_*chu 11

这取决于你有什么样的设置。

您可以在计算机上有两个网络接口,连接到两个完全不同的网络。在这种情况下,数据包将离开由 IP 路由决定的接口,系统可能会也可能不会在两个网络之间路由流量。

例如,在这里,任何东西都会192.168.0.x出入eth0并通过交换机#1。如果你也有一个默认路由通过例如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  |---- ...
+----------+                   +------------+
Run Code Online (Sandbox Code Playgroud)

上面的拓扑与您在评论中的拓扑相同。由于两个交换机之间没有连接,如果系统充当两个网络之间的桥梁,允许一侧的所有主机到达另一侧,那么在两个接口中具有相同的IP 子网几乎才有意义。找到单个主机的方式与交换机查找它们的方式相同:通过跟踪看到 MAC 地址的位置,如果目标 MAC 的位置未知,则将流量泛洪到所有端口。

如果没有桥接,如果应用程序想要连接到两个地方都存在的地址,就没有直接的方法来知道要使用哪个网络。这不仅仅是找到具有该地址的主机所在的位置,而是可能有两个。


另一方面,如果两台交换机在外部连接(与上面不同),则可以将两个网络接口连接到两台交换机,它们都在相同的第 2 层网络和 IP 子网上,无需桥接。这将用于冗余/容错或增加带宽。

如果操作系统处理接口之间的故障转移,则可以使用一个 IP 地址来完成。例如,如果一个接口出现故障,Linux 绑定驱动程序可以在两个接口之间透明地进行故障转移。然后将沿着当前活动的链接发送流量。

如果两个交换机是独立的,负载均衡通常是不可能的。但是,如果它们是支持它的单个逻辑平台的一部分,您可以在两条链路上运行LACP,透明地平衡两条链路上的流量。使用 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  |--------+
+----------+                   +------------+
Run Code Online (Sandbox Code Playgroud)

也可以使用两个 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  |--------+
+----------+                   +------------+
Run Code Online (Sandbox Code Playgroud)

请注意,虽然交换机具有 MAC 地址,但它们仅用于控制功能,与数据流量无关。交换机确实保留了他们在每个端口中看到的主机 MAC 地址的表,并使用它来将数据帧转发到正确的位置。并且主机只有路由条目说“到网络 N 的流量离开接口 I”,或“到网络 M 的流量通过接口 J 发送到路由器 R”,或者路由条目也考虑了源地址。主机必须使用 ARP 或类似方法来计算目标 MAC 地址,但这是目标主机的 MAC 地址,而不是交换机。

此外,“路由”是网络/IP/第 3 层功能,而不是交换机的功能。切换“转发”帧,或者只是“切换”它们。(我很乐意使用后者,尽管也许有些人可能不同意。)

这两个网络接口是在单个(PCI / PCIe)卡上,在两个卡上,集成在主板上,还是通过 USB 或其他方式连接都无关紧要。只是它们是完整的独立接口,而不仅仅是同一实际接口的备用物理连接器。例如,许多交换机的端口同时具有铜质连接器和 SFP 插座,但一次只能使用一个。在过去,10 Mb/s 网卡通常具有用于双绞线、同轴细以太网D-15 AUI 的连接器作为替代。

  • +1 用于 ASCII 图 (2认同)