You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mininet主机能否连接双交换机?ping延迟异常问题咨询

Mininet多网卡主机拓扑绕行问题解答

基础结论

  • Mininet原生支持单台主机同时连接多台交换机,你给出的拓扑定义代码不存在语法层面的错误,拓扑可正常启动运行。
  • 你观测到的h1 ping h3往返延迟约60ms、流量绕行s2的现象,是默认交换机MAC学习机制+主机多网卡路由规则共同导致的,不是拓扑配置的语法错误。

自定义拓扑代码

from mininet.topo import Topo

class internTopo(Topo):
    def build(self):
    
        h1 = self.addHost('h1')
        h2 = self.addHost('h2')
        h3 = self.addHost('h3')
        s1 = self.addSwitch('s1')
        s2 = self.addSwitch('s2')
        
        self.addLink(h1, s1)
        self.addLink(h2, s2)
        self.addLink(h3, s2)
        self.addLink(s1, s2)
        self.addLink(h3, s1)
        
topos = {'tp': (lambda: internTopo())}

拓扑结构

h1         h2
.          .
.          .
s1 ------- s2
.          .
.  ------- . ---- h3

所有链路统一配置10ms传输延迟时:

  • 执行h2 ping h3往返延迟约40.5ms,符合预期:往返路径为h2-s2-h3-s2-h2,共经过4段10ms链路。
  • 执行h1 ping h3往返延迟约60.4ms,实际路径为h1-s1-s2-h3-s2-s1-h1,单趟经过3段10ms链路,往返总延迟约60ms,和观测值匹配。

现象产生原因

Mininet默认使用Open vSwitch作为交换机,工作在二层透明转发模式,基于MAC地址自学习构建转发表,流量绕行的具体逻辑如下:

  1. 拓扑启动完成后,交换机初始转发表为空,当h1首次向h3发送ICMP请求时,s1收到报文后查不到h3的MAC地址对应端口,会执行未知单播泛洪:把报文同时从直连h3的端口、直连s2的端口发出去。
  2. 你在代码中先添加了h3到s2的链路、后添加h3到s1的链路,h3连s2的网卡是系统识别的主网卡,路由优先级更高。h3收到两份相同的ICMP请求(一份从s1网卡传入、一份从s2网卡传入)时,响应报文会优先从连接s2的网卡发出。
  3. s2收到h3返回的ICMP响应后,会把h3的MAC地址关联到直连h3的端口,再把报文转发给s1;s1收到这个从s2方向传来的响应报文后,会把h3的MAC地址关联到直连s2的端口。
  4. 后续s1收到所有发往h3的报文,都会直接转发给s2,不再向直连h3的端口发送,路径就固定为绕行s2的3跳路径。

你可以在拓扑运行时执行ovs-appctl fdb/show s1查看s1的MAC转发表,会看到h3的MAC对应的端口是连接s2的端口,即可验证上述路径判断。如果需要让流量走h3和s1的直连链路,可以通过手动配置OVS静态MAC表项、调整h3的反向路由校验规则、给h3的两个网卡分别配置不同网段IP的方式实现。


内容的提问来源于stack exchange,提问作者Ziad Ismaili Alaoui

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 19:57:14