Отправка "случайного" трафика через сеть Mininet



Я хочу протестировать алгоритм маршрутизации центра обработки данных с помощью 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 моделируется по версии API Python Mininet 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: %sn' % servout)
result = [ net._parseIperf( servout ), net._parseIperf( cliout ) ]
output( '*** Results: %sn' % result )


Сделать это неблокирующим было чрезвычайно трудно. Мне нужно по какой-то причине отправить команду server.sendInt(), и для этого мне нужно дождаться завершения команды клиента.



Я был бы признателен за любой совет о том, что я могу попробовать сделать, чтобы это сработало!
625   1  

1 ответ:

Я взял подсказку из здесь и использовал хост Мининета.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)

Это работает без каких-либо проблем, которые я испытывал с многопроцессорной обработкой или потоковой обработкой (разрыв сети после завершения сеанса, блокировка, когда она не должна, и т. д.).

Comments

    Ничего не найдено.