Estoy tratando de identificar todos los puertos afiliados a una sesión UDP de iperf3 y noto que el protocolo de enlace TCP utiliza un puerto indefinido (?) en el servidor iperf3.
¿Existe alguna forma de especificar todos los puertos utilizados para una prueba de iperf3?
Ejemplo ilustrativo:
En este ejemplo, observo las siguientes direcciones IP y puertos utilizados:
- [cliente] 10.0.1.20, puerto 5222
- [servidor] 10.0.1.89, puerto 5205
- [cliente] 10.0.1.20,puerto 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
...
Esto también se confirma mediante una captura de Wirehark que se ejecuta en el cliente.
Respuesta1
No, no es posible configurar este puerto de cliente a través de un argumento de línea de comando, ni tampoco usando la API iperf.
Esto se aplica al menos a la versión actual 3.1 de iperf. Mirando a lacódigo fuente, es posible encontrar la función responsable de establecer la conexión 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;
}
[...]
Mirando la netdial()
firma de la función, que se encarga de crear la conexión a un servidor:
netdial(int domain, int proto, char *local, int local_port, char *server, int port, int timeout)
Más específicamente, podemos ver que establece elmarcación neta()parámetro local_port como 0
. Esto debería establecer un puerto aleatorio para el lado del cliente al crear el canal de control TCP.
Como mencionó Thomas, la --cport
opción solo controlará elflujos de datospuerto y también podemos comprobar que mirando elcódigo fuentepara la función responsable de establecer el flujo de datos UDP:
if ((s = netdial(test->settings->domain, Pudp, test->bind_address, test->bind_port, test->server_hostname, test->server_port, -1)) < 0)
Esta función utiliza la test->bind_port
opción como local_port
parámetro, que se recupera de la --cport
opción.
Respuesta2
Sobre elsitio web iperf3Hay una descripción de este comportamiento.
...La conexión TCP inicial se utiliza para intercambiar parámetros de prueba, controlar el inicio y el final de la prueba e intercambiar resultados de prueba. A esto a veces se le llama "conexión de control". Los datos de prueba reales se envían a través de una conexión TCP separada, como un flujo separado de paquetes UDP o como una conexión SCTP independiente, dependiendo del protocolo especificado por el cliente...
Mirando la man iperf3
opción y --cport
, esto parece afectar solo a laflujos de datosy no afectar laconexión de controlque es el tercer puerto que estás identificando como puerto indefinido.