Я пытаюсь идентифицировать все порты, связанные с 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
, это влияет только на потоки данных и не затрагивая контрольное соединение это третий порт, который вы определяете как неопределенный порт.