UDP no sabe nada sobre MTU. Los paquetes UDP pueden tener cualquier tamaño de 8 a 65535 bytes. Las capas de protocolo debajo de UDP pueden enviar un paquete de un tamaño específico o rechazarán enviar ese paquete con un error si es demasiado grande.
La capa debajo de UDP suele ser IP, ya sea IPv4 o IPv6. Y el paquete IP puede tener cualquier tamaño desde 20 (IPv4) / 40 (IPv6) a 65535 bytes, es el mismo máximo que UDP. Sin embargo, IP admite un mecanismo llamado fragmentación . Si un paquete IP tiene un tamaño mayor que el que puede transportar la capa de abajo, IP puede dividir un paquete único en múltiples paquetes llamados fragmentos. De hecho, cada fragmento es un paquete de IP propio (tiene un encabezado de IP propio) y también se envía por sí solo al destino; es entonces la tarea del destino recopilar todos los fragmentos y reconstruir el paquete completo a partir de ellos antes de pasar los datos recibidos en la siguiente capa superior (por ejemplo, UDP).
El protocolo Ethernet solo puede transportar tramas con una carga útil entre 46 y 1500 bytes (hay excepciones, pero eso está fuera del alcance de esta respuesta). Si los datos de la carga útil son inferiores a 46 bytes, se rellenan para que sean 46 bytes. Si los datos de la carga útil superan los 1500 bytes, la interfaz se negará a aceptarlos. Si eso sucede, ahora depende de la capa IP decidir si fragmenta el paquete, de modo que ningún fragmento sea mayor de 1500 bytes o informe un error a la siguiente capa superior si la fragmentación se ha deshabilitado o prohibido para esta conexión en particular.
La fragmentación generalmente se debe evitar, ya que
- Esto desperdicia recursos en el lado del remitente.
- desperdicia recursos en el lado del receptor.
- aumenta la sobrecarga del protocolo para la misma cantidad de datos de carga útil.
- Si se pierde un solo fragmento, se pierde todo el paquete.
- Si un solo fragmento está dañado, todo el paquete está dañado.
- En caso de reenvío, todos los fragmentos deben reenviarse.
Es por eso que TCP adopta de manera inteligente su tamaño de trama para que los paquetes nunca requieran IP para fragmentarlos. Esto se puede hacer prohibiendo que IP fragmente los paquetes y si IP informa que un paquete es demasiado grande para ser enviado, TCP reduce el tamaño de la trama e intenta nuevamente, hasta que ya no se informa ningún error.
Sin embargo, para UDP, esta sería la tarea de la aplicación en sí misma, ya que UDP es un protocolo "tonto", no tiene lógica de administración propia, lo que lo hace muy flexible, rápido y simple.
El único tamaño UDP en el que puede confiar para que sea siempre transportable es 576 menos 8 bytes de encabezado UDP y menos 20 (v4) / 40 (v6) bytes de encabezado IP, ya que el estándar IP requiere que cada host IP pueda recibir paquetes IP con un tamaño total de 576 bytes. La implementación de su protocolo no sería estándar si no puede aceptar paquetes de al menos ese tamaño. Sin embargo, tenga en cuenta que el estándar no dice 576 sin fragmentación, por lo que incluso un paquete IP de 576 bytes puede fragmentarse entre dos hosts.
El único tamaño de paquete en el que puede confiar para que sea transportable sin fragmentación es 24 bytes para IPv4 y 56 bytes IPv6, ya que los encabezados IP más pequeños para un fragmento son 20/48 bytes (v4 / v6) y un fragmento debe tener al menos 4/8 bytes (v4 / v6) datos de carga útil. Por lo tanto, un sistema de transporte por debajo de la capa IP que no puede transportar al menos paquetes de estos tamaños, no puede utilizarse para transportar tráfico IP.
Y antes de que alguien comente que un encabezado IPv6 solo tiene 40 bytes: eso es correcto pero, a diferencia de un encabezado IPv4, un encabezado IPv6 estándar no tiene campos de encabezado para la fragmentación. Si un paquete tiene que fragmentarse, se debe agregar un encabezado de extensión de fragmentación debajo del encabezado base IPv6 y este encabezado de extensión tiene una longitud de 8 bytes. Además, a diferencia de IPv4, las compensaciones de fragmentación en IPv6 se cuentan en unidades de 8 bytes y no de 4 bytes, por lo que un fragmento solo puede transportar una carga útil que es un múltiplo de 8 bytes en el caso de IPv6.