Назад | Перейти на главную страницу

Неопределенные порты iperf3?

Я пытаюсь идентифицировать все порты, связанные с UDP-сеансом iperf3, и замечаю, что для установления связи TCP используется неопределенный (?) Порт на сервере iperf3.

Есть ли способ указать все порты, используемые для теста iperf3?

Иллюстрирующий пример:

В этом примере я наблюдаю следующие используемые IP-адреса и порты:

Клиент:

// iperf3 (v3.1.3) Client running on Ubuntu 16.04 IP address: 10.0.1.20, port 5222
$ iperf3 -c 10.0.1.89 -u -p 5205 --cport 5222 -B 10.0.1.20

Сервер:

// iperf3 (v3.1.3) Server running on Ubuntu 16.04 IP address: 10.0.1.89, port 5205
$ iperf3 -s -p 5205
-----------------------------------------------------------
Server listening on 5205
-----------------------------------------------------------
Accepted connection from 10.0.1.20, port 56039
[  5] local 10.0.1.89 port 5205 connected to 10.0.1.20 port 5222
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
...

Это также подтверждается захватом wirehark, запущенным на клиенте.

Нет, этот порт клиента нельзя установить ни с помощью аргумента командной строки, ни с помощью API iperf.

По крайней мере, это относится к текущей версии 3.1 iperf. Глядя на исходный код, можно найти функцию, отвечающую за установление начального TCP-соединения:

/* iperf_connect -- client to server connection function */
int
iperf_connect(struct iperf_test *test)
{
[...]
    /* Create and connect the control channel */
    if (test->ctrl_sck < 0)
        // Create the control channel using an ephemeral port
        test->ctrl_sck = netdial(test->settings->domain, Ptcp, test->bind_address, 0, test->server_hostname, test->server_port, test->settings->connect_timeout);

    if (test->ctrl_sck < 0) {
        i_errno = IECONNECT;
        return -1;
    }
[...]

Глядя на netdial() подпись функции, которая отвечает за создание подключения к серверу:

netdial(int domain, int proto, char *local, int local_port, char *server, int port, int timeout)

В частности, мы видим, что он устанавливает netdial () параметр local_port как 0. Это должно установить случайный порт на стороне клиента при создании канала управления TCP.

Как сказал Томас, --cport опция будет контролировать только потоки данных порт, и мы также можем проверить это, посмотрев на исходный код для функции, отвечающей за создание потока данных UDP:

 if ((s = netdial(test->settings->domain, Pudp, test->bind_address, test->bind_port, test->server_hostname, test->server_port, -1)) < 0) 

Эта функция использует test->bind_port вариант в качестве local_port параметр, который извлекается из --cport вариант.

На сайт iperf3 есть описание этого поведения.

... Первоначальное TCP-соединение используется для обмена параметрами тестирования, управления началом и окончанием теста, а также для обмена результатами тестирования. Иногда это называют «контрольным соединением». Фактические тестовые данные отправляются через отдельное TCP-соединение, как отдельный поток UDP-пакетов или как независимое SCTP-соединение, в зависимости от того, какой протокол был указан клиентом ...

Глядя на man iperf3 и вариант --cport, это влияет только на потоки данных и не затрагивая контрольное соединение это третий порт, который вы определяете как неопределенный порт.