Realice el descubrimiento de MTU de ruta sin depender de errores ICMP, que a menudo no se entregan.
Este programa realiza el descubrimiento de MTU de ruta de capa de paquetización como se describe en RFC 4821, que es una forma más confiable de detectar el tamaño de MTU en presencia de agujeros negros ICMP.
Si bien las conexiones TCP ajustan automáticamente el tamaño de MTU con el tiempo dependiendo de varios indicadores (rendimiento de la red, pérdida de paquetes, mensajes de error ICMP,...), este no es el caso de los protocolos sin conexión.
Cuando el rendimiento es esencial, el rendimiento , la fragmentación de paquetes y la confiabilidad de la ruta son tres indicadores clave a analizar para optimizar el rendimiento del flujo. Dado que la confiabilidad de la ruta no siempre depende de nosotros, debemos esforzarnos por maximizar el rendimiento sin realizar fragmentación de paquetes , lo que puede degradar gravemente el rendimiento [1] .
La propuesta original para Path MTU Discovery se basaba en la entrega de paquetes ICMP Fragmentation Needed
cuando un paquete IPv4 con el campo Don't Fragment establecido era demasiado grande para propagarse. Desafortunadamente, algunos enrutadores no generan este tipo de errores, sino que optan por ignorar silenciosamente los paquetes grandes. Un cliente no tiene forma de determinar la causa de la pérdida del paquete.
Dado que todos los hosts tienen la obligación de admitir consultas ICMP_ECHO, podemos aprovechar el hecho de que los mensajes ICMP aceptan una cantidad arbitraria de datos y envían paquetes de diferentes tamaños a nuestro servidor. Si activamos el campo No fragmentar en el paquete IPv4 y escuchamos una respuesta, de facto estamos esperando un ACK (en forma de paquete ICMP_ECHOREPLY) que confirme que este tamaño de MTU es válido.
Ahora solo nos queda realizar una búsqueda binaria respecto al tamaño de los paquetes para encontrar el tamaño máximo de MTU soportado por esta ruta.
Cuando está en modo ICMP, se generan algunas solicitudes ICMP_ECHO de diferentes tamaños.
ICMP Fragmentation Needed
), el tamaño de MTU se declara no válido y se reduce el umbral.El único requisito del modo ICMP es que el host debe poder responder a mensajes de ping.
El mismo algoritmo se aplica a los paquetes UDP, pero necesita ejecutar un servidor ( udp_server.py ) en su host receptor para poder enviar mensajes de confirmación.
Este programa debería funcionar bien en la mayoría de las distribuciones de Linux y OSX.
gcc -Wall -Wextra mtu_discovery.c mtu.c -o plpmtu
No debería informar advertencias/errores. Si es así, abra un problema.
Si desea ejecutar en modo ICMP , escriba:
sudo ./plpmtu -p icmp -s <server-ipaddr>
Si desea ejecutar el modo UDP en su lugar:
sudo ./plpmtu -p udp -s <server-ipaddr:port>
Se requieren derechos de administrador para utilizar sockets sin formato.
Especificador | Descripción |
---|---|
-p {icmp/udp} | Seleccione en qué modo operar. |
-s <dirección[:puerto]> | Especifique la dirección del servidor. Si se ejecuta en modo UDP, también debe especificar el puerto de destino agregando ':port' (por ejemplo -s 8.8.8.8:12345 ). |
-l <dirección:puerto> | Opcional. Seleccione en qué dirección vincular(); utilizado en modo UDP; podría ser eliminado. |
-t <tiempo de espera> | Opcional. Seleccione el tiempo máximo para esperar una respuesta del servidor, el valor predeterminado es 1 segundo; El tiempo se expresa en milisegundos. |
-r <requisitos-max> | Opcional. Seleccione el número máximo de intentos fallidos necesarios para declarar no válido un tamaño de MTU; el valor predeterminado es 3 intentos. |
sudo ./plpmtu -p icmp -s 184.12.26.131
Realice el descubrimiento de MTU (modo ICMP) con 184.12.26.131.
sudo ./plpmtu -p udp -s 184.12.26.131:24000 -t 1500 -r 5
Realice el descubrimiento de MTU (modo UDP) con 184.12.26.131 en el puerto 24000. Si no se recibe una respuesta en 1,5 segundos durante 5 veces seguidas, reduzca el umbral de MTU.