Advertisement
Guest User

AiO

a guest
Nov 21st, 2019
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.21 KB | None | 0 0
  1. from __future__ import print_function
  2. from mininet.log import setLogLevel
  3. from mininet.topo import Topo
  4. from mininet.net import Mininet
  5. from mininet.link import TCLink
  6. from mininet.node import CPULimitedHost
  7. from mininet.util import pmonitor
  8. import os
  9. from time import time
  10. from signal import SIGINT
  11.  
  12.  
  13. def createTopo(queue=100):
  14. print("*** Create Topology")
  15. net = Mininet(link=TCLink, host=CPULimitedHost)
  16.  
  17. # Add Host
  18. net.addHost('server', ip='192.168.1.2/24',
  19. defaultRoute='via 192.168.1.1')
  20. net.addHost('client', ip='192.168.2.2/24',
  21. defaultRoute='via 192.168.2.1')
  22. net.addHost('router')
  23.  
  24. # Add Link
  25. net.addLink(net['router'], net['server'], bw=2, max_queue_size=queue)
  26. net.addLink(net['router'], net['client'], bw=1000, max_queue_size=queue)
  27. print()
  28. print("||||||||||||||||||||Finish Config|||||||||||||||||||||")
  29. print()
  30. print()
  31.  
  32. return net
  33.  
  34. def configRouter(net):
  35. print("*** Router Configuration")
  36. print("Add IP Address:")
  37. print(" router-eth0 192.168.1.1/24")
  38. net['router'].cmd('ip addr add 192.168.1.1/24 brd + dev router-eth0')
  39. print(" router-eth1 192.168.2.1/24")
  40. net['router'].cmd('ip addr add 192.168.2.1/24 brd + dev router-eth1')
  41. print("Add IP Forwarding")
  42. net['router'].cmd("echo 1 > /proc/sys/net/ipv4/ip_forward")
  43. print()
  44. print("||||||||||||||||||||Finish Config ROUTER|||||||||||||||||||||")
  45. print()
  46. print()
  47. return net
  48.  
  49. def controlReno(net):
  50. print("*** TCP Congestion Control: RENO")
  51. print("Set congestion control")
  52. net['server'].cmd("sysctl -w net.ipv4.tcp_congestion_control=reno")
  53. net['client'].cmd("sysctl -w net.ipv4.tcp_congestion_control=reno")
  54. print(" server: congestion control=%s" %net['server'].cmd("cat /proc/sys/net/ipv4/tcp_congestion_control"), end="")
  55. print(" client: congestion control=%s" %net['client'].cmd("cat /proc/sys/net/ipv4/tcp_congestion_control"))
  56. return net
  57.  
  58. def controlCubic(net):
  59. print("*** TCP Congestion Control: CUBIC")
  60. print("Set congestion control")
  61. net['server'].cmd("sysctl -w net.ipv4.tcp_congestion_control=cubic")
  62. net['client'].cmd("sysctl -w net.ipv4.tcp_congestion_control=cubic")
  63. print(" server: congestion control=%s" %net['server'].cmd("cat /proc/sys/net/ipv4/tcp_congestion_control"), end="")
  64. print(" client: congestion control=%s" %net['client'].cmd("cat /proc/sys/net/ipv4/tcp_congestion_control"))
  65. return net
  66.  
  67. def roundTripTime(net, ping=2, trip=2):
  68. print("*** Roundtrip Ping Client to Server")
  69. rtt = []
  70. for i in range(trip):
  71. start = time()
  72. net['client'].cmd("ping "+net['server'].IP()+" -c "+str(ping))
  73. end = time()
  74. print(" ", (i+1), "- RTT: %.5f" %(end-start))
  75. rtt.append((end-start))
  76. print("Avg round trip time: %.5f" %(sum(rtt)/len(rtt)))
  77. print()
  78.  
  79. return net
  80.  
  81. def webServer(net):
  82. print("*** Web Server Testing")
  83. print("Web server configuration:")
  84. print(" Run simple HTTP server %s:80"%(net['server'].IP()))
  85. net['server'].popen('python -m SimpleHTTPServer 80')
  86.  
  87. print("Testing Web Server: ")
  88. net['client'].cmd('sleep 1')
  89. print(" ", net['client'].cmd('wget --report-speed=bits http://'+net['server'].IP()+':80') )
  90.  
  91. net['server'].cmd('kill python')
  92. # print(net['client'].cmd('cat index.html'))
  93. net['client'].cmd('rm index.html*')
  94.  
  95. return net
  96.  
  97. def runTCPProbe(net, port=5001, file='probe.txt'):
  98. print("*** Run TCP Probe")
  99. print(net['server'].cmd('sysctl -w net.ipv4.tcp_no_metrics_save=1'), end="")
  100. print(net['server'].cmd('modprobe tcp_probe port='+str(port)+' full=1'), end="")
  101. print(net['server'].cmd('chmod 444 /proc/net/tcpprobe'), end="")
  102. print(net['server'].cmd('cat /proc/net/tcpprobe > '+file+' &TCPCAP=$!'))
  103.  
  104. return net
  105.  
  106. def killTCPProbe(net):
  107. print("*** Kill TCP Probe")
  108. print(net['server'].cmd('kill $TCPCAP'))
  109. return net
  110.  
  111. def generateTraffic(net):
  112. print("*** Generate traffic using iperf")
  113. popens = {}
  114. tperf = 4
  115. tout = 5
  116. popens[net['server']] = net['server'].popen('iperf -s'+str(tperf+tout))
  117. popens[net['client']] = net['client'].popen('iperf -i 1 -t '+str(tperf)+' -c '+net['server'].IP())
  118.  
  119. stopPerf = time() + tperf
  120. logserver = ""
  121. logclient = ""
  122. for host, line in pmonitor(popens, timeoutms=tperf+tout):
  123. if host:
  124. if host.name == "server": logserver += (host.name +": "+line)
  125. elif host.name == "client": logclient += (host.name +": "+line)
  126. # print('%s: %s' % (host.name, line), end="")
  127. if time() >= stopPerf:
  128. for p in popens.values():
  129. p.send_signal(SIGINT)
  130. print(logserver)
  131. print(logclient)
  132.  
  133. return net
  134.  
  135. def rttScenario():
  136. # Clean Mininet
  137. os.system('mn -c')
  138.  
  139. # Create Topology
  140. net = createTopo()
  141.  
  142. # Run Mininet
  143. net.start()
  144.  
  145. # Configure Router
  146. net = configRouter(net)
  147.  
  148. # Testing Ping Reachability
  149. net.ping()
  150. print()
  151.  
  152. # TCP Congestion Control: RENO
  153. net = controlReno(net)
  154.  
  155. # Roundtrip ping client to server
  156. net = roundTripTime(net, ping=2, trip=2)
  157.  
  158. # TCP Congestion Control: CUBIC
  159. net = controlCubic(net)
  160.  
  161. # Roundtrip ping client to server
  162. net = roundTripTime(net, 4, 2)
  163.  
  164. # Stop Mininet
  165. net.stop()
  166.  
  167. def webScenario():
  168. # Clean Mininet
  169. os.system('mn -c')
  170.  
  171. # Create Topology
  172. net = createTopo()
  173.  
  174. # Run Mininet
  175. net.start()
  176.  
  177. # Configure Router
  178. net = configRouter(net)
  179.  
  180. # Testing Ping Reachability
  181. net.ping()
  182. print()
  183.  
  184. # TCP Congestion Control: RENO
  185. net = controlReno(net)
  186.  
  187. # Run TCP Probe
  188. net = runTCPProbe(net, 80, 'probe-web-reno.txt')
  189.  
  190. # Web Server
  191. net = webServer(net)
  192.  
  193. # kill TCP Probe
  194. net = killTCPProbe(net)
  195.  
  196. # TCP Congestion Control: CUBIC
  197. net = controlCubic(net)
  198.  
  199. # Run TCP Probe
  200. net = runTCPProbe(net, 80, 'probe-web-cubic.txt')
  201.  
  202. # Web Server
  203. net = webServer(net)
  204.  
  205. # kill TCP Probe
  206. net = killTCPProbe(net)
  207.  
  208. # Stop Mininet
  209. net.stop()
  210.  
  211. def liveScenario():
  212.  
  213. # Clean Mininet
  214. os.system('mn -c')
  215.  
  216. # Create Topology
  217. net = createTopo()
  218.  
  219. # Run Mininet
  220. net.start()
  221.  
  222. # Configure Router
  223. net = configRouter(net)
  224.  
  225. # Testing Ping Reachability
  226. net.ping()
  227. print()
  228.  
  229. # TCP Congestion Control: RENO
  230. net = controlReno(net)
  231.  
  232. # Run TCP Probe
  233. net = runTCPProbe(net, file='probe-iperf-reno.txt')
  234.  
  235. # Run Iperf
  236. net = generateTraffic(net)
  237.  
  238. # kill TCP Probe
  239. net = killTCPProbe(net)
  240.  
  241. # TCP Congestion Control: CUBIC
  242. net = controlCubic(net)
  243.  
  244. # Run TCP Probe
  245. net = runTCPProbe(net, file='probe-iperf-cubic.txt')
  246.  
  247. # Run Iperf
  248. net = generateTraffic(net)
  249.  
  250. # kill TCP Probe
  251. net = killTCPProbe(net)
  252.  
  253. # Stop Mininet
  254. net.stop()
  255.  
  256. if __name__ == '__main__':
  257. setLogLevel( 'info' )
  258. # Scenario-1: Roundtrip Time Analysis
  259. print("\n\n--------------------------------------------------------------------")
  260. print("*** Scenario-1: Roundtrip Time Analysis ***\n")
  261. rttScenario()
  262.  
  263. # Scenario-2: Web Analysis
  264. print("\n\n--------------------------------------------------------------------")
  265. print("*** Scenario-2: Web Analysis ***\n")
  266. webScenario()
  267.  
  268. # Scenario-3: Long-lived vs Short-lived TCP
  269. print("\n\n--------------------------------------------------------------------")
  270. print("*** Scenario-3: Long-lived vs Short-lived TCP ***\n")
  271. liveScenario()
  272.  
  273. # Scenario-4: Small Buffer
  274. print("\n\n--------------------------------------------------------------------")
  275. print("*** Scenario-4: Small Buffer ***\n")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement