2010-09-14 23 views
12

Estoy tratando de comprender algún comportamiento que estoy viendo en el contexto del envío de paquetes UDP.Fragmentación de IP UDP y MTU

Tengo dos pequeños programas de Java: uno que transmite paquetes UDP, y el otro que los recibe. Los estoy ejecutando localmente en mi red entre dos computadoras que están conectadas a través de un solo interruptor.

La configuración de MTU (informada por/sbin/ifconfig) es 1500 en ambos adaptadores de red.

  • Si envío paquetes con un tamaño < 1500, los recibo. Esperado.
  • Si envío paquetes con 1500 < tamaño < 24258 los recibo. Esperado. He confirmado vía wireshark que la capa IP los está fragmentando.
  • Si envío paquetes con tamaño> 24258, se pierden. No esperado. Cuando ejecuto wireshark en el lado de recepción, no veo ninguno de estos paquetes.

Pude ver un comportamiento similar con ping -s.

ping -s 24258 hostA obras, sino

ping -s 24259 hostA falla.

¿Alguien entiende lo que puede estar pasando, o tiene ideas de lo que debería estar buscando?

Ambas computadoras ejecutan CentOS 5 de 64 bits. Estoy usando un 1.6 JDK, pero realmente no creo que sea un problema de programación, es un problema de red o tal vez de sistema operativo.

+0

Puede que tenga mejor suerte al preguntar esto en serverfault.com. –

+3

¿Qué muestra wireshark en el lado de envío de la conexión para paquetes con 'size> 24258'? –

+1

@Kaleb No soy un experto en wireshark, pero la captura en el lado de envío se ve igual si el tamaño del paquete es> o <24258. Veo paquetes IP fragmentados, pero solo veo los paquetes UDP para paquetes pequeños (tengo una mezcla de paquetes muy pequeños y muy grandes). Los datos que envío son binarios, por lo que es difícil determinar qué paquete IP pertenece a qué paquete UDP. Podría intentar hacer una prueba más simple con datos más predecibles y ver qué muestra el wireshark. Aunque tal vez no llegue a eso hasta mañana. @ire_and_curses, gracias, no estaba seguro de qué fue lo que serverfault exactamente abarcó. Podría intentarlo allí. – wolfcastle

Respuesta

10

No es necesario que las implementaciones del protocolo IP sean capaces de manejar paquetes arbitrariamente grandes. En teoría, el tamaño máximo posible del paquete IP es de 65.535 octetos, pero el estándar solo requiere que las implementaciones admitan al menos 576 octetos.

Parece que la implementación de su host admite un tamaño máximo muy superior a 576, pero aún significativamente menor que el tamaño teórico máximo de 65.535. (No creo que el cambio sea un problema, porque no debería necesitar desfragmentar, ni siquiera está funcionando en la capa IP).

El estándar IP recomienda además que los hosts no envíen paquetes de más de 576 bytes, a menos que estén seguros de que el host receptor puede manejar el tamaño de paquete más grande. Quizás debería considerar si sería mejor para su programa enviar un tamaño de paquete más pequeño. 24,529 me parece terriblemente grande. Creo que existe la posibilidad de que muchos hosts no manejen paquetes tan grandes.

Tenga en cuenta que estos límites de tamaño de paquete están completamente separados de MTU (el tamaño de fotograma máximo admitido por el protocolo de capa de enlace de datos).

+1

No sabía que las implementaciones podrían tener un tamaño de paquete máximo más pequeño. ¿Sabes cómo determinar qué es este valor? Acepto 24k es un tamaño muy grande, y probablemente no envíe ese gran número de paquetes en el sistema implementado, solo lo encontré durante las pruebas. Tengo control total sobre la red en el sistema desplegado (todas las computadoras/switches/enrutadores). Estamos usando Gigabit ethernet, así que si también utilizamos marcos jumbo, supongo que * debería * poder usar un tamaño de paquete de 9000 (encabezados UDP + carga útil) sin fragmentar la capa de IP. – wolfcastle

5

I encontraron los siguientes, que pueden ser de interés:

La respuesta de Dan es útil, pero tenga en cuenta que después de los encabezados está realmente limitado a 65507 bytes.

Cuestiones relacionadas