Portas iperf3 indefinidas?

Portas iperf3 indefinidas?

Estou tentando identificar todas as portas afiliadas a uma sessão UDP iperf3 e percebo que o handshake TCP usa uma porta indefinida (?) No servidor iperf3.

Existe uma maneira de especificar todas as portas usadas para um teste iperf3?

Exemplo ilustrativo:

Neste exemplo, estou observando os seguintes endereços IP e portas usadas:

  • [cliente] 10.0.1.20, porta 5222
  • [servidor] 10.0.1.89, porta 5205
  • [cliente] 10.0.1.20,porta 56039 ????

Cliente:

// 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

Servidor:

// 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
...

Isso também é confirmado por uma captura wireshark em execução no cliente.

Responder1

Não, não é possível definir esta porta do cliente através de um argumento de linha de comando, nem usando a API iperf.

Isso se aplica pelo menos à versão 3.1 iperf atual. Olhando para oCódigo fonte, é possível encontrar a função responsável por estabelecer a conexão TCP inicial:

/* 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;
    }
[...]

Observando a netdial()assinatura da função, responsável por criar a conexão com um servidor:

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

Mais especificamente, podemos ver que ele define onetdial()parâmetro local_port como 0. Isto deve estabelecer uma porta aleatória para o lado do cliente ao criar o canal de controle TCP.

Como Thomas mencionou, a --cportopção controlará apenas ofluxos de dadosporta e também podemos verificar isso olhando para oCódigo fontepara a função responsável por estabelecer o fluxo de dados UDP:

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

Esta função usa a test->bind_portopção como local_portparâmetro, que é recuperado da --cportopção.

Responder2

Nosite iperf3há uma descrição sobre esse comportamento.

...A conexão TCP inicial é usada para trocar parâmetros de teste, controlar o início e o fim do teste e para trocar resultados de teste. Isso às vezes é chamado de "conexão de controle". Os dados de teste reais são enviados através de uma conexão TCP separada, como um fluxo separado de pacotes UDP ou como uma conexão SCTP independente, dependendo de qual protocolo foi especificado pelo cliente...

Olhando para o man iperf3e a opção --cport, isso parece afetar apenas ofluxos de dadose não afetando oconexão de controlequal é a terceira porta que você está identificando como porta indefinida.

informação relacionada