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地址自学习构建转发表,流量绕行的具体逻辑如下:
- 拓扑启动完成后,交换机初始转发表为空,当h1首次向h3发送ICMP请求时,s1收到报文后查不到h3的MAC地址对应端口,会执行未知单播泛洪:把报文同时从直连h3的端口、直连s2的端口发出去。
- 你在代码中先添加了h3到s2的链路、后添加h3到s1的链路,h3连s2的网卡是系统识别的主网卡,路由优先级更高。h3收到两份相同的ICMP请求(一份从s1网卡传入、一份从s2网卡传入)时,响应报文会优先从连接s2的网卡发出。
- s2收到h3返回的ICMP响应后,会把h3的MAC地址关联到直连h3的端口,再把报文转发给s1;s1收到这个从s2方向传来的响应报文后,会把h3的MAC地址关联到直连s2的端口。
- 后续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
相关产品推荐
相关产品推荐

