Apr 02

Fragmentando paquetes con JPcap

 JPcap es una librería que nos permite desde java enviar paquetes IP hechos a nuestra medida, podemos decidir todos los campos de las cabeceras IP y demás.

Usándola para enviar paquetes UDP por multicast, me encontré con una limitación. Sólo permite enviar paquetes de un máximo de 1472 bytes de datos, por lo que me he visto obligado a fragmentar el envío de datos en varios paquetes IP. Como el protocolo IP contempla el fragmentado de paquetes y como estoy usando jpcap que permite el control a bajo nivel de estos paquetes, decidí hacerlo a ese nivel.

El fragmentado IP es bastante fácil, son cuatro campos mal contados los que hay que rellenar y no demasiado complejo. Me pongo a ello, me hago mi pequeño programa para enviar arrays de bytes grandes en varios paquetes. Me hago mi pequeño programa de prueba para recibir, con un socket normalito de java, ya que se supone que la reconstrucción de paquetes se hace sola en recepción. Y todo en apariencia correcto. Mi log de enviar me dice que he enviado muchos paquetitos pequeños y el programa de prueba en recepción recibe uno solo.

Pero cual es mi sorpresa cuando reviso los datos recibidos y veo que no se parecen en nada a los enviados. Me abro un sniffer (wireshark), analizo los paquetes que envío … y sorpresa, todos tiene el campo offset a 0. Ese campo indica qué posición ocupan el grupo de bytes que se envían dentro del mensaje grande, es decir, si envío 10000 bytes en grupos de 1000, los offset son 0, 1000, 2000,…. Pues bien, todos son cero. En recepción, los bytes se machacan unos a otros y sólo se reciben los del último paquete.

Reviso mi código con debugger y el offset lo estoy rellenando correctamente. Me bajo los fuentes de jpcap (están en java) y me encuentro una sorpresa. En apariencia un error tonto. El método recibe el parámetro offset y en vez de hacer

this.offset = (short)offset;

hace

offset = (short)offset;

es decir, nada de nada. Bueno, parece fácil de arreglar. Hago mi arreglo, luego no es tan evidente por culpa del ordenamiento de bytes (tengo que darle la vuelta a los dos bytes del short para que funcione en windows) y listo, todo funcionando correctamente.

Cuando descubrí el fallo lo puse en el grupo de discusión de jpcap. Pero parece que me lo han borrado, así que la solución me la quedo para mí.

El código con todo esto y los detalles de cómo enviar paquetes, en la chuwiki.

Entradas relacionadas:

3 Responses to “Fragmentando paquetes con JPcap”

  1. de la red – 2/04/2011 « Tecnologías y su contexto Says:

    […] Fragmentando paquetes con JPcap JPcap es una librería que nos permite desde java enviar paquetes IP hechos a nuestra medida, podemos decidir todos los campos de las cabeceras IP y demás. […]

  2. Lek Says:

    Como no sea porque has usado una versión “vieja” y ya está arreglado, no entiendo que quiten el post…

  3. Chuidiang Says:

    Me da la impresión de que el proyecto está un poco abandonado. En su página, la última entrada es del 2007. El grupo de discusión parece que se ha convertido en un spam generalizado con ofertas urgentes de trabajo y cosas así.

Leave a Reply