Mininet transmission delay
p4pe opened this issue · comments
I have following topology in Mininet:
from ipmininet.iptopo import IPTopo
from ipmininet.ipnet import IPNet
from ipmininet.cli import IPCLI
from mininet.log import setLogLevel
from mininet.net import Mininet
from mininet.topo import Topo
from mininet.node import RemoteController, OVSBridge, Node
from mininet.link import TCLink
from mininet.cli import CLI
from ipmininet.router.config import RouterConfig, STATIC, StaticRoute
class MyTopology(IPTopo):
def build(self, *args, **kwargs):
router1 = self.addRouter("router1", config=RouterConfig, lo_addresses=["2002:2::f/64"])
router2 = self.addRouter("router2", config=RouterConfig, lo_addresses=["2002:3::f/64"])
talker1 = self.addHost("talker1", lo_address=["2002:1::f/64"])
router1totalker1 = self.addLink(talker1, router1, bw=100)
router1totalker1[router1].addParams(ip=("fdff:1:1:1::2/64"))
router1totalker1[talker1].addParams(ip=("fdff:1:1:1::1/64"))
bridge1 = self.addRouter("bridge1", config=RouterConfig, lo_address=["2002:3::f/64"])
router1tobridge1 = self.addLink(router1, bridge1, bw=100)
router2tobridge1 = self.addLink(router2, bridge1, bw=100)
router1tobridge1[router1].addParams(ip=("fdff:2:2:2::2/64"))
router1tobridge1[bridge1].addParams(ip=("fdff:2:2:2::1/64"))
router2tobridge1[router2].addParams(ip=("fdff:2:8:8::1/64"))
router2tobridge1[bridge1].addParams(ip=("fdff:2:8:8::2/64"))
bridge2 = self.addRouter("bridge2", config=RouterConfig, lo_address=["2002:4::f/64"])
bridge1tobridge2 = self.addLink(bridge1, bridge2, bw=100)
bridge1tobridge2[bridge1].addParams(ip=("fdff:2:3:3::1/64"))
bridge1tobridge2[bridge2].addParams(ip=("fdff:2:3:3::2/64"))
listener1 = self.addHost("listener1", lo_address=["2002:5::f/64"])
bridge2tolistener1 = self.addLink(listener1, bridge2, bw=100)
bridge2tolistener1[bridge2].addParams(ip=("fdff:1:4:4::2/64"))
bridge2tolistener1[listener1].addParams(ip=("fdff:1:4:4::1/64"))
talker2 = self.addHost("talker2", lo_address=["2002:6::f/64"])
router2totalker2 = self.addLink(talker2, router2, bw=100)
router2totalker2[router2].addParams(ip=("fdff:2:6:6::1/64"))
router2totalker2[talker2].addParams(ip=("fdff:2:6:6::2/64"))
#listener2 = self.addHost("listener2", lo_address=["2002:7::f/64"]))
#bridge2tolistener2 = self.addLink(listener2, bridge2, bw=100)
#bridge2tolistener2[bridge2].addParams(ip=("fdff:1:9:9::2/64"))
#bridge2tolistener2[listener2].addParams(ip=("fdff:1:9:9::1/64"))
super().build(*args, **kwargs)
net = IPNet(topo=MyTopology(), allocate_IPs=False) # Disable IP auto-allocation
try:
net.start()
#Static routes
net["talker1"].cmd("ip -6 route add fdff:1:4:4::/64 via fdff:1:1:1::2")
net["router1"].cmd("ip -6 route add fdff:1:4:4::/64 via fdff:2:2:2::1")
net["bridge1"].cmd("ip -6 route add fdff:1:4:4::/64 via fdff:2:3:3::2")
net["bridge2"].cmd("ip -6 route add fdff:1:4:4::/64 via fdff:1:4:4::1")
net["listener1"].cmd("ip -6 route add fdff:1:1:1::/64 via fdff:1:4:4::2")
net["bridge2"].cmd("ip -6 route add fdff:1:1:1::/64 via fdff:2:3:3::1")
net["bridge1"].cmd("ip -6 route add fdff:1:1:1::/64 via fdff:2:2:2::2")
net["router1"].cmd("ip -6 route add fdff:1:1:1::/64 via fdff:1:1:1::1")
net["talker2"].cmd("ip -6 route add fdff:1:4:4::/64 via fdff:2:6:6::1")
net["router2"].cmd("ip -6 route add fdff:1:4:4::/64 via fdff:2:8:8::2")
net["listener1"].cmd("ip -6 route add fdff:2:6:6::/64 via fdff:1:4:4::2")
net["bridge2"].cmd("ip -6 route add fdff:2:6:6::/64 via fdff:2:3:3::1")
net["bridge1"].cmd("ip -6 route add fdff:2:6:6::/64 via fdff:2:8:8::1")
net["router2"].cmd("ip -6 route add fdff:2:6:6::/64 via fdff:2:6:6::2")
#Run commands on routers
net["router1"].cmd("sysctl -w net.ipv6.conf.all.forwarding=1")
net["router1"].cmd("sysctl -w net.ipv6.conf.default.forwarding=1")
net["bridge1"].cmd("sysctl -w net.ipv6.conf.all.forwarding=1")
net["bridge1"].cmd("sysctl -w net.ipv6.conf.default.forwarding=1")
net["bridge2"].cmd("sysctl -w net.ipv6.conf.all.forwarding=1")
net["bridge2"].cmd("sysctl -w net.ipv6.conf.default.forwarding=1")
net["router1"].cmd('python3 /home/tsn/tsn/srv6-mininet-extensions/configure_iptables.py')
net["router2"].cmd('python3 /home/tsn/tsn/srv6-mininet-extensions/configure_iptables.py')
net["bridge1"].cmd('python3 /home/tsn/tsn/srv6-mininet-extensions/configure_iptables.py')
net["bridge2"].cmd('python3 /home/tsn/tsn/srv6-mininet-extensions/configure_iptables.py')
IPCLI(net)
finally:
net.stop()
The Mininet is running on a VM in VirtualBox with 8GB RAM and 6 vCPUs
I need to measure the transmission time from talker1 to talker2. In order to do this I send ping packets of 1408 bytes size:
ping -c 10 -s 1400 listener1
In order to capture the traffic, I use tcpdump on the egress interface of talker1 and on the ingress interface of listener1, and I subtract the two timestamps.
tcpdump -i h1-eth0 --time-stamp-precision=micro -ttt -w egress.pcap
Based on the parameters (packet size = 1408, bandwidth = 100Mbit etc.), every hop must take approximately 112.64 microseconds and the total transmission delay should be 112.64 x 3 = 337,92 microseconds.
The times that I took from the captured traffic are on average 60 microseconds.
How can it be such a big difference? What am I missing?