mininet / mininet

Emulator for rapid prototyping of Software Defined Networks

Home Page:https://mininet.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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?