X-Git-Url: https://git.llucax.com/z.facultad/75.74/practicos.git/blobdiff_plain/26fc1173c5122fd73d1cd2191e20d49fef1e1f32..ef15974313fff9ab137618f289649d7420833b1c:/practicas/pipi/README?ds=inline diff --git a/practicas/pipi/README b/practicas/pipi/README index 2243ff3..cca4337 100644 --- a/practicas/pipi/README +++ b/practicas/pipi/README @@ -14,6 +14,8 @@ Organización En el directorio `src` se encuentra el código fuente del trabajo, con su correspondiente `Makefile` para compilarlo tan solo ejecutando `make`. +Dentro de este directorio hay también dos scripts de pruebas completas: +`test.sh` (con 1 router) y `test2.sh` (con 2 routers). En el directorio `rutas_ejemplo` contiene algunos archivos con descripciones de rutas de ejemplo para correr los programas. @@ -22,23 +24,17 @@ rutas de ejemplo para correr los programas. Uso === -El trabajo tiene 2 programas de prueba principales: `test_ipin` y `test_ipout`, -ambos generados en el directorio `src` luego de compilar el código. - -test_ipin ---------- - -Este programa es el proceso que recibe paquetes IP y los procesa. +El trabajo consta de un programa llamado `ip` (más algunas otras pruebas que no +tiene relevancia). Este programa corre 3 procesos, uno que recibe paquetes IP +otro que recibe entrada del usuario y envía paquetes IP y otro que redirecciona +(forward) paquetes IP en caso de ser pertinente. Uso:: - ./test_ipin [ip] [mtu] [router] [forward] [proto] [queue_id] + ./ip ip [router [forward [route_file [queue_id [proto]]]]] ip - IP que utiliza este proceso (default 10.10.10.1) - -mtu - MTU de la capa física de este proceso (default 25) + IP que utiliza este proceso router 0 si es router, 1 si no lo es (default 0) @@ -46,8 +42,11 @@ router forward 0 si puede hacer forwarding, 1 si no (default 0) -proto - Protocolo que transporta (default 0) +route_file + Archivo con las rutas. El formato del archivo es una ruta por línea, cada + línea se compone de red (por ahora sólo soporta IPs puntuales), gateway (si es + cero es que están en la misma red), MTU y métrica (todavía no se usa), + separados por uno o más espacios o tabs (default `route.txt`) queue_id Identificador de la cola a usar como medio físico, también establece el @@ -55,39 +54,19 @@ queue_id (`test_ipout`) para hacer forwarding, que será queue_id + 1 (default `DEV_DEFAULT_KEY` obtenido de `dev.h`) +proto + Protocolo que transporta (default 0) -test_ipout ----------- - -Este programa es el proceso que envía paquetes IP y rutea. - -Uso:: - - ./test_ipout [ip] [dst] [mtu] [routes_file] [proto] [queue_id] - -ip - IP que utiliza este proceso (default 10.10.10.2) - -dst - IP del destino al cual mandar paquetes (default 10.10.10.1) - -mtu - MTU de la capa física de este proceso (default 25) -route_file - Archivo con las rutas. El formato del archivo es una ruta por línea, cada - línea se compone de red (por ahora sólo soporta IPs puntuales), gateway (si es - cero es que están en la misma red) y métrica (todavía no se usa), separados - por uno o más espacios o tabs (default `route.txt`) +El programa se queda esperando la entrada del usuario, y sale cuando está se +termina (Ctrl-D). El formato de entrada es:: -proto - Protocolo que transporta (default 0) + IP DESTINO + MENSAJE -queue_id - Identificador de la cola a usar como medio físico, también establece el - identificador de la cola a usar para comunicarse con el otro proceso - (`test_ipout`) para hacer forwarding, que será queue_id + 1 (default - `DEV_DEFAULT_KEY` obtenido de `dev.h`) +Es decir, en una línea se pone la IP de destino y en la línea siguiente el +mensaje. Para enviar otro mensaje, nuevamente se pone IP de destino en una línea +y el mensaje en la siguiente. Diseño del trabajo @@ -115,8 +94,8 @@ RouteTable Encapsula una tabla de ruteo. Por falta de tiempo y simplicidad por ahora sólo soporta rutas a un sólo host (no a una red) pero es muy fácilmente extensible y transparente para el resto de las clases que la usan. Las rutas se componen - de red (en realidad por ahora host), geteway, metrica y dispositivo de red por - el cual salir (Dev). + de red (en realidad por ahora host), geteway, MTU, metrica y dispositivo de + red por el cual salir (Dev). IPIn Es la clase encargada de recibir paquetes IP. Hace chequeos varios y descarta @@ -125,6 +104,7 @@ IPIn * Cabecera incompleta o no es IP * Versión IP incorrecta * Mal checksum + * TTL=0 * No es para nosotros y no hacemos forward * Es para nosotros pero somos un router @@ -148,160 +128,66 @@ Host 10.10.10.1 Rutas: -* 10.10.10.1 0.0.0.0 0 -* 10.10.10.3 10.10.10.5 0 -* 10.10.10.5 0.0.0.0 0 +* 10.10.10.1 0.0.0.0 35 0 +* 10.10.10.3 10.10.10.5 35 1 +* 10.10.10.5 0.0.0.0 35 0 Envía "adios mundo cruel!!!" al host 10.10.10.3:: - $ ./test_ipout 10.10.10.1 10.10.10.3 25 ../rutas_ejemplo/route_10.10.10.1.txt - Se agregó tabla para 10.10.10.1: gw = 0.0.0.0, metric = 0 - Se agregó tabla para 10.10.10.2: gw = 0.0.0.0, metric = 0 - Se agregó tabla para 10.10.10.3: gw = 10.10.10.5, metric = 0 - Se agregó tabla para 10.10.10.5: gw = 0.0.0.0, metric = 0 - adios mundo cruel!!! - IPOut::send: Fragmento 0 => IPHeader: version= total_len=40 id=56121 DF=0 MF=1 offset=0 TTL=64 proto=0 checksum=196 src=10.10.10.1 dst=10.10.10.3 - data (5) = adios - Dev::transmit(msgtype/mac = 168430085, size = 25) - IPOut::send: Fragmento 0 => IPHeader: version= total_len=35 id=56121 DF=0 MF=1 offset=5 TTL=64 proto=0 checksum=231 src=10.10.10.1 dst=10.10.10.3 - data (5) = mund - Dev::transmit(msgtype/mac = 168430085, size = 25) - IPOut::send: Fragmento 0 => IPHeader: version= total_len=30 id=56121 DF=0 MF=1 offset=10 TTL=64 proto=0 checksum=266 src=10.10.10.1 dst=10.10.10.3 - data (5) = o cru - Dev::transmit(msgtype/mac = 168430085, size = 25) - IPOut::send: Fragmento 0 => IPHeader: version= total_len=25 id=56121 DF=0 MF=0 offset=15 TTL=64 proto=0 checksum=297 src=10.10.10.1 dst=10.10.10.3 + $ (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 + 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 + data (15) = Adios mundo cru + 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 data (5) = el!!! - Dev::transmit(msgtype/mac = 168430085, size = 25) - Enviado 'adios mundo cruel!!!' a 10.10.10.3 + Enviado 'Adios mundo cruel!!!' a 10.10.10.3 -El proceso test_ipin de este host no tiene relevancia. Router 10.10.10.5 ----------------- Rutas: -* 10.10.10.1 0.0.0.0 0 -* 10.10.10.3 0.0.0.0 0 -* 10.10.10.5 0.0.0.0 0 +* 10.10.10.1 0.0.0.0 35 0 +* 10.10.10.3 0.0.0.0 32 0 +* 10.10.10.5 0.0.0.0 35 0 Recibe el mensaje:: - $ ./test_ipin 10.10.10.5 25 1 1 - Quedan 4 mensajes en la cola - Dev::receive(msgtype/mac = 168430085, size = 25) - IPIn::recv: IPHeader: version= total_len=40 id=56121 DF=0 MF=1 offset=0 TTL=64 proto=0 checksum=196 src=10.10.10.1 dst=10.10.10.3 - data (5) = adios - Dev::transmit(msgtype/mac = 168430085, size = 25) - Dev::receive(msgtype/mac = 168430085, size = 25) - IPIn::recv: IPHeader: version= total_len=35 id=56121 DF=0 MF=1 offset=5 TTL=64 proto=0 checksum=231 src=10.10.10.1 dst=10.10.10.3 - data (5) = mund - Dev::transmit(msgtype/mac = 168430085, size = 25) - Dev::receive(msgtype/mac = 168430085, size = 25) - IPIn::recv: IPHeader: version= total_len=30 id=56121 DF=0 MF=1 offset=10 TTL=64 proto=0 checksum=266 src=10.10.10.1 dst=10.10.10.3 - data (5) = o cru - Dev::transmit(msgtype/mac = 168430085, size = 25) - Dev::receive(msgtype/mac = 168430085, size = 25) - IPIn::recv: IPHeader: version= total_len=25 id=56121 DF=0 MF=0 offset=15 TTL=64 proto=0 checksum=297 src=10.10.10.1 dst=10.10.10.3 + $ ./ip 10.10.10.5 1 1 ../rutas_ejemplo/route_10.10.10.5.txt + 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 + data (15) = Adios mundo cru + 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 data (5) = el!!! - Dev::transmit(msgtype/mac = 168430085, size = 25) - -Y lo forwardea (refragmentando porque tiene un MTU más pequeño):: - - $ ./test_ipout 10.10.10.5 10.10.10.1 23 ../rutas_ejemplo/route_10.10.10.5.txt - Se agregó tabla para 10.10.10.1: gw = 0.0.0.0, metric = 0 - Se agregó tabla para 10.10.10.2: gw = 0.0.0.0, metric = 0 - Se agregó tabla para 10.10.10.3: gw = 0.0.0.0, metric = 0 - Se agregó tabla para 10.10.10.5: gw = 0.0.0.0, metric = 0 - a - IPOut::send: Fragmento 0 => IPHeader: version= total_len=21 id=56140 DF=0 MF=0 offset=0 TTL=64 proto=0 checksum=194 src=10.10.10.5 dst=10.10.10.1 - data (1) = a - Dev::transmit(msgtype/mac = 168430081, size = 21) - Enviado 'a' a 10.10.10.1 - a - Dev::receive(msgtype/mac = 168430085, size = 25) - IPOut::send: A forwardear - IPOut::send: Fragmento 0 => IPHeader: version= total_len=40 id=56121 DF=0 MF=1 offset=0 TTL=64 proto=0 checksum=196 src=10.10.10.1 dst=10.10.10.3 - data (3) = adi - Dev::transmit(msgtype/mac = 168430083, size = 23) - IPOut::send: Fragmento 0 => IPHeader: version= total_len=37 id=56121 DF=0 MF=1 offset=3 TTL=64 proto=0 checksum=217 src=10.10.10.1 dst=10.10.10.3 - data (2) = os - Dev::transmit(msgtype/mac = 168430083, size = 22) - Dev::receive(msgtype/mac = 168430085, size = 25) - IPOut::send: A forwardear - IPOut::send: Fragmento 0 => IPHeader: version= total_len=35 id=56121 DF=0 MF=1 offset=5 TTL=64 proto=0 checksum=231 src=10.10.10.1 dst=10.10.10.3 - data (3) = mu - Dev::transmit(msgtype/mac = 168430083, size = 23) - IPOut::send: Fragmento 0 => IPHeader: version= total_len=32 id=56121 DF=0 MF=1 offset=8 TTL=64 proto=0 checksum=252 src=10.10.10.1 dst=10.10.10.3 - data (2) = nd - Dev::transmit(msgtype/mac = 168430083, size = 22) - Dev::receive(msgtype/mac = 168430085, size = 25) - IPOut::send: A forwardear - IPOut::send: Fragmento 0 => IPHeader: version= total_len=30 id=56121 DF=0 MF=1 offset=10 TTL=64 proto=0 checksum=266 src=10.10.10.1 dst=10.10.10.3 - data (3) = o c - Dev::transmit(msgtype/mac = 168430083, size = 23) - IPOut::send: Fragmento 0 => IPHeader: version= total_len=27 id=56121 DF=0 MF=1 offset=13 TTL=64 proto=0 checksum=287 src=10.10.10.1 dst=10.10.10.3 - data (2) = ru - Dev::transmit(msgtype/mac = 168430083, size = 22) - Dev::receive(msgtype/mac = 168430085, size = 25) - IPOut::send: A forwardear - IPOut::send: Fragmento 0 => IPHeader: version= total_len=25 id=56121 DF=0 MF=1 offset=15 TTL=64 proto=0 checksum=301 src=10.10.10.1 dst=10.10.10.3 - data (3) = el! - Dev::transmit(msgtype/mac = 168430083, size = 23) - IPOut::send: Fragmento 0 => IPHeader: version= total_len=22 id=56121 DF=0 MF=0 offset=18 TTL=64 proto=0 checksum=62 src=10.10.10.1 dst=10.10.10.3 - data (2) = !! - Dev::transmit(msgtype/mac = 168430083, size = 22) - IPOut::send: Fragmento 0 => IPHeader: version= total_len=21 id=56147 DF=0 MF=0 offset=0 TTL=64 proto=0 checksum=201 src=10.10.10.5 dst=10.10.10.1 - data (1) = a - Dev::transmit(msgtype/mac = 168430081, size = 21) - Enviado 'a' a 10.10.10.1 - -(notar que para que haga el forwarding se tuvo que enviar un paquete -*dummy* para que busque en la cola de paquetes a forwardear (es un error -de diseño que tendré que corregir de alguna forma) + IPOut::forward_loop (10.10.10.5): A forwardear (id 44919) + 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 + data (12) = Adios mundo + 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 + data (3) = cru + IPOut::forward_loop (10.10.10.5): A forwardear (id 44919) + 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 + data (5) = el!!! + Host 10.10.10.3 --------------- Rutas: -* 10.10.10.1 10.10.10.5 0 -* 10.10.10.3 0.0.0.0 0 -* 10.10.10.5 0.0.0.0 0 +* 10.10.10.1 10.10.10.5 32 1 +* 10.10.10.3 0.0.0.0 32 0 +* 10.10.10.5 0.0.0.0 32 0 Finalmente este host recibe todos los fragmentos, reensabla y pasa el paquete completo a la capa superior:: - $ ./test_ipin 10.10.10.3 23 - Quedan 8 mensajes en la cola - Dev::receive(msgtype/mac = 168430083, size = 23) - IPIn::recv: IPHeader: version= total_len=40 id=56121 DF=0 MF=1 offset=0 TTL=64 proto=0 checksum=196 src=10.10.10.1 dst=10.10.10.3 - data (3) = adi - Dev::receive(msgtype/mac = 168430083, size = 22) - IPIn::recv: IPHeader: version= total_len=37 id=56121 DF=0 MF=1 offset=3 TTL=64 proto=0 checksum=217 src=10.10.10.1 dst=10.10.10.3 - data (2) = os - Dev::receive(msgtype/mac = 168430083, size = 23) - IPIn::recv: IPHeader: version= total_len=35 id=56121 DF=0 MF=1 offset=5 TTL=64 proto=0 checksum=231 src=10.10.10.1 dst=10.10.10.3 - data (3) = mu - Dev::receive(msgtype/mac = 168430083, size = 22) - IPIn::recv: IPHeader: version= total_len=32 id=56121 DF=0 MF=1 offset=8 TTL=64 proto=0 checksum=252 src=10.10.10.1 dst=10.10.10.3 - data (2) = nd - Dev::receive(msgtype/mac = 168430083, size = 23) - IPIn::recv: IPHeader: version= total_len=30 id=56121 DF=0 MF=1 offset=10 TTL=64 proto=0 checksum=266 src=10.10.10.1 dst=10.10.10.3 - data (3) = o c - Dev::receive(msgtype/mac = 168430083, size = 22) - IPIn::recv: IPHeader: version= total_len=27 id=56121 DF=0 MF=1 offset=13 TTL=64 proto=0 checksum=287 src=10.10.10.1 dst=10.10.10.3 - data (2) = ru - Dev::receive(msgtype/mac = 168430083, size = 23) - IPIn::recv: IPHeader: version= total_len=25 id=56121 DF=0 MF=1 offset=15 TTL=64 proto=0 checksum=301 src=10.10.10.1 dst=10.10.10.3 - data (3) = el! - Dev::receive(msgtype/mac = 168430083, size = 22) - IPIn::recv: IPHeader: version= total_len=22 id=56121 DF=0 MF=0 offset=18 TTL=64 proto=0 checksum=62 src=10.10.10.1 dst=10.10.10.3 - data (2) = !! - IPIn::recv: Paquete completo: data = 'adios mundo cruel!!!' - Recibido 'adios mundo cruel!!!' (len 20) de 10.10.10.1 para 10.10.10.3 (proto = 0) - -El proceso test_ipout de este host no tiene relevancia. - + $ ./ip 10.10.10.3 0 0 ../rutas_ejemplo/route_10.10.10.3.txt + 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 + data (12) = Adios mundo + 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 + data (3) = cru + 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 + data (5) = el!!! + IPIn::recv (10.10.10.3): Paquete completo: data = 'Adios mundo cruel!!!' + Recibido 'Adios mundo cruel!!!' (len 20) de 10.10.10.1 para 10.10.10.3 (proto = 0) .. vim: filetype=rst :