{"id":2037,"date":"2026-04-06T08:00:00","date_gmt":"2026-04-06T11:00:00","guid":{"rendered":"https:\/\/www.nerdadas.com\/blog\/?p=2037"},"modified":"2026-04-05T22:42:03","modified_gmt":"2026-04-06T01:42:03","slug":"dtn-comunicaciones-tolerantes-al-retardo","status":"publish","type":"post","link":"https:\/\/www.nerdadas.com\/blog\/dtn-comunicaciones-tolerantes-al-retardo\/","title":{"rendered":"DTN &#8211; Comunicaciones tolerantes al retardo"},"content":{"rendered":"\n<p>Con <strong>Artemis II\/Orion<\/strong> la Nasa est\u00e1 probando un nuevo sistema de comunicaciones para misiones en el espacio. (<a href=\"https:\/\/www.nasa.gov\/technology\/space-comms\/o2o\/\">https:\/\/www.nasa.gov\/technology\/space-comms\/o2o\/<\/a>), una comunicaci\u00f3n directa pero con algunas cuestiones t\u00e9cnicas interesantes para los que trabajamos en comunicaciones a diario. <\/p>\n\n\n\n<p>Este nuevo sistema consta de un laser y unos sistemas de gimbals muy complejos para apuntar a la nave con qui\u00e9n van a establecer la comunicaci\u00f3n, en este caso <strong>la c\u00e1psula Orion<\/strong>, ya que el punto \u00f3ptico del laser es muy peque\u00f1o.<\/p>\n\n\n\n<p>La idea es bastante sencilla,<strong>un laser apuntando a un sensor con un stack de protocolos propietarios. <\/strong>Esto ya exist\u00eda pero con <strong>RFs<\/strong>, la <strong><a href=\"https:\/\/www.nasa.gov\/communicating-with-missions\/dsn\/\">DSN<\/a><\/strong> o <strong><a href=\"https:\/\/es.wikipedia.org\/wiki\/Red_de_Espacio_Profundo_de_China\">CDSN<\/a><\/strong>(en el caso de china) es la Red del Espacio Profundo: <strong>Varias antenas en diferentes partes del planeta apuntando al espacio<\/strong> y emitiendo\/escuchando mensajes hacia los dispositivos al alcance.<\/p>\n\n\n\n<p><strong>Pero que pasa con aquellos que est\u00e1n m\u00e1s lejos o est\u00e1n en lugares con conexiones intermitentes?. Para eso existen las Redes con Tolerancia al Retardo<\/strong> y cambia todo lo que crees que sabes en comunicaciones.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Laboratorio para poner en contexto.<\/h2>\n\n\n\n<p>Para ponernos en contexto empiezo con un laboratorio sencillo. 2 Equipos linux conectados uno contra el otro. Netem y Server. <strong>Vamos a probar que sucede con los retardos en TCP\/IP<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/diagrama.png\"><img loading=\"lazy\" decoding=\"async\" width=\"697\" height=\"165\" src=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/diagrama.png\" alt=\"\" class=\"wp-image-2038\" srcset=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/diagrama.png 697w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/diagrama-300x71.png 300w\" sizes=\"auto, (max-width: 697px) 100vw, 697px\" \/><\/a><\/figure>\n\n\n\n<p><strong>Ambos debian 13. Vamos a instalar unas herramientas que seguro ya ten\u00e9s en tu equipo <\/strong>y probemos un poco que sucede con tcp\/ip en estos escenarios.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update &amp;&amp; sudo apt install iperf3 iproute2\n\n#Simular ida y vuelta\n#En NETEM:\ntc qdisc add dev eth0 root netem delay 300ms\n\n#En Server:\ntc qdisc add dev eth0 root netem delay 300ms<\/code><\/pre>\n\n\n\n<p>con tc vamos a agregar 300ms de delay en el server y en el cliente (600ms en total) y vamos a ver que sucede.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/ping600.png\"><img loading=\"lazy\" decoding=\"async\" width=\"719\" height=\"495\" src=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/ping600.png\" alt=\"\" class=\"wp-image-2039\" srcset=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/ping600.png 719w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/ping600-300x207.png 300w\" sizes=\"auto, (max-width: 719px) 100vw, 719px\" \/><\/a><\/figure>\n\n\n\n<p>Perfecto, ya tenemos un delay bastante alto, 600ms.<br \/>Ahora agregamos a la configuraci\u00f3n anterior 300ms m\u00e1s del lado del servidor y obtenemos esto:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/ping900.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"445\" src=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/ping900-1024x445.png\" alt=\"\" class=\"wp-image-2040\" srcset=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/ping900-1024x445.png 1024w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/ping900-300x131.png 300w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/ping900-768x334.png 768w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/ping900.png 1432w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>En el espacio, tenemos que incorporar un valor m\u00e1s que es el <strong>Jitter<\/strong>. Qu\u00e9 es el <strong>Jitter<\/strong>?. El jitter aparece cuando la latencia no es pareja, ejemplo:<br \/>paquete 1 \u2192 300 ms (latencia)<br \/>paquete 2 \u2192 350 ms<br \/>jitter = 50ms<\/p>\n\n\n\n<p>Ese <strong>Jitter<\/strong> pueden ser muchas cosas, un cable da\u00f1ado, una red saturada, <strong>un satelite haciendo una maniobra.<\/strong>.. ejem!.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paquet_los_resume.png\"><img loading=\"lazy\" decoding=\"async\" width=\"682\" height=\"322\" src=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paquet_los_resume.png\" alt=\"\" class=\"wp-image-2046\" srcset=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paquet_los_resume.png 682w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paquet_los_resume-300x142.png 300w\" sizes=\"auto, (max-width: 682px) 100vw, 682px\" \/><\/a><\/figure>\n\n\n\n<p>Funcionan los servicios con tanto retardo o jitter?. Bueno, la mayor\u00eda de las veces si, en una red normal en el planeta tierra. Ejemplo:<br \/><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/http_lento_pero_funcional.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"424\" src=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/http_lento_pero_funcional-1024x424.png\" alt=\"\" class=\"wp-image-2041\" srcset=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/http_lento_pero_funcional-1024x424.png 1024w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/http_lento_pero_funcional-300x124.png 300w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/http_lento_pero_funcional-768x318.png 768w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/http_lento_pero_funcional.png 1489w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Montamos un server web con python y probamos y sip, funciona correctamente. Algo lento para ver un video de youtube pero funciona. El gran problema viene cuando el jitter y el delay se nos van de las manos.<\/p>\n\n\n\n<p>Medimos ancho de banda:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/iperf.png\"><img loading=\"lazy\" decoding=\"async\" width=\"956\" height=\"606\" src=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/iperf.png\" alt=\"\" class=\"wp-image-2042\" srcset=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/iperf.png 956w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/iperf-300x190.png 300w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/iperf-768x487.png 768w\" sizes=\"auto, (max-width: 956px) 100vw, 956px\" \/><\/a><\/figure>\n\n\n\n<p>Podemos ver que con la perdida configurada hay paquetes que se reenvian, se pierden y vemos el tcp \u00abestabilizandos\u00e9\u00bb a medida que la conexi\u00f3n avanza. En total 23 reenvios de paquetes.<\/p>\n\n\n\n<p>Que pasa con UDP que no reenvia nada cuando pierde?.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/udp.png\"><img loading=\"lazy\" decoding=\"async\" width=\"888\" height=\"527\" src=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/udp.png\" alt=\"\" class=\"wp-image-2043\" srcset=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/udp.png 888w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/udp-300x178.png 300w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/udp-768x456.png 768w\" sizes=\"auto, (max-width: 888px) 100vw, 888px\" \/><\/a><\/figure>\n\n\n\n<p>Bueno, en UDP tenemos perdida directa. En este caso la p\u00e9rdida configurada <strong>1.1%.<\/strong><\/p>\n\n\n\n<p>Qu\u00e9 pasa cuando el delay aumenta (O la nave se aleja?)<\/p>\n\n\n\n<p>Para simular esto configur\u00e9 tc con un<strong> delay de 10000ms en un equipo y 20000ms en el otro<\/strong> y vemos que sucede.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/ping_normal_delay_alto.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"443\" src=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/ping_normal_delay_alto-1024x443.png\" alt=\"\" class=\"wp-image-2044\" srcset=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/ping_normal_delay_alto-1024x443.png 1024w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/ping_normal_delay_alto-300x130.png 300w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/ping_normal_delay_alto-768x332.png 768w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/ping_normal_delay_alto-1536x664.png 1536w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/ping_normal_delay_alto.png 1638w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Perdimos todo, vamos a tener que<strong> cambiar el timeout <\/strong>y esperar que el paquete responda:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/ping_espera_alta_.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"460\" src=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/ping_espera_alta_-1024x460.png\" alt=\"\" class=\"wp-image-2045\" srcset=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/ping_espera_alta_-1024x460.png 1024w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/ping_espera_alta_-300x135.png 300w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/ping_espera_alta_-768x345.png 768w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/ping_espera_alta_-1536x691.png 1536w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/ping_espera_alta_.png 1550w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Enviamos 50 paquetes con hasta 50seg de espera y obtenemos respuesta. <strong>Con un peque\u00f1o retardo de 30 segundos entre ping&#8230; pero funciona!!!<\/strong><\/p>\n\n\n\n<p><strong>Hasta ahora todos caso con retardos \u00abmanejables\u00bb. Aumentamos el timeout, esperamos y solucionado momentamente el problema pero que pasa cuando no sabemos de cu\u00e1nto ser\u00e1 el timeout?. Ahora si estamos en contexto.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">DTN &#8211; Delay\/Disruption Tolerance Network<\/h2>\n\n\n\n<p>Es importante que sepas que, a partir de ac\u00e1, todo lo que sabes de TCP\/IP se vuelve irrelevante.<strong> Esta explicaci\u00f3n va muy por encima pero tratar\u00e9 de ser \u00abentendible\u00bb.<\/strong><\/p>\n\n\n\n<p>En redes normales el flujo de datos tiene el siguiente formato: A \u2500\u2500\u2500 B \u2500\u2500\u2500 C \u2500\u2500\u2500 D. <br \/>Se dice que son <strong>End to End<\/strong>. <strong>A <\/strong>quiere hablar con<strong>B <\/strong>as\u00ed que solo le habla y <strong>B <\/strong>escucha y responde y as\u00ed secuencialmente. Sabemos con claridad cu\u00e1l es el camino.<\/p>\n\n\n\n<p>En las redes <strong>DTN<\/strong>: A B C y D pueden no estar disponibles cuando envio el mensaje, por lo tanto no hay camino completo al mismo tiempo. <strong>Ac\u00e1 es donde muere TCP\/IP. <\/strong><br \/><strong>TCP\/IP est\u00e1 orientado a la conexi\u00f3n y en este caso cuando se env\u00eda un mensaje probablemente no haya conexi\u00f3n(quiz\u00e1s el satelite est\u00e9 cruzando Marte por detr\u00e1s).<\/strong><\/p>\n\n\n\n<p>Ac\u00e1 entra el concepto <strong>Store<\/strong> &#8211; <strong>Carry<\/strong> &#8211; <strong>Forward<\/strong>. El flujo de las DTN, con este concepto, ser\u00eda algo as\u00ed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91; A ] --mensaje--> (lo guarda, Store)\n   \u2193 se mueve\n&#91; A ] ----> encuentra &#91;B] ----> le pasa copia\n                    \u2193\n                  &#91;B] se mueve(carry) y entra en alcance de &#91;C]\n                    \u2193\n                 (forward)Mensaje llega a &#91;C]<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Historia ejemplo<\/strong><\/h2>\n\n\n\n<p>Es como llevar el mensaje <strong>\u00abpor casualidad\u00bb<\/strong>. <strong>A conoce a B, es su vecino<\/strong>, <strong>le da un mensaje para D <\/strong>y le dice: \u00absi encontras a alguien que lo vea dasel\u00f3\u00bb. <strong>B sigue su vida hasta que camino a su trabajo se encuentra con C<\/strong>, yendo a su trabajo tambi\u00e9n. <strong>B le entrega el mensaje de A a C<\/strong> y <strong>C al llegar a su trabajo, si D a ido a trabajar ese d\u00eda, le entrega el mensaje<\/strong>, sino se lo entregar\u00e1 ma\u00f1ana, se lo guardar\u00e1 para que llegue el momento.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Algoritmos<\/h2>\n\n\n\n<p>En <strong>DTNs<\/strong> los paquetes (lo que en TCP\/IP conocemos como PDU) se llaman <strong>Bundles<\/strong>. La estructura normal de un bundle es algo as\u00ed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>+----------------------+\n| Bundle               |\n|----------------------|\n| Source              |\n| Destination         |\n| Payload             |\n| TTL \/ metadata      |\n+----------------------+<\/code><\/pre>\n\n\n\n<p>Como te habr\u00e1s dado cuenta un \u00ab<strong>nodo\u00bb dentro de esta red de comunicaciones puede en alg\u00fan momento de su vida tener un mont\u00f3n de bundles<\/strong> para entregar. <strong>Cada emisi\u00f3n es energ\u00eda que usa y cada bundle no entregado es espacio almacenado<\/strong>. Al hablar de sistemas de comunicaci\u00f3n en el espacio la optimizaci\u00f3n se vuelve cr\u00edtica. Es ah\u00ed donde los matem\u00e1ticos se pusieron creativos y hay un mont\u00f3n de papers con algoritmos muy interesantes para cada caso de an\u00e1lisis. Ac\u00e1 solo voy a contarte los que encontr\u00e9 se usan actualmente.<\/p>\n\n\n\n<p>Todos los algoritmos existentes caen en 4 categor\u00edas:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Flooding (inundaci\u00f3n)<\/li>\n\n\n\n<li>Replicaci\u00f3n controlada<\/li>\n\n\n\n<li>Probabil\u00edsticos \/ hist\u00f3ricos<\/li>\n\n\n\n<li>Basados en contexto<\/li>\n<\/ol>\n\n\n\n<p>Cada uno tiene un enfoque distinto pero todos tratan de ser coherentes con el rendimiento de equipos con bajos recursos y, obviamente, la seguridad en la entrega. <strong>Todo lo que sigue es un tanto copy &amp; paste con comentarios mios de estudio, pero muy interesante!.<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">* Algoritmos de inundaci\u00f3n<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Epidemic Routing<\/h4>\n\n\n\n<p>El ruteo epid\u00e9mico es el enfoque m\u00e1s simple y sirve como base conceptual para otros algoritmos. Consiste en replicar cada mensaje en todos los nodos con los que se establece contacto.<\/p>\n\n\n\n<p>Ventajas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Alta probabilidad de entrega<\/li>\n\n\n\n<li>Simplicidad de implementaci\u00f3n<\/li>\n<\/ul>\n\n\n\n<p>Desventajas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Consumo excesivo de ancho de banda<\/li>\n\n\n\n<li>Uso intensivo de almacenamiento<\/li>\n\n\n\n<li>Escalabilidad limitada<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Variantes<\/h4>\n\n\n\n<p><strong>Gossiping:<\/strong> introduce una probabilidad de reenv\u00edo para reducir la cantidad de copias.(este despu\u00e9s evoluciona a Prophet<\/p>\n\n\n\n<p><strong>Anti-Entropy:<\/strong> optimiza el intercambio de informaci\u00f3n entre nodos para evitar duplicaciones innecesarias mediante sincronizaci\u00f3n de buffers.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">* Algoritmos de replicaci\u00f3n controlada<\/h3>\n\n\n\n<p>Estos algoritmos limitan el n\u00famero de copias de cada mensaje, buscando un equilibrio entre eficiencia y probabilidad de entrega.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Spray and Wait<\/h4>\n\n\n\n<p>El algoritmo se divide en dos fases:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><em>Spray<\/em>: el nodo fuente distribuye un n\u00famero limitado de copias entre otros nodos.<\/li>\n\n\n\n<li><em>Wait<\/em>: cada nodo espera encontrar directamente al destino.<\/li>\n<\/ul>\n\n\n\n<p>Ventajas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Bajo consumo de recursos<\/li>\n\n\n\n<li>Buena eficiencia en redes m\u00f3viles<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Binary Spray and Wait<\/h4>\n\n\n\n<p>Optimiza la distribuci\u00f3n de copias dividiendo progresivamente el n\u00famero de copias disponibles entre nodos intermediarios.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Spray and Focus<\/h4>\n\n\n\n<p>Extiende el modelo anterior incorporando m\u00e9tricas inteligentes (similares a PROPHET) en la fase de reenv\u00edo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">* Algoritmos probabil\u00edsticos y basados en historial<\/h3>\n\n\n\n<p>Estos algoritmos utilizan informaci\u00f3n hist\u00f3rica sobre contactos entre nodos para estimar probabilidades de entrega. (los vecinos que m\u00e1s ves son los m\u00e1s probables para llevar tu mensaje)<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">PROPHET<\/h4>\n\n\n\n<p>Definido en RFC 6693, este algoritmo calcula una m\u00e9trica denominada <em>delivery predictability<\/em> basada en:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Frecuencia de encuentros<\/li>\n\n\n\n<li>Recencia de contactos<\/li>\n\n\n\n<li>Transitividad entre nodos<\/li>\n<\/ul>\n\n\n\n<p>Los mensajes se transfieren hacia nodos con mayor probabilidad de alcanzar el destino.<\/p>\n\n\n\n<p>Ventajas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Reducci\u00f3n significativa de copias<\/li>\n\n\n\n<li>Mayor eficiencia que Epidemic<\/li>\n<\/ul>\n\n\n\n<p>Desventajas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Dependencia de patrones de movilidad relativamente estables<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">MaxProp<\/h4>\n\n\n\n<p>Prioriza el env\u00edo y eliminaci\u00f3n de mensajes en funci\u00f3n de probabilidades de entrega y congesti\u00f3n de la red.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">RAPID<\/h4>\n\n\n\n<p>Optimiza el ruteo en funci\u00f3n de un objetivo espec\u00edfico, como minimizar el retardo o maximizar la tasa de entrega.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">* Algoritmos basados en contexto<\/h3>\n\n\n\n<p>Estos enfoques utilizan informaci\u00f3n adicional del entorno o del comportamiento de los nodos.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"> Context-Aware Routing<\/h4>\n\n\n\n<p>Incorpora variables como ubicaci\u00f3n, velocidad y direcci\u00f3n de movimiento para tomar decisiones de ruteo.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Social-Based Routing<\/h4>\n\n\n\n<p>Estos algoritmos modelan la red como un grafo social.<\/p>\n\n\n\n<p><strong>SimBet:<\/strong> utiliza m\u00e9tricas como centralidad y <em>betweenness<\/em> para identificar nodos clave en la red.<\/p>\n\n\n\n<p><strong>Bubble Rap:<\/strong> detecta comunidades y prioriza nodos con alta centralidad dentro de ellas.<\/p>\n\n\n\n<p>Ventajas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Alta eficiencia en redes humanas<\/li>\n\n\n\n<li>Reducci\u00f3n de tr\u00e1fico innecesario<\/li>\n<\/ul>\n\n\n\n<p>Desventajas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Complejidad computacional<\/li>\n\n\n\n<li>Requiere tiempo para aprender patrones<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Geo-based Routing<\/h4>\n\n\n\n<p>Se basa en informaci\u00f3n geogr\u00e1fica (por ejemplo, GPS) para seleccionar nodos m\u00e1s cercanos al destino.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">* Algoritmos basados en contactos programados<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Contact Graph Routing (CGR)<\/h4>\n\n\n\n<p>Utilizado en entornos como comunicaciones espaciales, este algoritmo emplea un grafo de contactos predecibles para planificar rutas.<\/p>\n\n\n\n<p>Caracter\u00edsticas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Basado en conocimiento previo de la red<\/li>\n\n\n\n<li>Alta precisi\u00f3n en entornos controlados<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">* Enfoques basados en aprendizaje autom\u00e1tico (esto ya es futuro)<\/h3>\n\n\n\n<p>Los enfoques m\u00e1s recientes incorporan t\u00e9cnicas de aprendizaje autom\u00e1tico para predecir patrones de movilidad y optimizar decisiones de ruteo.<\/p>\n\n\n\n<p>Ventajas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Adaptaci\u00f3n din\u00e1mica<\/li>\n\n\n\n<li>Mejora continua del rendimiento<\/li>\n<\/ul>\n\n\n\n<p>Desventajas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Requiere datos de entrenamiento<\/li>\n\n\n\n<li>Mayor consumo computacional<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"1080\" style=\"aspect-ratio: 1920 \/ 1080;\" width=\"1920\" controls src=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/hdtn-pc-12-testing-animation-final.mp4\"><\/video><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Laboratorio Espacial!<\/h2>\n\n\n\n<p>La NASA da recursos a desarrolladores para probar este tipo de comunicaciones con software dise\u00f1ado por ellos. Podes revisarlos ac\u00e1: <a href=\"https:\/\/www.nasa.gov\/technology\/space-comms\/delay-disruption-tolerant-networking-mission-resources\/\">https:\/\/www.nasa.gov\/technology\/space-comms\/delay-disruption-tolerant-networking-mission-resources\/<\/a><\/p>\n\n\n\n<p>De ah\u00ed podemos sacar algunas herramientas para hacer pruebas locales de como funcionan estos sistemas.<\/p>\n\n\n\n<p>Trat\u00e9 de probar como funciona <strong>DTN<\/strong> <strong>con una de las herramientas disponibles de la NASA:<\/strong> <a href=\"https:\/\/github.com\/nasa-jpl\/ION-DTN\">https:\/\/github.com\/dtn7\/dtn7-go<\/a><\/p>\n\n\n\n<p>Para instalarla: <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git clone https:\/\/github.com\/dtn7\/dtn7-go.git\ncd dtn7-go\n\ngo build .\/cmd\/dtnd\ngo build .\/cmd\/dtnclient\n#Necesitas tener instalado Go (golang)<\/code><\/pre>\n\n\n\n<p><strong>La idea del laboratorio es la siguiente:<\/strong><\/p>\n\n\n\n<p>Vamos a crear 3 nodos, <strong>ter_a<\/strong>, <strong>ter_b<\/strong> y <strong>ter_c<\/strong>. El <strong>A ser\u00e1 la tierra, el B ser\u00e1 la \u00abmula\u00bb<\/strong> que lleva el tr\u00e1fico a los satelites m\u00e1s lejanos (Marte por ejemplo)<strong> y el C<\/strong>, que mantendremos apagado hasta el final, <strong>ser\u00e1 el satelite que est\u00e1 pasando por detr\u00e1s de Marte<\/strong> mientras <strong>A<\/strong> est\u00e1 enviando el mensaje.<\/p>\n\n\n\n<p>Con el prop\u00f3sito de que todos tengamos el mismo escenario funcional cree un sh que hace el trabajo del test por nosotros.<br \/>Ac\u00e1 la configuraci\u00f3n de los <strong>3 \u00absat\u00e9lites\u00bb.<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>node_id = \"dtn:\/\/ter_a\/\"\nlog_level = \"Info\"\n\n&#91;Store]\npath = \"\/tmp\/dtn_store_a\"\n\n&#91;Routing]\nalgorithm = \"epidemic\"\n\n&#91;Agents.REST]\naddress = \"localhost:8081\"\n\n&#91;Agents.UNIX]\nsocket = \"\/tmp\/dtnd_a.socket\"\n\n&#91;&#91;Listener]]\ntype = \"MTCP\"\naddress = \":4001\"\n\n&#91;&#91;Discovery.Static]]\nnode = \"dtn:\/\/ter_b\/\"\nendpoint = \"mtcp:\/\/localhost:4002\"\n\n&#91;Cron]\ndispatch = \"2s\"\ngc = \"1h\"<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>node_id = \"dtn:\/\/ter_b\/\"\nlog_level = \"Info\"\n\n&#91;Store]\npath = \"\/tmp\/dtn_store_b\"\n\n&#91;Routing]\nalgorithm = \"epidemic\"\n\n&#91;Agents.REST]\naddress = \"localhost:8082\"\n\n&#91;Agents.UNIX]\nsocket = \"\/tmp\/dtnd_b.socket\"\n\n&#91;&#91;Listener]]\ntype = \"MTCP\"\naddress = \":4002\"\n\n&#91;&#91;Discovery.Static]]\nnode = \"dtn:\/\/ter_a\/\"\nendpoint = \"mtcp:\/\/localhost:4001\"\n\n&#91;Cron]\ndispatch = \"2s\"\ngc = \"1h\"\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>node_id = \"dtn:\/\/ter_c\/\"\nlog_level = \"Info\"\n\n&#91;Store]\npath = \"\/tmp\/dtn_store_c\"\n\n&#91;Routing]\nalgorithm = \"epidemic\"\n\n&#91;Agents.REST]\naddress = \"localhost:8083\"\n\n&#91;Agents.UNIX]\nsocket = \"\/tmp\/dtnd_c.socket\"\n\n&#91;&#91;Listener]]\ntype = \"MTCP\"\naddress = \":4003\"\n\n&#91;&#91;Discovery.Static]]\nnode = \"dtn:\/\/ter_b\/\"\nendpoint = \"mtcp:\/\/localhost:4002\"\n\n&#91;&#91;Discovery.Static]]\nnode = \"dtn:\/\/ter_b\/\"\nendpoint = \"mtcp:\/\/localhost:4002\"\n\n&#91;Cron]\ndispatch = \"2s\"\ngc = \"1h\"\n<\/code><\/pre>\n\n\n\n<p>El archivo <strong>lab.sh<\/strong> es el m\u00e1s complejo. Despu\u00e9s de muchos intentos no pod\u00eda obtener todos los datos como quer\u00eda. Habr\u00eda 4 ventanas, hac\u00eda <strong>tail<\/strong> en cada una de los logs de cada term y siempre algo me faltaba. <strong>Ac\u00e1 chatgpt me di\u00f3 una mano con un sh que gestiona y da los reportes uno a uno.<\/strong><\/p>\n\n\n\n<p><strong>Cada nodo se levanta como un servicio y se ejecuta en background manejando la comunicaci\u00f3n con sus pares.<\/strong> <strong>Dtn7 genera un servicio para la consulta del estado<\/strong> que se chequea desde un navegador (o en el script con curl). Este servicio supongo que es muy util para consultar desde un sistema embebido corriendo la app remotamente. Les dejo el lab.sh:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n# ============================================================\n#  Laboratorio DTN - Tolerancia a desconexi\u00f3n\n#  Escenario: A env\u00eda a C (apagado). B guarda. C enciende y recibe.\n#\n#  Topolog\u00eda:     A \u2190\u2192 B \u2190\u2192 C\n#  C se apaga, A env\u00eda bundle a dtn:\/\/ter_c\/inbox.\n#  B lo guarda (store). C vuelve a encender (forward).\n# ============================================================\n\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE&#91;0]}\")\" &amp;&amp; pwd)\"\n# Usar el dtnd parcheado incluido en este directorio (con entrega retroactiva)\nexport PATH=\"$SCRIPT_DIR:$PATH\"\n\nLOG_A=\"\/tmp\/dtn_log_a.txt\"\nLOG_B=\"\/tmp\/dtn_log_b.txt\"\nLOG_C=\"\/tmp\/dtn_log_c.txt\"\n\nSOCKET_A=\"\/tmp\/dtnd_a.socket\"\nSOCKET_B=\"\/tmp\/dtnd_b.socket\"\nSOCKET_C=\"\/tmp\/dtnd_c.socket\"\n\nREST_A=\"http:\/\/localhost:8081\/rest\"\nREST_B=\"http:\/\/localhost:8082\/rest\"\nREST_C=\"http:\/\/localhost:8083\/rest\"\n\nRED='\\033&#91;0;31m'; GREEN='\\033&#91;0;32m'; YELLOW='\\033&#91;1;33m'\nCYAN='\\033&#91;0;36m'; BOLD='\\033&#91;1m'; NC='\\033&#91;0m'\n\nsep()  { echo -e \"${CYAN}\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500${NC}\"; }\npaso() { echo; sep; echo -e \"${BOLD}${YELLOW}  PASO $1: $2${NC}\"; sep; }\nok()   { echo -e \"${GREEN}  \u2713 $1${NC}\"; }\ninfo() { echo -e \"  $1\"; }\nerr()  { echo -e \"${RED}  \u2717 $1${NC}\"; }\n\n# Espera a que el REST server de un nodo est\u00e9 disponible\nesperar_rest() {\n    local url=\"$1\/register\"\n    local nombre=\"$2\"\n    local intentos=0\n    while &#91; $intentos -lt 30 ]; do\n        if curl -s -o \/dev\/null -w \"%{http_code}\" -X POST \"$url\" -H \"Content-Type: application\/json\" \\\n           -d '{}' 2>\/dev\/null | grep -q \"200\"; then\n            ok \"$nombre REST listo ($url)\"\n            return 0\n        fi\n        sleep 0.3\n        intentos=$((intentos + 1))\n    done\n    err \"$nombre REST no respondi\u00f3 en tiempo\"\n    exit 1\n}\n\n# Espera a que el socket UNIX est\u00e9 disponible\nesperar_socket() {\n    local socket=\"$1\"\n    local nombre=\"$2\"\n    local intentos=0\n    while &#91; ! -S \"$socket\" ] &amp;&amp; &#91; $intentos -lt 20 ]; do\n        sleep 0.2\n        intentos=$((intentos + 1))\n    done\n    if &#91; -S \"$socket\" ]; then\n        ok \"$nombre UNIX socket listo\"\n    else\n        err \"$nombre UNIX socket no apareci\u00f3\"\n        exit 1\n    fi\n}\n\n# Registra endpoint v\u00eda REST y devuelve el UUID\nrest_register() {\n    local rest_url=\"$1\"\n    local eid=\"$2\"\n    local resp\n    resp=$(curl -s -X POST \"$rest_url\/register\" \\\n        -H \"Content-Type: application\/json\" \\\n        -d \"{\\\"endpoint_id\\\": \\\"$eid\\\"}\")\n    local uuid\n    uuid=$(echo \"$resp\" | grep -o '\"uuid\":\"&#91;^\"]*\"' | cut -d'\"' -f4)\n    if &#91; -z \"$uuid\" ]; then\n        err \"Registro fallido en $rest_url para $eid: $resp\"\n        return 1\n    fi\n    echo \"$uuid\"\n}\n\n# Env\u00eda bundle v\u00eda REST\nrest_send() {\n    local rest_url=\"$1\"\n    local uuid=\"$2\"\n    local source=\"$3\"\n    local destination=\"$4\"\n    local payload=\"$5\"\n    local resp\n    resp=$(curl -s -X POST \"$rest_url\/build\" \\\n        -H \"Content-Type: application\/json\" \\\n        -d \"{\n            \\\"uuid\\\": \\\"$uuid\\\",\n            \\\"arguments\\\": {\n                \\\"destination\\\": \\\"$destination\\\",\n                \\\"source\\\": \\\"$source\\\",\n                \\\"creation_timestamp_now\\\": 1,\n                \\\"lifetime\\\": \\\"24h\\\",\n                \\\"payload_block\\\": \\\"$payload\\\"\n            }\n        }\")\n    echo \"$resp\"\n}\n\n# Recibe bundles v\u00eda REST\nrest_fetch() {\n    local rest_url=\"$1\"\n    local uuid=\"$2\"\n    local resp\n    resp=$(curl -s -X POST \"$rest_url\/fetch\" \\\n        -H \"Content-Type: application\/json\" \\\n        -d \"{\\\"uuid\\\": \\\"$uuid\\\"}\")\n    echo \"$resp\"\n}\n\n# ============================================================\npaso 0 \"LIMPIEZA\"\n# ============================================================\ninfo \"Matando dtnd previos...\"\npkill -9 dtnd 2>\/dev\/null\nsleep 1\n\ninfo \"Borrando stores y logs anteriores...\"\nrm -rf \/tmp\/dtn_store_a \/tmp\/dtn_store_b \/tmp\/dtn_store_c\nrm -f  \"$SOCKET_A\" \"$SOCKET_B\" \"$SOCKET_C\"\nrm -f  \"$LOG_A\" \"$LOG_B\" \"$LOG_C\"\nok \"Limpieza completa\"\n\n# ============================================================\npaso 1 \"INICIAR TER_A y TER_B  (TER_C permanece APAGADO)\"\n# ============================================================\ninfo \"Iniciando nodo A (dtn:\/\/ter_a\/ \u2192 puerto 4001, REST 8081)...\"\ndtnd \"$SCRIPT_DIR\/ter_A.toml\" > \"$LOG_A\" 2>&amp;1 &amp;\nPID_A=$!\ninfo \"  PID ter_A = $PID_A\"\n\ninfo \"Iniciando nodo B (dtn:\/\/ter_b\/ \u2192 puerto 4002, REST 8082)...\"\ndtnd \"$SCRIPT_DIR\/ter_B.toml\" > \"$LOG_B\" 2>&amp;1 &amp;\nPID_B=$!\ninfo \"  PID ter_B = $PID_B\"\n\ninfo \"  \u25ba TER_C est\u00e1 APAGADO\"\necho\ninfo \"Esperando REST servers de A y B...\"\nesperar_rest \"$REST_A\" \"ter_A\"\nesperar_rest \"$REST_B\" \"ter_B\"\n\ninfo \"Esperando 3s para que A y B se descubran entre s\u00ed...\"\nsleep 3\n\necho\ninfo \"=== LOG TER_A (\u00faltimas 5 l\u00edneas) ===\"\ntail -5 \"$LOG_A\"\necho\ninfo \"=== LOG TER_B (\u00faltimas 5 l\u00edneas) ===\"\ntail -5 \"$LOG_B\"\n\n# ============================================================\npaso 2 \"ENVIAR MENSAJE desde TER_A \u2192 TER_C\"\n# ============================================================\nPAYLOAD=\"Hola TER_C! Bundle DTN enviado mientras estabas apagado. &#91;$(date)]\"\ninfo \"Origen  : dtn:\/\/ter_a\/sender\"\ninfo \"Destino : dtn:\/\/ter_c\/inbox\"\ninfo \"Payload : $PAYLOAD\"\necho\n\ninfo \"Registrando endpoint sender en ter_A (v\u00eda REST)...\"\nUUID_A=$(rest_register \"$REST_A\" \"dtn:\/\/ter_a\/sender\")\nok \"UUID ter_A = $UUID_A\"\n\necho\ninfo \"Enviando bundle (A \u2192 C, C est\u00e1 APAGADO)...\"\nSEND_RESP=$(rest_send \"$REST_A\" \"$UUID_A\" \"dtn:\/\/ter_a\/sender\" \"dtn:\/\/ter_c\/inbox\" \"$PAYLOAD\")\ninfo \"Respuesta: $SEND_RESP\"\nif echo \"$SEND_RESP\" | grep -q '\"error\":\"\"'; then\n    ok \"Bundle enviado correctamente\"\nelse\n    err \"Error al enviar: $SEND_RESP\"\nfi\n\n# ============================================================\npaso 3 \"VER ESTADO: BUNDLE GUARDADO EN TER_B (TER_C sigue apagado)\"\n# ============================================================\ninfo \"Esperando 5s para que A propague el bundle a B...\"\nsleep 5\n\necho\ninfo \"=== LOG TER_A ===\"\ncat \"$LOG_A\"\necho\ninfo \"=== LOG TER_B ===\"\ncat \"$LOG_B\"\necho\ninfo \"\u25ba Verificar en LOG TER_B: debe aparecer que recibi\u00f3 el bundle\"\ninfo \"  (No lo puede entregar a C porque C est\u00e1 apagado)\"\n\n# ============================================================\npaso 4 \"ENCENDER TER_C\"\n# ============================================================\ninfo \"\u25ba Iniciando nodo C (dtn:\/\/ter_c\/ \u2192 puerto 4003, REST 8083)...\"\ndtnd \"$SCRIPT_DIR\/ter_C.toml\" > \"$LOG_C\" 2>&amp;1 &amp;\nPID_C=$!\ninfo \"  PID ter_C = $PID_C\"\n\necho\ninfo \"Esperando REST server de C...\"\nesperar_rest \"$REST_C\" \"ter_C\"\n\n# ============================================================\n#  CR\u00cdTICO: Registrar el endpoint en C ANTES de que llegue el\n#  bundle. El REST server inicia ANTES que el TCP listener y el\n#  discovery manager, por eso podemos registrar primero.\n# ============================================================\ninfo \"Registrando endpoint inbox en ter_C v\u00eda REST (ANTES del discovery)...\"\nUUID_C=$(rest_register \"$REST_C\" \"dtn:\/\/ter_c\/inbox\")\nok \"UUID ter_C = $UUID_C\"\nok \"Endpoint dtn:\/\/ter_c\/inbox registrado en C\"\n\n# ============================================================\npaso 5 \"ESPERAR ENTREGA Y RECIBIR EN TER_C\"\n# ============================================================\ninfo \"Esperando 8s para que B detecte C y entregue el bundle guardado...\"\nsleep 8\n\necho\ninfo \"=== LOG TER_C ===\"\ncat \"$LOG_C\"\necho\ninfo \"=== LOG TER_B (completo) ===\"\ncat \"$LOG_B\"\n\necho\ninfo \"Recuperando bundles del mailbox de ter_C (v\u00eda REST)...\"\nFETCH_RESP=$(rest_fetch \"$REST_C\" \"$UUID_C\")\n\necho\n# El payload viene en base64 en el campo \"data\" del payloadBlock\nPAYLOAD_B64=$(echo \"$FETCH_RESP\" | python3 -c \"\nimport sys, json, base64\ntry:\n    d = json.load(sys.stdin)\n    for b in d.get('bundles', &#91;]):\n        pb = b.get('payloadBlock', {})\n        data = pb.get('data', '')\n        if data:\n            print(base64.b64decode(data).decode('utf-8', errors='replace'))\nexcept: pass\n\" 2>\/dev\/null)\n\nif echo \"$PAYLOAD_B64\" | grep -q \"Hola TER_C\"; then\n    echo\n    echo -e \"${GREEN}${BOLD}  \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557${NC}\"\n    echo -e \"${GREEN}${BOLD}  \u2551   BUNDLE RECIBIDO EXITOSAMENTE EN TER_C      \u2551${NC}\"\n    echo -e \"${GREEN}${BOLD}  \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d${NC}\"\n    echo -e \"${GREEN}  Mensaje: $PAYLOAD_B64${NC}\"\n    echo\n    echo -e \"${GREEN}  JSON completo:${NC}\"\n    echo \"$FETCH_RESP\" | python3 -m json.tool 2>\/dev\/null || echo \"$FETCH_RESP\"\nelse\n    echo -e \"${YELLOW}  Respuesta fetch:${NC}\"\n    echo \"$FETCH_RESP\" | python3 -m json.tool 2>\/dev\/null || echo \"$FETCH_RESP\"\n    echo\n    echo -e \"${YELLOW}  Si bundles=&#91;] intentar de nuevo en unos segundos:${NC}\"\n    info \"  curl -s -X POST http:\/\/localhost:8083\/rest\/fetch -H 'Content-Type: application\/json' \\\\\"\n    info \"       -d '{\\\"uuid\\\": \\\"$UUID_C\\\"}'\"\nfi\n\n# ============================================================\npaso 6 \"LOGS COMPLETOS Y RESUMEN\"\n# ============================================================\necho\necho -e \"${BOLD}=== LOG TER_A ===${NC}\"\ncat \"$LOG_A\"\necho\necho -e \"${BOLD}=== LOG TER_B ===${NC}\"\ncat \"$LOG_B\"\necho\necho -e \"${BOLD}=== LOG TER_C ===${NC}\"\ncat \"$LOG_C\"\n\nsep\necho -e \"${BOLD}Resumen del laboratorio:${NC}\"\necho \"  1. A envi\u00f3 bundle \u2192 B lo almacen\u00f3 (C estaba APAGADO)\"\necho \"  2. C encendi\u00f3 \u2192 se registr\u00f3 el endpoint \u2192 B envi\u00f3 el bundle\"\necho \"  3. C recibi\u00f3 el bundle guardado (store-and-forward DTN)\"\necho\necho -e \"${BOLD}PIDs activos:${NC}\"\necho \"  ter_A: $PID_A  ter_B: $PID_B  ter_C: $PID_C\"\necho\necho -e \"  Comandos \u00fatiles:\"\necho -e \"    Volver a buscar en C: ${YELLOW}curl -s -X POST $REST_C\/fetch -H 'Content-Type: application\/json' -d '{\\\"uuid\\\": \\\"$UUID_C\\\"}'${NC}\"\necho -e \"    Detener todo:         ${YELLOW}pkill dtnd${NC}\"\nsep\n<\/code><\/pre>\n\n\n\n<p>Tuve problemas cada vez que reiniciaba cada nodo y aprend\u00ed a los golpes que hay que frenar cada hilo y limpiar logs y temporales.<\/p>\n\n\n\n<p>Al terminar el lab, para poder seguir practicando no olvidar correr:<br \/><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#Matar los nodos\npkill -9 dtnd 2>\/dev\/null\n#Limpiar logs creados en el lab\nrm -rf \/tmp\/dtn_store_a \/tmp\/dtn_store_b \/tmp\/dtn_store_c<\/code><\/pre>\n\n\n\n<p>Ustedes podran obtener los resultados, les dejo los mios.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paso_1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"872\" height=\"624\" data-id=\"2064\" src=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paso_1.png\" alt=\"\" class=\"wp-image-2064\" srcset=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paso_1.png 872w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paso_1-300x215.png 300w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paso_1-768x550.png 768w\" sizes=\"auto, (max-width: 872px) 100vw, 872px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paso_2.png\"><img loading=\"lazy\" decoding=\"async\" width=\"876\" height=\"856\" data-id=\"2066\" src=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paso_2.png\" alt=\"\" class=\"wp-image-2066\" srcset=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paso_2.png 876w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paso_2-300x293.png 300w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paso_2-768x750.png 768w\" sizes=\"auto, (max-width: 876px) 100vw, 876px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paso_3.png\"><img loading=\"lazy\" decoding=\"async\" width=\"871\" height=\"724\" data-id=\"2065\" src=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paso_3.png\" alt=\"\" class=\"wp-image-2065\" srcset=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paso_3.png 871w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paso_3-300x249.png 300w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paso_3-768x638.png 768w\" sizes=\"auto, (max-width: 871px) 100vw, 871px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paso_4.png\"><img loading=\"lazy\" decoding=\"async\" width=\"871\" height=\"637\" data-id=\"2063\" src=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paso_4.png\" alt=\"\" class=\"wp-image-2063\" srcset=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paso_4.png 871w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paso_4-300x219.png 300w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paso_4-768x562.png 768w\" sizes=\"auto, (max-width: 871px) 100vw, 871px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paso_5.png\"><img loading=\"lazy\" decoding=\"async\" width=\"862\" height=\"823\" data-id=\"2067\" src=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paso_5.png\" alt=\"\" class=\"wp-image-2067\" srcset=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paso_5.png 862w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paso_5-300x286.png 300w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/paso_5-768x733.png 768w\" sizes=\"auto, (max-width: 862px) 100vw, 862px\" \/><\/a><\/figure>\n<\/figure>\n\n\n\n<p>Noten la marca horaria en el mensaje enviado y los detalles del payload, la informaci\u00f3n hasheada y el log detallado que da dtn7-go. Creo que voy a tener que seguir practicando hasta verlo en un sistema embebido real.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Escenarios de Cat\u00e1strofe<\/h2>\n\n\n\n<p>Quiz\u00e1s me fui por lo espacial todo el art\u00edculo por gusto, obviamente, pero estos algoritmos se usan much\u00edsimo para comunicaciones en escenarios de cat\u00e1strofes o entornos aislados. (Ya casi inexistentes desde <strong>Starlink<\/strong>)<\/p>\n\n\n\n<p>Hay un proyecto que encontr\u00e9 un tanto desactualizado, Serval Project <a href=\"https:\/\/github.com\/servalproject\">https:\/\/github.com\/servalproject<\/a> que ten\u00eda como objeto despliegues r\u00e1pidos de infraestructura en cat\u00e1strofes naturales que me llam\u00f3 mucho la atenci\u00f3n. Trat\u00e9 de usar la apk pero est\u00e1 muy desactualizada as\u00ed que, <strong>en compan\u00eda de Claude, desarroll\u00e9 una app similar para Android y la publiqu\u00e9 en Github<\/strong>. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">DTN Mesh<\/h2>\n\n\n\n<p><strong>DTN Mesh funciona en Android, el proyecto est\u00e1 disponible para el que lo quiera usar<\/strong>. Espero poder hacerle mejoras con el tiempo. <br \/>La idea es usar <strong>Prophet para conectar nodos <\/strong>android sin infraestructura adyante. <strong>Seguramente lo usar\u00e9 en la monta\u00f1a cuando toque escalar y espero no en una catastrofe real<\/strong> pero est\u00e1 a disposici\u00f3n del que lo quiera usar y darme su feedback. <strong>Colgu\u00e9 el \u00faltimo build en releases <\/strong>para que puedas probarlo.<\/p>\n\n\n\n<p>Tiene fallas, en un fin de semana no pod\u00eda salir algo funcional y copado al mismo tiempo, pero cumple como PoC (prueba de concepto) de un sistema con estas caracter\u00edsticas. <\/p>\n\n\n\n<p>Los nodos est\u00e1n todo el tiempo busc\u00e1ndose usando WiFi Direct y Bluetooth, eso hace que a veces los mensajes queden en cola mucho tiempo antes de enviarse. No alcanc\u00e9 a probar el m\u00f3dulo LoRa pero Claudo quiso que lo incluyamos y el software no es muy bueno detectando cu\u00e1l equipo encontrado corre un server y cu\u00e1l no. A\u00fan as\u00ed funciona y al cabo de unos 30\/120 segundos env\u00eda un mensaje o un audio.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/001.jpeg\"><img loading=\"lazy\" decoding=\"async\" width=\"461\" height=\"1024\" data-id=\"2056\" src=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/001-461x1024.jpeg\" alt=\"\" class=\"wp-image-2056\" srcset=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/001-461x1024.jpeg 461w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/001-135x300.jpeg 135w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/001-691x1536.jpeg 691w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/001.jpeg 720w\" sizes=\"auto, (max-width: 461px) 100vw, 461px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/002.jpeg\"><img loading=\"lazy\" decoding=\"async\" width=\"461\" height=\"1024\" data-id=\"2053\" src=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/002-461x1024.jpeg\" alt=\"\" class=\"wp-image-2053\" srcset=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/002-461x1024.jpeg 461w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/002-135x300.jpeg 135w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/002-691x1536.jpeg 691w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/002.jpeg 720w\" sizes=\"auto, (max-width: 461px) 100vw, 461px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/003.jpeg\"><img loading=\"lazy\" decoding=\"async\" width=\"461\" height=\"1024\" data-id=\"2057\" src=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/003-461x1024.jpeg\" alt=\"\" class=\"wp-image-2057\" srcset=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/003-461x1024.jpeg 461w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/003-135x300.jpeg 135w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/003-691x1536.jpeg 691w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/003.jpeg 720w\" sizes=\"auto, (max-width: 461px) 100vw, 461px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/004.jpeg\"><img loading=\"lazy\" decoding=\"async\" width=\"461\" height=\"1024\" data-id=\"2054\" src=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/004-461x1024.jpeg\" alt=\"\" class=\"wp-image-2054\" srcset=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/004-461x1024.jpeg 461w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/004-135x300.jpeg 135w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/004-691x1536.jpeg 691w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/004.jpeg 720w\" sizes=\"auto, (max-width: 461px) 100vw, 461px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/005.jpeg\"><img loading=\"lazy\" decoding=\"async\" width=\"461\" height=\"1024\" data-id=\"2055\" src=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/005-461x1024.jpeg\" alt=\"\" class=\"wp-image-2055\" srcset=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/005-461x1024.jpeg 461w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/005-135x300.jpeg 135w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/005-691x1536.jpeg 691w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2026\/04\/005.jpeg 720w\" sizes=\"auto, (max-width: 461px) 100vw, 461px\" \/><\/a><\/figure>\n<\/figure>\n\n\n\n<p>Les dejo el link del repo: <a href=\"https:\/\/github.com\/jeremiaspala\/dtn-mesh\">https:\/\/github.com\/jeremiaspala\/dtn-mesh<\/a> y acepto cualquier opci\u00f3n de mejora ya que&#8230; bueno, es un test&#8230; complejo, pero test al fin.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusiones<\/h2>\n\n\n\n<p>Los algoritmos de ruteo en <strong>DTN<\/strong> representan distintas estrategias para resolver el problema fundamental de la entrega de mensajes en redes con conectividad intermitente. Todos los enfoques, desde los m\u00e1s simples basados en inundaci\u00f3n hasta modelos avanzados basados en contexto y aprendizaje, la elecci\u00f3n del algoritmo depende del entorno, los recursos disponibles y los objetivos del sistema apuntan a la comunicaci\u00f3n efic\u00e1z en lugares o momentos donde es muy dificil lograrla.<\/p>\n\n\n\n<p>En aplicaciones reales, especialmente en escenarios de cat\u00e1strofe, los enfoques h\u00edbridos que combinan replicaci\u00f3n controlada de los bundles con decisiones probabil\u00edsticas ofrecen el mejor equilibrio entre eficiencia y confiabilidad; y as\u00ed tambi\u00e9n son los m\u00e1s dificiles de implementar.<\/p>\n\n\n\n<p><strong>En el espacio, DTN, es esencial <\/strong>pero aqu\u00ed?. Hoy en d\u00eda las soluciones satelitales dan soluciones modernas a problemas de esta \u00edndole. Starlink cambi\u00f3 el mapa global y brind\u00f3 accesos a lugares donde antes era imposible tener alg\u00fan tipo de conectividad. La pregunta es: Y si falla?. DTN en tierra es una soluci\u00f3n valedera a un problema profundo y quiz\u00e1s bastante m\u00e1s actual de lo que creemos.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Con Artemis II\/Orion la Nasa est\u00e1 probando un nuevo sistema de comunicaciones para misiones en el espacio. (https:\/\/www.nasa.gov\/technology\/space-comms\/o2o\/), una comunicaci\u00f3n directa pero con algunas cuestiones t\u00e9cnicas interesantes para los que trabajamos en comunicaciones a diario. <\/p>\n<p>Este nuevo sistema consta de un laser y unos sistemas de gimbals muy complejos para apuntar a la nave con qui\u00e9n van a establecer la comunicaci\u00f3n, en este caso la c\u00e1psula Orion, ya que el punto \u00f3ptico del laser es muy peque\u00f1o.<\/p>\n<p>La idea es bastante sencilla,un laser apuntando a un sensor con un stack de protocolos propietarios. Esto ya exist\u00eda pero con RFs, la DSN o CDSN(en el caso de china) es la Red del Espacio Profundo: Varias antenas en diferentes partes del planeta apuntando al espacio y emitiendo\/escuchando mensajes hacia los dispositivos al alcance.<\/p>\n<p>Pero que pasa con aquellos que est\u00e1n m\u00e1s lejos o est\u00e1n en lugares con conexiones intermitentes?. Para eso existen las Redes con Tolerancia al Retardo y cambia todo lo que crees que sabes en comunicaciones.<\/p>\n","protected":false},"author":1,"featured_media":2071,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[275,1427,1154,64,3,1223,161,1,17,776,804],"tags":[1454,1456,1458,1461,1459,1452,488,282,37,1453,242,1455,569,1457,1367,1366,869,1462,1460,839,138],"class_list":["post-2037","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-celulares","category-ciberseguridad","category-historia","category-ideas","category-programacion","category-redes","category-seguridad","category-sin-categoria","category-tecnologia","category-textos","category-ti","tag-artemis","tag-comunicaciones","tag-delay","tag-disrupcion","tag-disruption","tag-dtn","tag-espacio","tag-hack","tag-linux","tag-nasa","tag-network","tag-orion","tag-redes","tag-retardo","tag-satelital","tag-satelite","tag-seguridad","tag-space","tag-tolerance","tag-tolerancia","tag-trabajo"],"_links":{"self":[{"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/posts\/2037","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/comments?post=2037"}],"version-history":[{"count":18,"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/posts\/2037\/revisions"}],"predecessor-version":[{"id":2079,"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/posts\/2037\/revisions\/2079"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/media\/2071"}],"wp:attachment":[{"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/media?parent=2037"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/categories?post=2037"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/tags?post=2037"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}