1. 程式人生 > >[環境搭建]mininet中實現隨機流量模型,20180130

[環境搭建]mininet中實現隨機流量模型,20180130

png 自動保存 don 一次 gin tput 9.png run sting

[環境搭建]mininet中實現隨機流量模型

本文記錄了如何實現“mininet拓撲中任意一臺主機以等概率隨機向另外一臺主機發送一條UDP數據流,並將iperf測試結果自動保存到文件”的方法,概括來說則是“為mininet設置一條可實現上述功能的自定義命令‘iperfmulti’”。

  • 1.添加自定義函數及自定義命令

  • 使用nano編輯器打開並編輯“***/mininet/net.py”文件,輸入命令:

nano ***/mininet/net.py

    • 註:由於個人的mininet文件夾所在目錄不同,故後文都用“***”表示該部分路徑。

  • 在“Mininet”類的類體中添加自定義函數“iperf_single”:

def iperf_single( self,hosts=None, udpBw=‘10M‘, period=60, port=5001):

"""Run iperf between two hosts using UDP.

hosts: list of hosts; if None, uses opposite hosts

returns: results two-element array of server and client speeds"""

if not hosts:

return

else:

assert len( hosts ) == 2

client, server = hosts

filename = client.name[1:] + ‘.out‘

output( ‘*** Iperf: testing bandwidth between ‘ )

output( "%s and %s\n" % ( client.name, server.name ) )

iperfArgs = ‘iperf -u ‘

bwArgs = ‘-b ‘ + udpBw + ‘ ‘ """ 設置UDP模式發送的帶寬大小 """

print "***start server***"

server.cmd( iperfArgs + ‘-s -i 1‘ + ‘ > /home/zg/log/‘ + filename + ‘&‘) """ 1.在此編輯服務器端的iperf命令,添加需要的參數;2.設置iperf命令的輸出結果被保存到的路徑 """

print "***start client***"

client.cmd(

iperfArgs + ‘-t ‘+ str(period) + ‘ -c ‘ + server.IP() + ‘ ‘ + bwArgs

+‘ > /home/zg/log/‘ + ‘client‘ + filename +‘&‘) """ 1.在此編輯客戶端的iperf命令,添加需要的參數;2.設置iperf命令的輸出結果被保存到的路徑 """

  • 下圖是“***/mininet/net.py”文件中“Mininet”類部分代碼的截圖:

  • 技術分享圖片

  • 將自定義函數“iperf_single”的代碼添加到“Mininet”類的類代碼中:

  • 技術分享圖片

需要註意的一點是Python語句的縮進,如 技術分享圖片

“def”前應有4個空格,同時,“def”下面的語句也應保持正確的縮進。

  • 在“Mininet”類的類體中添加自定義命令代碼“iperfmulti”:

def iperfMulti(self, bw, period=60):

base_port = 5001

server_list = []

client_list = [h for h in self.hosts]

host_list = []

host_list = [h for h in self.hosts]

cli_outs = []

ser_outs = []

_len = len(host_list)

for i in xrange(0, _len):

client = host_list[i]

server = client

while( server == client ):

server = random.choice(host_list)

server_list.append(server)

self.iperf_single(hosts = [client, server], udpBw=bw, period= period, port=base_port)

sleep(.05)

base_port += 1

sleep(period)

print "test has done"

  • 仍需註意的是Python語句的縮進。

  • 添加代碼後如圖所示:

  • 技術分享圖片

  • 保存“***/mininet/net.py”文件,退出nano編輯器

在鍵盤上按“CTRL+X”,編輯器下方顯示出“是否需要保存”的提示信息,如圖:

  • 技術分享圖片

  • 按一次“Y”鍵,再按一次“ENTER”鍵,即可保存“***/mininet/net.py”文件同時退出nano編輯器。

  • 2.在CLI類中令註冊自定義命

    • 修改“***/mininet/mininet/cli.py”文件

      • 使用nano編輯器打開並編輯“***/mininet/mininet/cli.py”文件,輸入命令:

nano ***/mininet/mininet/cli.py

  • 在nano編輯器中添加代碼:

def do_iperfmulti( self, line ):

"""Multi iperf UDP test between nodes"""

args = line.split()

if len(args) == 1:

udpBw = args[ 0 ]

self.mn.iperfMulti(udpBw)

elif len(args) == 2:

udpBw = args[ 0 ]

period = args[ 1 ]

err = False

self.mn.iperfMulti(udpBw, float(period))

else:

error(‘invalid number of args: iperfmulti udpBw period\n‘ +

‘udpBw examples: 1M 120\n‘)

  • 註:代碼需要添加在“CLI”類的類體中。

  • 技術分享圖片

  • 在鍵盤上依次按下“CTRL+X”、“Y”鍵、“ENTER”鍵,即可保存“***/mininet/mininet/cli.py”文件同時退出nano編輯器。

  • 3.在mininet執行解釋器中註冊自定義命令與對應執行函數的映射關系

    • 修改“***/mininet/bin/mn”文件

      • 使用nano編輯器打開並編輯“***/mininet/bin/mn”文件,輸入命令:

nano ***/mininet/bin/mn

  • 找到“ALTSPELLING”,添加“iperfmulti”及“iperfMulti”如圖紅框部分:

  • 技術分享圖片

  • 4.重新編譯mininet

    • 輸入命令:

/***/mininet/util/install.sh -n

  • 5.如何使用自定義命令“iperfmulti”

    • 命令格式: iperfmulti <帶寬>

      • 例如:

iperfmulti 150M

  • 技術分享圖片

  • 輸入命令並觀察到終端輸出“test has done”後(如上圖),可查看測試結果,由前文自定義函數“iperf_single”的代碼可知,測試結果保存在目錄"/home/zg/log"下。

  • 觀察"/home/zg/log"目錄下有什麽文件,使用以下2條命令:

cd /home/zg/log

ls

  • 技術分享圖片

  • 由上圖知,輸出了4個文件,分別對應server1,server2,client1,client2的帶寬測試輸出文件。輸出4個文件是由於作者使用了mininet默認的網絡拓撲做實驗,網絡中只有兩臺主機,這兩臺主機分別各當了一次server、client,因此共有兩組輸出文件。

  • 查看iperf測試結果,使用命令“cat <文件名>”,例如:

cat 1.out

觀察到輸出結果:

  • 技術分享圖片

[環境搭建]mininet中實現隨機流量模型,20180130