]> git.llucax.com Git - z.facultad/75.74/practicos.git/commitdiff
Actualizo documentación
authorLeandro Lucarella <llucax@gmail.com>
Fri, 23 Jun 2006 20:03:51 +0000 (20:03 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Fri, 23 Jun 2006 20:03:51 +0000 (20:03 +0000)
practicas/pipi/README
practicas/pipi/TODO
practicas/pipi/informe.rtf [new file with mode: 0644]

index cca4337c9d126d9af9fbc06fe4fc1a651f875f28..cc25153e9674d3e99635878db0a3182c13ec0927 100644 (file)
@@ -2,9 +2,9 @@
 Sistemas Distribuidos I (75.74)
 ===============================
 
-----------------------------
-Trabajo práctico de stack IP
-----------------------------
+------------------------------------------------------------------
+TP 2: Sistema de resolución de nombres sobre IP adaptado a sockets
+------------------------------------------------------------------
 
 :Author: Leandro Lucarella (77891)
 
@@ -14,18 +14,23 @@ 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.
+rutas de ejemplo para correr los programas. En el directorio `zonas_ejemplo` se
+encuentran archivos de configuración de zonas de dominios de nombre para
+realizar pruebas.
 
 
 Uso
 ===
 
-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
+El trabajo consta de dos programas, uno llamado `ip` y otro `dns` (más algunas
+otras pruebas que no tienen relevancia).
+
+ip
+--
+
+El programa `ip` corre 3 procesos (fork(2)eados), 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.
 
@@ -58,7 +63,7 @@ proto
   Protocolo que transporta (default 0)
 
 
-El programa se queda esperando la entrada del usuario, y sale cuando está se
+El programa se queda esperando la entrada del usuario, y sale cuando esta se
 termina (Ctrl-D). El formato de entrada es::
 
   IP DESTINO
@@ -68,6 +73,46 @@ 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.
 
+dns
+---
+
+El programa `dns` corre también 3 procesos (fork(2)eados), uno que recibe
+peticiones de nombres, otro que recibe entrada del usuario y envía peticiones
+(o mejor dicho encola peticiones para ser enviadas) y otro que realiza el envío
+de las peticiones realmente.
+
+Uso::
+
+  ./dns ip [route_file [zone_file [port]]]
+
+ip
+  IP que utiliza este proceso (ídem programa `ip`)
+
+route_file
+  Archivo con las rutas (ídem programa `ip`)
+
+zone_file
+  Archivo con la descripción de las zonas. El formato es muy simple. Cada zona
+  está separada por un renglón en blanco y empieza con una línea con 3 campos
+  separados por espacios o tab: nombre de la zona, TTL y nodo padre. Luego le
+  sigue la lista de registros de esa zona, también con 3 campos por renglón:
+  nombre, tipo de registro (A para indicar una IP, NS para indicar donde buscar
+  registros de una zona con ese nombre) e IP (ya sea la IP definitiva si es A o
+  la IP del nameserver al cual recurrir si es NS). Se pueden ver ejemplos de
+  estos archivos en el disco entregado.
+
+port
+  Puerto en el cual escuchará la abstracción de capa física sobre TCP.
+
+
+El programa es muy similar a `ip`, se queda esperando la entrada del usuario,
+y sale cuando esta se termina (Ctrl-D). El formato de entrada es::
+
+  HOSTNAME_A_BUSCAR
+
+Es decir, se escribe en una línea el nombre del host del cual se quiera obtener
+la IP y se presiona ENTER.
+
 
 Diseño del trabajo
 ==================
@@ -76,11 +121,21 @@ El trabajo fue desarrollado en C++, orientado a objetos. Se compone de las
 siguientes clases:
 
 Dev
-  Encapsula la capa física y el dispositivo de red. Utiliza una cola como medio
-  físico y el id representaría el cable (si 2 dispositivos tienen cola con id
-  distinto serían como si no compartieran el mismo cable). Por simplicidad a la
-  cola siempre se envía el tamaño del MTU completo pero se agrega una cabecera
-  con el tamaño real del frame.
+  Encapsula la capa física y el dispositivo de red. Es una interfaz abstracta.
+
+DevQue
+  Implementación de Dev utilizando una cola como medio físico y el id
+  representaría el cable (si 2 dispositivos tienen cola con id distinto serían
+  como si no compartieran el mismo cable). Por simplicidad a la cola siempre
+  se envía el tamaño del MTU completo pero se agrega una cabecera con el
+  tamaño real del frame.
+
+DevTCP
+  Implementación de Dev utilizando conexiones TCP. Por cada frame saliente a un
+  destino en particular se crea una conexión TCP (a menos que ya esté creada, en
+  cuyo caso se reutiliza) y se escucha por conexiones entrantes para recibir
+  frames (también guardándolas para reutilizarlas). A diferencia del DevQue se
+  envía el tamaño del frame exacto (en realidad se agrega una pequeña cabecera).
 
 IPAddr
   Clase auxiliar que encapsula una dirección IP.
@@ -119,75 +174,178 @@ IPOut
   * No existe una ruta para el destino
   * Tamaño de paquete más grande que MTU y DF=1
 
+libtcp
+  Es el único componente del TP que no es orientado a objetos ya que se
+  reutilizó de trabajos anteriores. Es una pequeña abstracción sobre la API de
+  sockets de BSD para mayor simplicidad.
 
-Ejemplo de corrida
-==================
-
-Host 10.10.10.1
----------------
-
-Rutas:
-
-* 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::
-
-  $ (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!!!
-  Enviado 'Adios mundo cruel!!!' a 10.10.10.3
-
-
-Router 10.10.10.5
------------------
+ResolvProtoRequest
+  Clase que encapsula una petición de resolución de nombre a enviar via IP.
 
-Rutas:
+ResolvProtoResponse
+  Clase que encapsula una respuesta de resolución de nombre a enviar via IP.
 
-* 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
+NameServer
+  Clase encargada de resolver los nombres. Escucha por peticiones y puede
+  resolverlas recursiva o directamente (según venga de otro NameServer o de un
+  Resolver la petición). Esta clase se compone de varias otras clases auxiliares
+  para almacenar las zonas y el cache.
 
-Recibe el mensaje::
 
-  $ ./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!!!
-  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  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::
-
-  $ ./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)
+Ejemplo de corrida
+==================
 
-.. vim: filetype=rst :
+Archivo de configuración de zonas de 10.10.10.2::
+
+  homero.casa  600     10.10.10.1
+  tito A       10.10.100.1
+  juan A       10.10.100.2
+  juan A       10.10.100.3
+  pepe A       10.10.100.4
+  juan A       10.10.100.5
+  pepe A       10.10.100.6
+  marge        NS      10.10.10.3
+  todos        NS      10.10.10.1
+  todos        NS      10.10.10.3
+  todos        NS      10.10.10.141
+
+Línea de comandos::
+
+  ./dns 10.10.10.2 ../rutas_ejemplo/mi_lan.txt ../zonas_ejemplo/10.10.10.2.txt
+
+Resolución de un nombre local con una sola IP
+---------------------------------------------
+
+Línea de comandos::
+
+  ./dns 10.10.10.2 ../rutas_ejemplo/mi_lan.txt ../zonas_ejemplo/10.10.10.2.txt
+
+Salida::
+
+  tito.homero.casa
+  Resolviendo tito.homero.casa...
+  resolv_direct -> tratando de resolver: tito.homero.casa
+  resolv_direct found (local/hijo): ResolvProtoResponse(ret=2, ttl=600, 10.10.100.1)
+  resolv_recursive -> gotcha! ResolvProtoResponse(ret=2, ttl=600, 10.10.100.1)
+  Resultado: ResolvProtoResponse(ret=2, ttl=600, 10.10.100.1)
+
+Resolución de un nombre local con múltiples IP
+----------------------------------------------
+
+Salida::
+
+  juan.homero.casa
+  Resolviendo juan.homero.casa...
+  resolv_direct -> tratando de resolver: juan.homero.casa
+  resolv_direct found (local/hijo): ResolvProtoResponse(ret=2, ttl=600, 10.10.100.2, 10.10.100.3, 10.10.100.5)
+  resolv_recursive -> gotcha! ResolvProtoResponse(ret=2, ttl=600, 10.10.100.2, 10.10.100.3, 10.10.100.5)
+  Resultado: ResolvProtoResponse(ret=2, ttl=600, 10.10.100.2, 10.10.100.3, 10.10.100.5)
+
+Resolución de un nombre local no existente
+------------------------------------------
+
+Salida::
+
+  none.homero.casa
+  Resolviendo none.homero.casa...
+  resolv_direct -> tratando de resolver: none.homero.casa
+  resolv_direct NOT FOUND (es local pero no existe)
+  Resultado: ResolvProtoResponse(ret=4, ttl=0)
+
+Resolución de un nombre remoto con múltiples IP y 2 niveles de indirección
+--------------------------------------------------------------------------
+
+Archivo de configuración de zonas de 10.10.10.1::
+
+  casa  600 0.0.0.0
+  burns A 10.10.10.1
+  homero  A 10.10.10.2
+  marge A 10.10.10.3
+  manuk A 10.10.10.141
+  juan  A 100.10.100.5
+  pepe  A 100.10.100.6
+  homero  NS  10.10.10.2
+  marge NS  10.10.10.3
+  manuk NS  10.10.10.141
+
+  burns.casa  600 0.0.0.0
+  tito  A 100.10.100.1
+  juan  A 100.10.100.2
+  juan  A 100.10.100.3
+  pepe  A 100.10.100.4
+  juan  A 100.10.100.5
+  pepe  A 100.10.100.6
+
+  todos.homero.casa 9500  0.0.0.0
+  tito  A 10.1.100.1
+  juan  A 10.1.100.2
+  juan  A 10.1.100.3
+  pepe  A 10.1.100.4
+  juan  A 10.1.100.5
+  pepe  A 10.1.100.6
+
+Archivo de configuración de zonas de 10.10.10.3::
+
+  marge.casa  600 10.10.10.1
+  tito  A 30.10.100.1
+  juan  A 30.10.100.2
+  juan  A 30.10.100.3
+  pepe  A 30.10.100.4
+  juan  A 30.10.100.5
+  pepe  A 30.10.100.6
+  manuk NS  10.10.10.141
+  todos NS  10.10.10.1
+  todos NS  10.10.10.3
+  todos NS  10.10.10.141
+
+  todos.homero.casa 9500  10.10.10.2
+  tito  A 10.1.100.1
+  juan  A 10.1.100.2
+  juan  A 10.1.100.3
+  pepe  A 10.1.100.4
+  juan  A 10.1.100.5
+  pepe  A 10.1.100.6
+
+  marge.homero.casa 9500  10.10.10.2
+  tito  A 10.3.100.1
+  juan  A 10.3.100.2
+  juan  A 10.3.100.3
+  pepe  A 10.3.100.4
+  juan  A 10.3.100.5
+  pepe  A 10.3.100.6
+
+
+La petición se realiza desde 10.10.10.2, quien debe recurir a su nodo padre
+(10.10.10.1) que indica que el encargado de resolver esa zona es 10.10.10.3.
+
+Salida de 10.10.10.2::
+
+  pepe.marge.casa
+  Resolviendo pepe.marge.casa...
+  resolv_direct -> tratando de resolver: pepe.marge.casa
+  resolv_direct -> evaluando padre 10.10.10.1
+  resolv_direct found (al padre): 10.10.10.1
+  resolv_recursive -> redirect a ResolvProtoResponse(ret=3, ttl=600, 10.10.10.1)
+  query -> pidiendo ResolvProtoRequest(query_type=0, name=pepe.marge.casa) a 10.10.10.1
+  query -> recibido ResolvProtoResponse(ret=3, ttl=600, 10.10.10.3) de 10.10.10.1
+  resolv_recursive_r -> redirect a ResolvProtoResponse(ret=3, ttl=600, 10.10.10.3)
+  query -> pidiendo ResolvProtoRequest(query_type=0, name=pepe.marge.casa) a 10.10.10.3
+  query -> recibido ResolvProtoResponse(ret=2, ttl=600, 30.10.100.4, 30.10.100.6) de 10.10.10.3
+  resolv_recursive_r -> gotcha! ResolvProtoResponse(ret=2, ttl=600, 30.10.100.4, 30.10.100.6)
+  Resultado: ResolvProtoResponse(ret=2, ttl=600, 30.10.100.4, 30.10.100.6)
+
+Salida de 10.10.10.1::
+
+  NameServer::send_loop() -> recibido ResolvProtoRequest(query_type=0, name=pepe.marge.casa)
+  resolv_direct -> tratando de resolver: pepe.marge.casa
+  resolv_direct found (local/hijo): ResolvProtoResponse(ret=3, ttl=600, 10.10.10.3)
+  NameServer::send_loop() -> respondo ResolvProtoResponse(ret=3, ttl=600, 10.10.10.3)
+
+Salida de 10.10.10.3::
+
+  NameServer::send_loop() -> recibido ResolvProtoRequest(query_type=0, name=pepe.marge.casa)
+  resolv_direct -> tratando de resolver: pepe.marge.casa
+  resolv_direct found (local/hijo): ResolvProtoResponse(ret=2, ttl=600, 30.10.100.4, 30.10.100.6)
+  NameServer::send_loop() -> respondo ResolvProtoResponse(ret=2, ttl=600, 30.10.100.4, 30.10.100.6)
+
+.. vim: filetype=rst sw=2 sts=2 et :
index e2ebac891bfa6f03bbe0dbbf04969e3eaddc73c5..62cecf17ee05e9d31d219caf28b6e3f662784bc6 100644 (file)
@@ -1,6 +1,24 @@
+IP:
+===
 - Implementar metricas
-- Implementar rutas de redes completas
+- Implementar rutas de redes completas (no sólo ruta a un host)
 - Arreglar cola de forwarding para que no dependa del medio fisico/dispositivo
 - Tener en cuenta el TTL para limpiar buffers
 - Ver que hayan llegado todos los fragmentos antes de subir a capa superior
-- Separar descartes de ICMP de silenciosos
+- Separar descartes de ICMP de silenciosos (parcialmente hecho)
+- Manejar envíos a través de una cola para que no se rompa (como creo que
+  debería romperse, por ser 2 procesos distintos los que mandan y no comparten
+  el pool de conexiones TCP) el forwarding.
+
+DevTCP:
+=======
+- Controlar pérdidas de conexiones.
+
+DNS:
+====
+- Agregar entradas al cache y revisar la edad del cache antes de usarlo (y
+  limpiarlo si es viejo).
+- Resolver el problema de requests/responses simultáneos de distintos lugares
+  (probablemente haya que agregar un ID al protocolo para identificar distintas
+  respuestas).
+- Resolver (!)
diff --git a/practicas/pipi/informe.rtf b/practicas/pipi/informe.rtf
new file mode 100644 (file)
index 0000000..eebe262
--- /dev/null
@@ -0,0 +1,113 @@
+{\rtf1\ansi\ansicpg1252\deff0
+{\fonttbl
+{\f0\fnil\fcharset0\fprq0\fttruetype Arial;}
+{\f1\fnil\fcharset0\fprq0\fttruetype Times New Roman;}
+{\f2\fnil\fcharset0\fprq0\fttruetype Courier New;}
+{\f3\fnil\fcharset0\fprq0\fttruetype Dingbats;}
+{\f4\fnil\fcharset0\fprq0\fttruetype Symbol;}}
+{\colortbl
+\red0\green0\blue0;
+\red255\green255\blue255;}
+{\stylesheet
+{\s1\fi-431\li720\sbasedon28\snext28Contents 1;}
+{\s2\fi-431\li1440\sbasedon28\snext28Contents 2;}
+{\s3\fi-431\li2160\sbasedon28\snext28Contents 3;}
+{\s8\fi-431\li720\sbasedon28Lower Roman List;}
+{\s5\tx431\sbasedon24\snext28Numbered Heading 1;}
+{\s6\tx431\sbasedon25\snext28Numbered Heading 2;}
+{\s7\fi-431\li720Square List;}
+{\*\cs11\sbasedon28Endnote Text;}
+{\s4\fi-431\li2880\sbasedon28\snext28Contents 4;}
+{\s9\fi-431\li720Diamond List;}
+{\s10\fi-431\li720Numbered List;}
+{\*\cs12\fs20\superEndnote Reference;}
+{\s13\fi-431\li720Triangle List;}
+{\s14\tx431\sbasedon26\snext28Numbered Heading 3;}
+{\s15\fi-431\li720Dashed List;}
+{\s16\fi-431\li720\sbasedon10Upper Roman List;}
+{\s17\sb440\sa60\f0\fs24\b\sbasedon28\snext28Heading 4;}
+{\s18\fi-431\li720Heart List;}
+{\s34\fi-431\li720Box List;}
+{\s20\fi-431\li720\sbasedon10Upper Case List;}
+{\s21\fi-431\li720Bullet List;}
+{\s22\fi-431\li720Hand List;}
+{\*\cs23\fs20\sbasedon28Footnote Text;}
+{\s24\sb440\sa60\f0\fs34\b\sbasedon28\snext28Heading 1;}
+{\s25\sb440\sa60\f0\fs28\b\sbasedon28\snext28Heading 2;}
+{\s19\qc\sb240\sa120\f0\fs32\b\sbasedon28\snext28Contents Header;}
+{\s27\fi-431\li720Tick List;}
+{\s26\sb440\sa60\f0\fs24\b\sbasedon28\snext28Heading 3;}
+{\s29\fi-431\li720\sbasedon10Lower Case List;}
+{\s30\li1440\ri1440\sa120\sbasedon28Block Text;}
+{\s36\f2\sbasedon28Plain Text;}
+{\s32\tx1584\sbasedon5\snext28Section Heading;}
+{\s33\fi-431\li720Implies List;}
+{\s28\f1\fs24\lang1034Normal;}
+{\s35\fi-431\li720Star List;}
+{\*\cs31\fs20\superFootnote Reference;}
+{\s37\tx1584\sbasedon5\snext28Chapter Heading;}}
+\kerning0\cf0\ftnbj\fet2\ftnstart1\ftnnar\aftnnar\ftnstart1\aftnstart1\aenddoc\revprop3{\info\uc1}\deftab720\viewkind1\paperw11905\paperh16837\margl1440\margr1440\widowctl
+\sectd\sbknone\colsx360\pgncont\ltrsect
+\pard\plain\ltrpar\qc\s28\itap0{\s28\f0\fs52\b\lang1034{\*\listtag0}\abinodiroverride\ltrch Sistemas Distribuidos I (75.74)}{\s28\f1\fs24\lang1034{\*\listtag1003}\par}
+\pard\plain\ltrpar\qc\s28\itap0{\s28\f0\fs28\lang1034{\*\listtag0}\abinodiroverride\ltrch TP 2: Sistema de resoluci\'f3n de nombres sobre IP adaptado a sockets}{\s28\f0\fs28\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\qc\s28\itap0{\field\fdledit{\*\fldinst {\ TOC }}}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f1\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\sb440\sa60\s24\itap0{\s24\f0\fs34\b\lang1034{\*\listtag0}\abinodiroverride\ltrch DNS}{\s24\f0\fs34\b\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\sb440\sa60\s25\itap0{\s25\f0\fs28\b\lang1034{\*\listtag0}\abinodiroverride\ltrch Diagrama de secuencia}{\s25\f0\fs28\b\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f1\fs24\lang1034{\*\listtag0}\abinodiroverride\ltrch \page }{\s28\f1\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\sb440\sa60\s25\itap0{\s25\f0\fs28\b\lang1034{\*\listtag0}\abinodiroverride\ltrch Dise\'f1o de mensajes de intercambio de DNS.}{\s25\f0\fs28\b\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f1\fs24\lang1034{\*\listtag0}\abinodiroverride\ltrch Petici\'f3n de un nameserver}{\s28\f1\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs22\lang1034{\*\listtag0}\abinodiroverride\ltrch +------------+------------+------------+}{\s28\f2\fs22\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs22\lang1034{\*\listtag0}\abinodiroverride\ltrch | QUERY_TYPE |    SIZE    |    NAME    |}{\s28\f2\fs22\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs22\lang1034{\*\listtag0}\abinodiroverride\ltrch +------------+------------+------------+}{\s28\f2\fs22\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs22\lang1034{\*\listtag0}\abinodiroverride\ltrch /-- 1 byte --/- 2 bytes --/- variable -/}{\s28\f2\fs22\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f1\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f1\fs24\lang1034{\*\listtag0}\abinodiroverride\ltrch QUERY_TYPE en realidad es una cabecera com\'fan a las peticiones y respuestas, cuyos c\'f3digos pueden ser los siguientes:}{\s28\f1\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs22\b\lang1034{\*\listtag0}\abinodiroverride\ltrch Requests}{\s28\f2\fs22\b\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs22\lang1034{\*\listtag0}\abinodiroverride\ltrch RP_REQ_DIRECT   -> B\'fasqueda directa (inter nameservers)}{\s28\f2\fs22\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs22\lang1034{\*\listtag0}\abinodiroverride\ltrch RP_REQ_RECURSIVE-> B\'fasqueda recursiva (para resolvers)}{\s28\f2\fs22\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs22\b\lang1034{\*\listtag0}\abinodiroverride\ltrch Responses}{\s28\f2\fs22\b\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs22\lang1034{\*\listtag0}\abinodiroverride\ltrch RP_RES_A        -> OK, se devolvi\'f3 un registro A}{\s28\f2\fs22\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs22\lang1034{\*\listtag0}\abinodiroverride\ltrch RP_RES_NS       -> OK, se devolvi\'f3 un registro NS (s\'f3lo en directo)}{\s28\f2\fs22\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs22\lang1034{\*\listtag0}\abinodiroverride\ltrch RP_RES_NOTFOUND -> No se encontr\'f3}{\s28\f2\fs22\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs22\lang1034{\*\listtag0}\abinodiroverride\ltrch RP_RES_TIMEOUT  -> Tard\'f3 demasiado la consulta}{\s28\f2\fs22\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f1\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f1\fs24\lang1034{\*\listtag0}\abinodiroverride\ltrch SIZE es el tama\'f1o del string con el nombre a buscar, NAME es el string (de longitud variable). Faltar\'eda agregar un campo con un ID para evitar que se confundan unas respuestas o peticiones con otras.}{\s28\f1\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f1\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f1\fs24\lang1034{\*\listtag0}\abinodiroverride\ltrch Respuesta de un nameserver}{\s28\f1\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs20\lang1034{\*\listtag0}\abinodiroverride\ltrch +-----------+-----------+-----------+-----------+-----------+-----------+}{\s28\f2\fs20\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs20\lang1034{\*\listtag0}\abinodiroverride\ltrch |    RET    |    TTL    |   COUNT   |    IP 1   |    ...    |    IP N   |}{\s28\f2\fs20\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs20\lang1034{\*\listtag0}\abinodiroverride\ltrch +-----------+-----------+-----------+-----------+-----------+-----------+}{\s28\f2\fs20\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs20\lang1034{\*\listtag0}\abinodiroverride\ltrch /-- 1 byte -/- 4 bytes -/-- 1 byte -/- 4 bytes -/- 4 bytes -/- 4 bytes -/}{\s28\f2\fs20\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f1\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f1\fs24\lang1034{\*\listtag0}\abinodiroverride\ltrch RET es del mismo tipo que QUERY_TYPE y se hizo as\'ed para poder reconocer si un paquete es un request o un response con s\'f3lo leer el 1er byte. TTL es el tiempo que puede vivir en el cache (en segundos), COUNT es la cantidad de IPs encontradas para ese registro e IP1 a IPN son las IP en s\'ed (cantidad variable).}{\s28\f1\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\sb440\sa60\s25\itap0{\s25\f0\fs28\b\lang1034{\*\listtag0}\abinodiroverride\ltrch Par\'e1metros y resultados de la funci\'f3n gethostbyname()}{\s25\f0\fs28\b\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs20\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs20\lang1034{\*\listtag0}\abinodiroverride\ltrch std::vector< IPAddr > gethostbyname(std::string name, int& result);}{\s28\f2\fs20\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs20\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f1\fs24\lang1034{\*\listtag0}\abinodiroverride\ltrch Esta funci\'f3n toma como par\'e1metro un string con el nombre de dominio a buscar (por ejemplo "mi.dominio.casa") y retorna un vector de IPs. Si hay un error o no encuentra ninguna el vector se devuelve vac\'edo y se pone el c\'f3digo de error en la variable result. El trabajo de la funci\'f3n es conectarse a todos los nameservers que conozca y env\'ede un pedido de resoluci\'f3n de nombre RECURSIVO, hasta que tenga \'e9xito o se acabe la lista de nameservers disponibles. Por falta de tiempo esta funci\'f3n no est\'e1 implementada del lado del resolver pero s\'ed del nameserver, y es muy muy similar (hace exactamente lo mismo).}{\s28\f1\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\sb440\sa60\s24\itap0{\s24\f0\fs34\b\lang1034{\*\listtag0}\abinodiroverride\ltrch IP}{\s24\f0\fs34\b\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\sb440\sa60\s25\itap0{\s25\f0\fs28\b\lang1034{\*\listtag0}\abinodiroverride\ltrch Dise\'f1o del paquete IP}{\s25\f0\fs28\b\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f1\fs24\lang1034{\*\listtag0}\abinodiroverride\ltrch \page }{\s28\f1\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs24\lang1034{\*\listtag0}\abinodiroverride\ltrch     // Campos}{\s28\f2\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs24\lang1034{\*\listtag0}\abinodiroverride\ltrch     uint8_t version;}{\s28\f2\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs24\lang1034{\*\listtag0}\abinodiroverride\ltrch     uint16_t total_len;}{\s28\f2\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs24\lang1034{\*\listtag0}\abinodiroverride\ltrch     uint16_t id;}{\s28\f2\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs24\lang1034{\*\listtag0}\abinodiroverride\ltrch     uint16_t reserved_flag: 1;}{\s28\f2\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs24\lang1034{\*\listtag0}\abinodiroverride\ltrch     uint16_t df: 1;}{\s28\f2\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs24\lang1034{\*\listtag0}\abinodiroverride\ltrch     uint16_t mf: 1;}{\s28\f2\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs24\lang1034{\*\listtag0}\abinodiroverride\ltrch     uint16_t offset: 13;}{\s28\f2\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs24\lang1034{\*\listtag0}\abinodiroverride\ltrch     uint8_t ttl;}{\s28\f2\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs24\lang1034{\*\listtag0}\abinodiroverride\ltrch     uint8_t proto;}{\s28\f2\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs24\lang1034{\*\listtag0}\abinodiroverride\ltrch     uint16_t checksum;}{\s28\f2\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs24\lang1034{\*\listtag0}\abinodiroverride\ltrch     uint32_t src;}{\s28\f2\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f2\fs24\lang1034{\*\listtag0}\abinodiroverride\ltrch     uint32_t dst;}{\s28\f2\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f1\fs24\lang1034{\*\listtag0}\abinodiroverride\ltrch \page }{\s28\f1\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\sb440\sa60\s25\itap0{\s25\f0\fs28\b\lang1034{\*\listtag0}\abinodiroverride\ltrch Diagrama de secuencia}{\s25\f0\fs28\b\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f1\fs24\lang1034{\*\listtag0}\abinodiroverride\ltrch \page }{\s28\f1\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\sb440\sa60\s25\itap0{\s25\f0\fs28\b\lang1034{\*\listtag0}\abinodiroverride\ltrch Cambios}{\s25\f0\fs28\b\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f1\fs24\lang1034{\*\listtag0}\abinodiroverride\ltrch Se agreg\'f3 principalmente la clase DevTCP que implementa la capa f\'edsica a trav\'e9s de TCP.  Por cada frame saliente a un destino en particular se crea una conexi\'f3n TCP (a menos que ya est\'e9 creada, en cuyo caso se reutiliza) y se escucha por conexiones entrantes para recibir frames (tambi\'e9n guard\'e1ndolas para reutilizarlas). A diferencia del DevQue se env\'eda el tama\'f1o del frame exacto (en realidad se agrega una peque\'f1a cabecera).}{\s28\f1\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\sb440\sa60\s24\itap0{\s24\f0\fs34\b\lang1034{\*\listtag0}\abinodiroverride\ltrch Lista de fuentes de informaci\'f3n}{\s24\f0\fs34\b\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f1\fs24\lang1034{\*\listtag0}\abinodiroverride\ltrch RFC 1034 - Domain names - concepts and facilities:}{\s28\f1\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f1\fs24\lang1034{\*\listtag0}\abinodiroverride\ltrch \tab http://www.faqs.org/rfcs/rfc1034.html}{\s28\f1\fs24\lang1034{\*\listtag0}\par}
+\pard\plain\ltrpar\ql\s28\itap0{\s28\f1\fs24\lang1034{\*\listtag0}\abinodiroverride\ltrch \tab Conceptos y desiciones de dise\'f1o del DNS.}{\s28\f1\fs24\lang1034{\*\listtag0}\par}}
\ No newline at end of file