MTU y fragmentación

La fragmentación IP es un mecanismo que permite separar (o fragmentar) un paquete IP entre varios bloques de datos, si su tamaño sobrepasa la unidad máxima de transferencia (Maximum Transfer Unit - MTU) del canal. Un router fragmenta un datagrama IP en varios si el siguiente tramo de la red por el que tiene que viajar el datagrama tiene un MTU inferior a la longitud del datagrama.

La cabecera de IPv4 tiene una sección de flags relacionada con la fragmentación. Se trata de dos bits (MF y DF), tal y como se puede ver en el siguiente gráfico:

El significado de los flags es el siguiente:

  • Si el bit DF (Don't Fragment) está a 1 indica a los routers intermedios que este datagrama no debe fragmentarse.
  • Si el bit MF (More Fragments) está a 1 indica que el datagrama es un fragmento de un datagrama mayor, y que no es el último. Si está a 0 indica que este es el último fragmento o bien que el datagrama no ha sido fragmentado.

Actividad 1. Averigua cuál es tu puerta de enlace. Después, ejecuta el comando siguiente:

Si estás en Windows:

ping -l 2500 -f a.b.c.d

Si estás en Linux:

ping -s 2500 -M do a.b.c.d

Los parámetros añadidos al comando ping indican que el tamaño de los datos del datagrama sea de 2500 bytes, y que no se permite la fragmentación.

Podrás observar un error, indicando que la MTU excede la MTU máxima permitida.

Toma una captura del mensaje de error obtenido, y guárdala con el nombre Act1-mtu.png

Cuando un paquete se fragmenta, se sigue el siguiente procedimiento. Supongamos que se está enviando un datagrama con 3500 bytes de datos, por una canal que tiene una MTU máxima de 1500 bytes. Cada datagrama IP posee una cabecera de 20 bytes, lo que quiere decir que si la MTU es de 1500 bytes, solamente podrán viajar 1480 bytes en cada datagrama. Es decir:

  1. Primer fragmento. Cabecera: 20 bytes. Datos 1480 bytes. DF = 0. MF = 1. Offset: 0
  2. Segundo fragmento. Cabecera: 20 bytes. Datos 1480 bytes. DF = 0. MF = 1. Offset: 1480
  3. Tercer fragmento. Cabecera: 20 bytes. Datos 540 bytes. DF = 0. MF = 0. Offset: 2960

Actividad 2. En esta actividad vamos a observar la cabecera de los paquetes fragmentados que llegan a nuestro ordenador desde una interfaz máquina virtual. Para ello deberás seguir los siguientes pasos:

  1. Abre Wireshark en tu ordenador, e inicia la escucha en la interfaz any.
  2. Abre una máquina virtual, y configura su interfaz de red en modo puente de forma que esté en el mismo segmento de red que la interfaz física de tu ordenador.
  3. Averigua la dirección IP de la máquina virtual, así como la de tu ordenador.
  4. Suponiendo que la dirección IP de la máquina virtual es a.b.c.d, añade en Wireshark el filtro siguiente: ip.addr == a.b.c.d
  5. Haz ping desde la máquina virtual a tu ordenador, utilizando un tamaño de datos de 3500 bytes

Hecho esto, observa las cabeceras de los paquetes IP, y comprueba la información de los fragmentos.

Entrega una captura donde se pueda observar la información de la cabecera del segundo fragmento de un datagrama, con el nombre Act2-mtu.png.

Comprobar la MTU de una interfaz

En Windows, podemos conocer la MTU de una interfaz con el comando siguiente:

netsh interface ipv4 show subinterface

En GNU/Linux, en cambio, ejecutaremos el comando siguiente, y buscaremos el parámetro MTU en la interfaz de interés.

Ajustar el tamaño de la MTU

Es posible cambiar el tamaño por defecto de la MTU de una interfaz de red, para evitar la fragmentación. Hacerlo puede elevar el rendimiento de la red. Cuanto mayor sea el MTU la línea tendrá una eficiencia mayor debido a dos cuestiones fundamentales:

  • Porque la sobrecarga de los protocolos superiores al ser fija influirá menos en la transmisión total de los datos. Es decir, la proporción de datos respecto a la información de protocolos aumento. Supongamos, si los propios protocolos ocupasen 10 Bytes (por ejemplo) y pudiésemos enviar un solo byte de datos útiles en cada paquete, tendríamos que enviar 11 Bytes en total, de los cuales solamente 1 sería de datos (proporción de 1 a 10). En cambio, si pudiésemos enviar de golpe 1000 Bytes de datos en el mismo paquete en vez de tan solo uno, estaríamos hablando 1010 Bytes en total, de los cuales 1000 serían de datos (proporción de 100 a 1).
  • Cuanto mayor sea el MTU, menos paquetes/tramas serán necesarios enviar, y por tanto será necesario un menor procesamiento, cuestión muy importante en Firewalls y cualquier sistema que tenga que filtrar, analizar o tratar dicha información.

Una mayor MTU también puede traer problemas:

  • Una mayor da lugar a paquetes mayores. Al ser paquetes de tamaño superior, es normal que tarden más en llegar al destino, especialmente en conexiones lentas, lo que se traduce en una mayor latencia.
  • Si un enlace intermedio no soporta una MTU tan grande, se producirá una fragmentación del paquete, lo que dará lugar a mayor número de paquetes a gestionar por los routers que reciban los fragmentos, y mayor trabajo de ensamblado en el destino.

Podemos comprobar el tamaño óptimo de MTU haciendo ping, forzando un tamaño de datos (payload) superior a la soportada por el canal, y activando el bit de "Don't Fragment". De ahí, podemos ir bajando el tamaño de los datos hasta dar con la MTU óptima. Como destino de nuestros ping, podemos usar un sitio visitado continuamente, como www.google.com. Hay que tener en cuenta que al hacer ping, estamos enviando 20 bytes de cabecera IP y otros 8 bytes de cabecera ICMP. Supongamos que el tamaño mayor de datos para el que obtenemos resupesta ping de www.google.com es 964. Entonces, la MTU óptima será 964 (datos) + 20 (cabecera ip) + 8 (cabecera icmp).

Cambiar la MTU de una interfaz

Cambiar la MTU en Windows

Una vez abierta una consola de comandos, seguimos los siguientes pasos:

  1. Ejecutamos el comando netsh interface ipv4 show subinterface
  2. Esto nos mostrará una lista de interfaces de red. Debemos fijarnos en la interfaz de nuestro interés.
  3. Ejecutamos el comando netsh interface ipv4 set subinterface "Conexión de área local" mtu=1458 store = persistent
  4. Sustituye el nombre de la interfaz "Conexión de área local" por el nombre de la interfaz cuya MTU deseas modificar.
  5. Reinicia el sistema, y comprueba la nueva MTU.

Cambiar la MTU en GNU/Linux

Para cambiar la MTU en distribuciones Debian, como Ubuntu, podemos utilizar diferentes métodos:

  • Para interfaces configuradas estáticamente:
    1. Método 1: Ejecutar el comando sudo ifconfig eth0 mtu 1492
    2. Método 2: Añadir la cadena mtu 1492 en la sección de configuración de una interfaz, en el archivo /etc/network/interfaces
  • Para interfaces configuradas por DHCP
    1. El problema de interfaces configuradas por DHCP, es que la MTU viene dictada por el servidor DHCP. Para modificar la MTU debemos añadir las siguientes líneas al archivo /etc/dhcp/dhcp.client justo después de la línea send host-name = gethostname();:
    2. default interface-mtu 1400; supersede interface-mtu 1400;
    3. Hecho esto, reiniciamos la interfaz con los comandos ifdown eth0 y ifup eth0.
    4. Cambiar la MTU y el nombre de la interfaz según la configuración del sistema.

Actividad 3. Abre una máquina virtual con Windows instalado. Después modifica la MTU, para que sea de 1400 bytes.

Toma una captura donde se pueda ver la MTU de la interfaz una vez que la hayas modificado. Guarda la captura con el nombre Act3-mtu.png

Actividad 4. Abre una máquina virtual con Ubuntu Server LTS instalado. Después modifica la MTU, para que sea de 1400 bytes.

Toma una captura donde se pueda ver la MTU de la interfaz una vez que la hayas modificado. Guarda la captura con el nombre Act4-mtu.png

¿Cómo afecta a la velocidad de descarga una MTU correctamente ajustada?

Para la siguiente práctica es necesario que cuentes con las siguientes máquinas:

  1. Un servidor web Ubuntu Server 14.04, que contenga un archivo grande (por ejemplo, la imagen ISO de Ubuntu 14.04)
  2. Dos routers Ubuntu Server 14.04
  3. Un cliente Windows

Vamos a montar el siguiente escenario. Configuraremos una topología como la siguiente:

Actividad 5. Esta actividad tiene como objetivo comprobar el efecto de la fragmentación sobre el rendimiento de la red. Sigue los siguientes pasos:

  1. Configura la red para que el cliente Windows pueda acceder al servidor web, y pueda descargar la imagen.
  2. A continuación, configura el enlace entre los routers con una MTU de 1200 bytes. Es decir, las interfaces del enlace entre los routers deben tener asignada una MTU de 1200 bytes.
  3. Descarga la imagen ISO alojada en el servidor web desde el cliente Windows y apunta la velocidad de descarga, asegurándote de que la MTU en cliente y servidor web es de 1500.
  4. Descarga la imagen ISO alojada en el servidor web desde el cliente Windows y apunta la velocidad de descarga, asegurándote de que la MTU en cliente y servidor web es de 1200.
  5. Descarga la imagen ISO alojada en el servidor web desde el cliente Windows y apunta la velocidad de descarga, asegurándote de que la MTU en cliente y servidor web es de 1000.
  6. Descarga la imagen ISO alojada en el servidor web desde el cliente Windows y apunta la velocidad de descarga, asegurándote de que la MTU en cliente y servidor web es de 750.
  7. Descarga la imagen ISO alojada en el servidor web desde el cliente Windows y apunta la velocidad de descarga, asegurándote de que la MTU en cliente y servidor web es de 600.

Confecciona una tabla donde se pueda buscar un patrón de comportamiento según la MTU elegida en cada caso.

Entrega la tabla en un documento llamado Act5-mtu.txt.