Completed

Programador

Published on the May 02, 2016 in IT & Programming

About this project

Open

Estoy realizando un proyecto académico que consiste en optimizar un enlace punto a punto orientado a transferencia de archivos. Para lo cual, el método de optimización utilizado es usar un algoritmo de compresión, el cual ya lo tenemos.

Para darte una idea del alcance del proyecto te doy el siguiente ejemplo:

Host A <-----> Optimizador 1 <----------enlaceWanInternet---------> Optimizador2<-----> Host B

Se tiene el Host A ubicado en Lima y el Host B ubicado en Provincia. Se desea transferir un archivo de 50Mb desde el Host A hasta el Host B a traves de un enlace Satelital (medio inestable, alta latencia, alto porcentaje de perdida de paquetes).  Para ello se propone interceptar los paquetes de red enviados por el Host A (que conforman el archivo de 50Mb) a traves de un appliance (Optimizador1) que permita comprimir los paquetes entrantes y enviarlos por el enlace Wan satelital hasta el extremo receptor (Optimizador2) el cual los regresara a su estado original (descomprimido) y se encargara de enviarlo hasta el Host B.
Dependiendo del porcentaje de compresion, se estima reducir la latencia y el porcentaje de perdida de paquetes que existe en una transferencia normal.

Para ello se debe programar a bajo nivel y modificar los paquetes de red que ingresan por ambos Optimizadores. Todo esto a través de un kernel de linux. El programa debe modificar los campos necesarios del paquete y enviarlo sin errores hasta el extremo.
Cabe resaltar que la transferencia de archivos es bidireccional por ello ambos optimizadores deben comprimir y descomprimir dependiendo el rol que cumplan al momento de la transferencia (origen o destino).

Hasta el momento se pensó programar con la siguiente logica:

Interceptar los paquetes en el Optimizador1 (Ok)
Retener el paquete involucrado en la transferencia (FTP) (Ok)
Extraer el Payload (carga util, datos del paquete) en una variable string y comprimirla con un algoritmo de Compresion. (Ok)
Modificar el campo Payload con el nuevo string comprimido y ajustar el tamaño de este campo. (Failed)
Enviar el paquete por el enlace wan sin errores de checksum (Failed)
Interceptar los paquetes en el Optimizador2 (Ok)
Retener el paquete involucrado en la transferencia (FTP) (Ok)
Extraer el Payload en una variable string y descomprimirla con un algoritmo de Compresion.
(Ok)
Modificar el campo Payload con el nuevo string descomprimido y ajustar el tamaño de este campo. (Failed)
Enviar el paquete hacia el Host B sin errores de checksum (Failed)

Para la retención de los paquetes se utiliza la librería "netfilter" la cual es también utilizada por el iptables de linux. Para la estructura del paquete de red y modificación de campos se utiliza la librería "skbuff" la cual sirve para modificar todos los campos, sin embargo el payload es el que nos ha traído problemas tanto de checksum como de modificación como tal.


Lo que se me ocurría era cambiar la lógica y no trabajar modificando los paquetes originales sino retener el paquete original en una cola y crear un paquete nuevo copiando los campos del paquete original y dándole nuevos parámetros de checksum y payload al paquete nuevo, para luego enviarlo a través del enlace y realizar lo mismo en el Optimizador 2.

Adicionalmente, encontré un post relacionado donde trabajan con otra librería bajo la segunda lógica. Tal vez te ayude un poco en el tema.
http://forums.techarena.in/software-development/1067576.htm

En conclusión se necesita un aplicativo desarrollado en entorno de kernel space el cual permita modificar los paquetes de datos que pasen a traves del servidor el cual trabajara en modo transparente (bridge - "BRCTL"), es decir, el trafico entrara por la interfaz eth0 y saldra por la interfaz eth1 sin hacer ningun tipo de enrutamiento, trabajara como si fuera un cable. Sin embargo, tambien debera modificar los paquetes que entran por la interfaz eth0.
Los paquetes de datos estan formados por cabeceras y a su vez por campos con parametros definidos, de los cuales el campo mas importante es el Payload, donde se encuentra toda la informacion del paquete (los datos de aplicacion). El Payload como tal es una secuencia binaria que se puede convertir a string y resulta un texto plano dependiendo de la aplicacion o archivo que esta pasando a traves de las interfaces. Por ejemplo si se envia un block de notas con un texto "estoesunaprueba", el payload convertido a string resultara el mismo texto "estoesunaprueba", esto se puede validar con cualquier sniffer por ejemplo Wireshark.


Volviendo a lo principal, la idea es que cuando se intercepte el paquete, automaticamente se extraiga el string, perteneciente al payload, en una variable, y con ello aplicar un algoritmo de compresion a dicho string. El algoritmo que tenemos implementado en el kernel de linux es uno llamado LZW. No hay problema con ello.
El verdadero problema es encontrar una libreria que permita la modificacion del payload sobre el paquete original, o en todo caso una libreria que permita generar un paquete nuevo clonando ciertos campos y usando el payload comprimido gracias al LZW. Y cuando se tenga el paquete modificado enviarlo a traves de la interfaz eth1. En teoria este paquete saliente deberia tener un tamaño menor comparado con el paquete original que entro por la interfaz eth0.

Asimismo al salir de la interfaz eth1 el paquete pasara de la misma manera en modo transparente hacia otro servidor por la interfaz eth1 y debera realizar el trabajo inverso a lo que hizo el servidor anterior.
Es decir, interceptar el paquete, extraer el payload comprimido, descomprimir el payload y armar nuevamente el paquete para tener como resultado el paquete original que saldra por la interfaz eth0.

Gracias

Category IT & Programming
Is this a project or a position? Project
I currently have I have specifications
Required availability As needed
Experience in this type of projects No (I haven’t managed this kind of project before)

Delivery term: June 01, 2016

Skills needed