]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/pipi-1ra-entrega-corregida/README
Bugfix.
[z.facultad/75.74/practicos.git] / practicas / pipi-1ra-entrega-corregida / README
1 ===============================
2 Sistemas Distribuidos I (75.74)
3 ===============================
4
5 ----------------------------
6 Trabajo práctico de stack IP
7 ----------------------------
8
9 :Author: Leandro Lucarella (77891)
10
11
12 Organización
13 ============
14
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).
19
20 En el directorio `rutas_ejemplo` contiene algunos archivos con descripciones de
21 rutas de ejemplo para correr los programas.
22
23
24 Uso
25 ===
26
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.
31
32 Uso::
33
34   ./ip ip [router [forward [route_file [queue_id [proto]]]]]
35
36 ip
37   IP que utiliza este proceso
38
39 router
40   0 si es router, 1 si no lo es (default 0)
41
42 forward
43   0 si puede hacer forwarding, 1 si no (default 0)
44
45 route_file
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`)
50
51 queue_id
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`)
56
57 proto
58   Protocolo que transporta (default 0)
59
60
61 El programa se queda esperando la entrada del usuario, y sale cuando está se
62 termina (Ctrl-D). El formato de entrada es::
63
64   IP DESTINO
65   MENSAJE
66
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.
70
71
72 Diseño del trabajo
73 ==================
74
75 El trabajo fue desarrollado en C++, orientado a objetos. Se compone de las
76 siguientes clases:
77
78 Dev
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.
84
85 IPAddr
86   Clase auxiliar que encapsula una dirección IP.
87
88 IPHeader
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
91   de todas maneras.
92
93 RouteTable
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).
99   
100 IPIn
101   Es la clase encargada de recibir paquetes IP. Hace chequeos varios y descarta
102   paquetes según los siguientes criterios:
103
104   * Cabecera incompleta o no es IP
105   * Versión IP incorrecta
106   * Mal checksum
107   * TTL=0
108   * No es para nosotros y no hacemos forward
109   * Es para nosotros pero somos un router
110
111   Si hace forwarding le pasa a IPOut el paquete por una cola y reensabla de ser
112   necesario.
113
114 IPOut
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:
118
119   * No existe una ruta para el destino
120   * Tamaño de paquete más grande que MTU y DF=1
121
122
123 Ejemplo de corrida
124 ==================
125
126 Host 10.10.10.1
127 ---------------
128
129 Rutas:
130
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
134
135 Envía "adios mundo cruel!!!" al host 10.10.10.3::
136
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
141           data (5) = el!!!
142   Enviado 'Adios mundo cruel!!!' a 10.10.10.3
143
144
145 Router 10.10.10.5
146 -----------------
147
148 Rutas:
149
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
153
154 Recibe el mensaje::
155
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
160     data (5) = el!!!
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
165     data (3) = cru
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
168     data (5) = el!!!
169
170
171 Host 10.10.10.3
172 ---------------
173
174 Rutas:
175
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
179
180 Finalmente este host recibe todos los fragmentos, reensabla y pasa el
181  paquete completo a la capa superior::
182
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
187     data (3) = cru
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
189     data (5) = el!!!
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)
192
193 .. vim: filetype=rst :