Solución:
-
La MTU es el tamaño máximo de un paquete IP que se puede transmitir sin fragmentación.
IPv4 exige una ruta MTU de al menos 576 bytes, IPv6 de al menos 1280 bytes.
Ethernet tiene una MTU de 1500 bytes.
-
Un paquete IP se compone de dos partes: el encabezado del paquete y la carga útil.
El tamaño de un encabezado IPv4 es al menos 20 bytes, el tamaño de un encabezado IPv6 al menos 40 bytes.
La carga útil de un paquete IP suele ser un segmento TCP o un datagrama UDP.
-
Un datagrama UDP consta de un encabezado UDP y los datos transportados.
El tamaño de un encabezado UDP es de 8 bytes.
Esto significa un paquete IP con un datagrama UDP vacío como carga útil al menos 28 (IPv4) o 48 (IPv6) bytes, pero puede ocupar más bytes.
También tenga en cuenta que en el caso de Ethernet, el paquete IP se incluirá adicionalmente en un paquete MAC (encabezado de 14 bytes + CRC de 4 bytes) que se integrará en una trama de Ethernet (secuencia de preámbulo de 8 bytes). Esto agrega 26 bytes de datos al paquete IP, pero no cuenta para la MTU.
Por lo tanto, no puede asumir que un datagrama UDP hará que se transmita un número específico de bytes.
Los encabezados IP típicos son de 20 bytes, si no se han seleccionado opciones. Los encabezados UDP tienen 8 bytes. A través de Ethernet, el tamaño de la trama es de 14 bytes (encabezado) + 4 bytes (avance). Dependiendo de cómo capture estos paquetes, es posible que deba o no tener en cuenta el tamaño de la trama.
Sin Ethernet (IP + UDP) = 20 + 8 = 28 bytes
Con Ethernet = 18 + 28 = 46 bytes
La clase UdpClient en C # devolverá el paquete desde la capa 5 en adelante, por lo que no tendrá que tener en cuenta lo anterior.
Actualizar:
La MTU de 1500 bytes se aplica en la capa IP. Eso significa que el tamaño del paquete por debajo de la capa IP es insignificante cuando se fragmenta.
Eso se traduce en:
Bytes de trama Ethernet (fijo) = 18
Encabezado IP (min) = 20
Encabezado UDP (fijo) = 8
Max. Carga útil permitida sin fragmentación = 1472
Número total de bytes que van en el cable = (Suma anterior) 1518 bytes
(Puede contar la cantidad de bytes que salen con una herramienta como Wireshark)
Si (encabezado IP + encabezado UDP + carga útil> 1500), el paquete está fragmentado.
¿Es seguro asumir que si envío datos de 0 bytes (carga útil), los datos reales que se transfieren son 28 bytes?
No
(y sí … porque generalmente no hace una diferencia real, en la medida en que sea “seguro”)
Si bien es cierto que un datagrama UDP / IPv4 sin carga útil y sin opción tiene exactamente 28 bytes (o “octetos” en la jerga de la red), esto no es de ninguna manera una suposición segura.
Sin embargo, en su mayor parte es intrascendente. Los conmutadores y enrutadores generalmente reenvían un paquete pequeño exactamente tan rápido como uno más grande (o, con una diferencia insignificante). La única ocasión en la que puede ver una diferencia es en su factura de ancho de banda (¡paga por todos los bits en el cable, no solo por los que usa!).
IPv4 puede tener hasta 40 octetos de “opciones” adjuntas, e IPv4 puede encapsularse en IPv6 (incluso sin que usted lo sepa). Ambos podrían aumentar drásticamente el tamaño del datagrama y, por lo tanto, los datos transferidos de una manera bastante obvia.
Además, el datagrama se encapsulará aún más en la capa de enlace, agregando preámbulos y datos de encabezado, y teniendo longitudes de trama mínimas. La presencia de encabezados adicionales es, nuevamente, bastante obvia, el hecho de que además de los tamaños máximos, las cargas útiles también tienen mínimo tamaños es un hecho menos conocido.
Ethernet y ATM son dos estándares ampliamente utilizados que pueden interferir con sus suposiciones aquí (pero otras capas de enlace son similares).
Una trama ethernet tiene un tamaño mínimo de 64 bytes y se rellena con ceros a este tamaño. En presencia de 802.1Q (VLAN), esto significa que la carga útil mínima para una trama ethernet es de 42 octetos; de lo contrario, es de 46 octetos.
Por lo tanto, el envío de un datagrama UDP / IPv4 de longitud cero a través de Ethernet “normal” agregará 18 bytes cero a la carga útil. Nunca llega a verlos, pero están ahí y aparecerán en su factura.
De manera similar, las celdas ATM (lo mismo que “trama”, usan una palabra diferente por alguna razón) siempre tienen 53 bytes, con 48 bytes de carga útil con relleno de ceros. Por lo tanto, un diagrama UDP de carga útil cero hará que se agreguen 20 bytes cero, mientras que un datagrama UDP / IPv6 de longitud cero mantendría su tamaño original (siendo exactamente 48 bytes de tamaño), asumiendo que no hay otra encapsulación como PPPoE en el medio.
Por último, tenga en cuenta que es posible que sea necesario enviar y recibir paquetes adicionales para poder enviar su paquete. Por ejemplo, su tarjeta ethernet puede tener que hacer ARP (o NDP) para poder enviar su datagrama. El almacenamiento en caché de los resultados amortiza esto ya que está enviando varios datagramas, pero si envía solo uno UPD, es posible que se sorprenda de que se envíen y reciban aproximadamente tres veces más “datos” en comparación con lo que podría esperar ingenuamente.