繁体   English   中英

通过Mininet网络发送“随机”流量

[英]Sending “random” traffic through Mininet network

我想使用Mininet测试数据中心路由算法。 流量需要符合某些参数:

  1. 它应该由各种大小的“文件”组成(请注意,这些文件实际上不一定是文件;只要大小是可控制的,在iperf中生成的流量就可以);
  2. 文件大小应从特定的发行版本中得出。
  3. 对于给定的文件,应随机选择发送数据的源/目标主机对。
  4. 发送文件和发送其后继文件的时间间隔应该是随机的;
  5. 如果在两台主机之间发送了一个耗时很长的巨大文件,则仍然应该可以在网络中的其他主机之间发送数据。

1-4点已得到照顾。 我已经在#5上苦苦挣扎了几天,但我无法使其正常运行。 我最初的想法是生成子进程/线程以将iperf命令发送到主机:

while count < 10:
    if (count % 2) == 0:
        host_pair = net.get("h1", "h2")
    else:
        host_pair = net.get("h3", "h4")

    p = multiprocessing.Process(target=test_custom_iperf, args=(net, host_pair, nbytes))
    p.daemon = True
    p.start()

    time.sleep(random.uniform(0, 1))

命令test_custom_iperf是在Python Mininet API的iperf版本之后建模的,以包含-n transfer size参数:

client, server = host_pair
print client, server

output( '*** Iperf: testing TCP bandwidth between',
        client, 'and', server, '\n' )

server.sendCmd( 'iperf -s' )

if not waitListening( client, server.IP(), 5001 ):
    raise Exception( 'Could not connect to iperf on port 5001' )

cliout = client.cmd( 'iperf -c ' + server.IP() + ' -n %d' % nbytes )
print cliout

server.sendInt()
servout = server.waitOutput()

debug( 'Server output: %s\n' % servout)
result = [ net._parseIperf( servout ), net._parseIperf( cliout ) ]
output( '*** Results: %s\n' % result )

使这种非阻塞非常困难。 由于某种原因,我需要能够发送server.sendInt()命令,并且为此,我需要等待客户端命令完成。

我将不胜感激,可以尝试做些什么!

我从这里得到一个提示,并使用Mininet的host.popen()模块发送数据。 希望这可以帮助其他人:

def send_one_file(file_dir, host_pair, files): 

    src, dst = host_pair  # a tuple of Mininet node objects

    # choose a random file from files
    rand_fname = random.sample(files, 1)[0]
    rand_path = os.path.join(file_dir, rand_fname)

    port = random.randint(1024, 65535)

    # Start listening at the destination host
    dst_cmd = 'nc -l %d > /home/mininet/sent/%s.out' % (port, rand_fname)
    print os.path.getsize(rand_path)
    dst.popen( dst_cmd, shell=True )

    # Send file from the source host
    src_cmd = 'nc %s %s < %s' % (dst.IP(), port, rand_path)
    src.popen( src_cmd, shell=True )

然后父函数以随机间隔调用send_one_file():

def test_netcat_subprocess_async(net, duration):

    file_dir = "/home/mininet/sf_mininet_vm/data/MVI_0406_split"
    files = os.listdir(file_dir)

    start_time = time.time()
    end_time = start_time + duration

    # Transfer for the desired duration
    while time.time() < end_time:
        # Choose a pair of hosts
        host_pair = random.sample(net.hosts, 2)

        test_send_one_file_netcat(file_dir, host_pair, files)

        interval = random.uniform(0.01, 0.1)
        print "Initialized transfer; waiting %f seconds..." % interval
        time.sleep(interval)

这可以正常工作,而不会遇到我在多处理或线程处理中遇到的任何问题(会话结束后断开网络,在不应该会话时阻塞,等等)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM