1 ===============================
2 Sistemas Distribuidos I (75.74)
3 ===============================
5 ----------------------------
6 Trabajo práctico de stack IP
7 ----------------------------
9 :Author: Leandro Lucarella (77891)
15 En el directorio `src` se encuentra el código fuente del trabajo, con su
16 correspondiente `Makefile` para compilarlo tan solo ejecutando `make`.
17 Dentro de este directorio hay también dos scripts de pruebas completas:
18 `test.sh` (con 1 router) y `test2.sh` (con 2 routers).
20 En el directorio `rutas_ejemplo` contiene algunos archivos con descripciones de
21 rutas de ejemplo para correr los programas.
27 El trabajo consta de un programa llamado `ip` (más algunas otras pruebas que no
28 tiene relevancia). Este programa corre 3 procesos, uno que recibe paquetes IP
29 otro que recibe entrada del usuario y envía paquetes IP y otro que redirecciona
30 (forward) paquetes IP en caso de ser pertinente.
34 ./ip ip [router [forward [route_file [queue_id [proto]]]]]
37 IP que utiliza este proceso
40 0 si es router, 1 si no lo es (default 0)
43 0 si puede hacer forwarding, 1 si no (default 0)
46 Archivo con las rutas. El formato del archivo es una ruta por línea, cada
47 línea se compone de red (por ahora sólo soporta IPs puntuales), gateway (si es
48 cero es que están en la misma red), MTU y métrica (todavía no se usa),
49 separados por uno o más espacios o tabs (default `route.txt`)
52 Identificador de la cola a usar como medio físico, también establece el
53 identificador de la cola a usar para comunicarse con el otro proceso
54 (`test_ipout`) para hacer forwarding, que será queue_id + 1 (default
55 `DEV_DEFAULT_KEY` obtenido de `dev.h`)
58 Protocolo que transporta (default 0)
61 El programa se queda esperando la entrada del usuario, y sale cuando está se
62 termina (Ctrl-D). El formato de entrada es::
67 Es decir, en una línea se pone la IP de destino y en la línea siguiente el
68 mensaje. Para enviar otro mensaje, nuevamente se pone IP de destino en una línea
69 y el mensaje en la siguiente.
75 El trabajo fue desarrollado en C++, orientado a objetos. Se compone de las
79 Encapsula la capa física y el dispositivo de red. Utiliza una cola como medio
80 físico y el id representaría el cable (si 2 dispositivos tienen cola con id
81 distinto serían como si no compartieran el mismo cable). Por simplicidad a la
82 cola siempre se envía el tamaño del MTU completo pero se agrega una cabecera
83 con el tamaño real del frame.
86 Clase auxiliar que encapsula una dirección IP.
89 Encapsula una cabecera IP. El cálculo de checksum se simplificó (haciendo una
90 suma byte a byte de toda la cabecera) porque cumple con el objetivo didactico
94 Encapsula una tabla de ruteo. Por falta de tiempo y simplicidad por ahora sólo
95 soporta rutas a un sólo host (no a una red) pero es muy fácilmente extensible
96 y transparente para el resto de las clases que la usan. Las rutas se componen
97 de red (en realidad por ahora host), geteway, MTU, metrica y dispositivo de
98 red por el cual salir (Dev).
101 Es la clase encargada de recibir paquetes IP. Hace chequeos varios y descarta
102 paquetes según los siguientes criterios:
104 * Cabecera incompleta o no es IP
105 * Versión IP incorrecta
108 * No es para nosotros y no hacemos forward
109 * Es para nosotros pero somos un router
111 Si hace forwarding le pasa a IPOut el paquete por una cola y reensabla de ser
115 Es la clase encargada de enviar paquetes IP. Tiene una RouteTable para hacer
116 el ruteo y verifica si hay paquetes a forwardear antes de enviar lo que le
117 piden. También fragmenta y puede "descartar" paquetes según estos criterios:
119 * No existe una ruta para el destino
120 * Tamaño de paquete más grande que MTU y DF=1
131 * 10.10.10.1 0.0.0.0 35 0
132 * 10.10.10.3 10.10.10.5 35 1
133 * 10.10.10.5 0.0.0.0 35 0
135 Envía "adios mundo cruel!!!" al host 10.10.10.3::
137 $ (echo -e '10.10.10.3\nAdios mundo cruel!!!'; sleep 1) | ./ip 10.10.10.1 0 0 ../rutas_ejemplo/route_10.10.10.1.txt
138 IPOut::send (10.10.10.1): Fragmento 0 => IPHeader: version=4 total_len=40 id=44919 DF=0 MF=1 offset=0 TTL=64 proto=0 checksum=214 src=10.10.10.1 dst=10.10.10.3
139 data (15) = Adios mundo cru
140 IPOut::send (10.10.10.1): Fragmento 1 => IPHeader: version=4 total_len=25 id=44919 DF=0 MF=0 offset=15 TTL=64 proto=0 checksum=315 src=10.10.10.1 dst=10.10.10.3
142 Enviado 'Adios mundo cruel!!!' a 10.10.10.3
150 * 10.10.10.1 0.0.0.0 35 0
151 * 10.10.10.3 0.0.0.0 32 0
152 * 10.10.10.5 0.0.0.0 35 0
156 $ ./ip 10.10.10.5 1 1 ../rutas_ejemplo/route_10.10.10.5.txt
157 IPIn::recv (10.10.10.5): IPHeader: version=4 total_len=40 id=44919 DF=0 MF=1 offset=0 TTL=64 proto=0 checksum=214 src=10.10.10.1 dst=10.10.10.3
158 data (15) = Adios mundo cru
159 IPIn::recv (10.10.10.5): IPHeader: version=4 total_len=25 id=44919 DF=0 MF=0 offset=15 TTL=64 proto=0 checksum=315 src=10.10.10.1 dst=10.10.10.3
161 IPOut::forward_loop (10.10.10.5): A forwardear (id 44919)
162 IPOut::send (10.10.10.5): Fragmento 0 => IPHeader: version=4 total_len=40 id=44919 DF=0 MF=1 offset=0 TTL=64 proto=0 checksum=214 src=10.10.10.1 dst=10.10.10.3
163 data (12) = Adios mundo
164 IPOut::send (10.10.10.5): Fragmento 1 => IPHeader: version=4 total_len=28 id=44919 DF=0 MF=1 offset=12 TTL=64 proto=0 checksum=298 src=10.10.10.1 dst=10.10.10.3
166 IPOut::forward_loop (10.10.10.5): A forwardear (id 44919)
167 IPOut::send (10.10.10.5): Fragmento 0 => IPHeader: version=4 total_len=25 id=44919 DF=0 MF=0 offset=15 TTL=64 proto=0 checksum=315 src=10.10.10.1 dst=10.10.10.3
176 * 10.10.10.1 10.10.10.5 32 1
177 * 10.10.10.3 0.0.0.0 32 0
178 * 10.10.10.5 0.0.0.0 32 0
180 Finalmente este host recibe todos los fragmentos, reensabla y pasa el
181 paquete completo a la capa superior::
183 $ ./ip 10.10.10.3 0 0 ../rutas_ejemplo/route_10.10.10.3.txt
184 IPIn::recv (10.10.10.3): IPHeader: version=4 total_len=40 id=44919 DF=0 MF=1 offset=0 TTL=64 proto=0 checksum=214 src=10.10.10.1 dst=10.10.10.3
185 data (12) = Adios mundo
186 IPIn::recv (10.10.10.3): IPHeader: version=4 total_len=28 id=44919 DF=0 MF=1 offset=12 TTL=64 proto=0 checksum=298 src=10.10.10.1 dst=10.10.10.3
188 IPIn::recv (10.10.10.3): IPHeader: version=4 total_len=25 id=44919 DF=0 MF=0 offset=15 TTL=64 proto=0 checksum=315 src=10.10.10.1 dst=10.10.10.3
190 IPIn::recv (10.10.10.3): Paquete completo: data = 'Adios mundo cruel!!!'
191 Recibido 'Adios mundo cruel!!!' (len 20) de 10.10.10.1 para 10.10.10.3 (proto = 0)
193 .. vim: filetype=rst :