Divide y vencerás. Esta estrategia de resolución de problemas ha demostrado su eficacia durante décadas. Siglos, incluso. Aseguran los libros de historia que la clave del éxito que alcanzaron Julio César y Napoleón fue, en gran medida, la vehemencia con la que aplicaron las máximas latinas «divide et impera» (divide y domina) y «divide et vinces» (divide y vencerás), que, en realidad, son dos formas de describir la misma idea: rompe en trozos más pequeños la estructura de poder existente y mantendrás bajo tu control a los grupos resultantes.
Más allá de su aplicación en materia bélica, política y sociología, lo que nos propone esta táctica en el ámbito de la informática y las matemáticas no es otra cosa que descomponer un problema grande y complejo en otros más pequeños, y, por tanto, a priori más fáciles de resolver. A su vez, si la complejidad de estos últimos sigue siendo elevada, podemos volver a aplicar a cada uno de ellos la misma estrategia hasta dar con la solución. Esta idea tan simple tiene unas raíces muy profundas que contribuyen al sostenimiento de la informática tal y como la conocemos hoy en día. Y, al mismo tiempo, representa el pilar sobre el que se construye la computación parásita, que es la auténtica protagonista de este artículo.
Todo empezó con los sistemas distribuidos
En realidad, la computación parásita no es una técnica nueva. La dieron a conocer en 2001 cuatro investigadores de la Universidad de Notre Dame, en Indiana (Estados Unidos), mediante la publicación de su trabajo en la revista Nature. El propósito de Albert-László Barabási, Vincent W. Freeh, Hawoong Jeong y Jay B. Brockman era demostrar que es posible transformar la infraestructura de comunicaciones que conforma Internet en un sistema distribuido de computación en el que un conjunto de servidores lleva a cabo operaciones de cálculo de forma involuntaria y en beneficio de una tercera máquina, con la que se comunican utilizando los protocolos estándar de Internet.
Un sistema distribuido está constituido por un conjunto de ordenadores físicamente independientes pero conectados por una red de comunicaciones que les permite colaborar para resolver cálculos complejos
Sé que esta descripción es algo compleja y poco intuitiva, así que la iremos desgranando poco a poco para entenderla bien porque, en realidad, la idea que subyace bajo ella es bastante sencilla. Empezaremos averiguando qué es un sistema distribuido. Podemos imaginarlo como un sistema informático que no está constituido por una sola máquina, sino por varios equipos físicamente separados y con capacidad computacional, pero conectados entre sí mediante una red de comunicaciones. Su objetivo más importante es cooperar para resolver un problema, y la forma de hacerlo requiere recurrir, precisamente, a la estrategia de la que hablamos en las primeras líneas de este artículo: divide y vencerás.
Si somos capaces de descomponer un problema grande y complicado en otros más pequeños y simples posiblemente podremos repartir la carga de trabajo entre varias máquinas capaces de cooperar entre ellas con un objetivo final común. De esta forma cabe la posibilidad de que obtengamos el resultado que buscamos en menos tiempo. Como veis, es una idea sencilla, pero ilustra bastante bien y de una manera intuitiva en qué consiste un sistema distribuido. Curiosamente, esta tecnología existe desde hace décadas, prácticamente desde la invención de Internet, y está mucho más presente en nuestro día a día de lo que podemos imaginar.
De hecho, muchas de las aplicaciones y servicios que hemos utilizado, y aún continuamos usando, durante las últimas dos décadas, en realidad, funcionan gracias a la computación distribuida. Este es el caso, entre otros muchos ejemplos posibles, de las aplicaciones P2P (Peer to Peer), como BitTorrent o eMule, que no son otra cosa que sistemas distribuidos diseñados para permitirnos compartir recursos (en este caso ficheros). No obstante, antes de seguir adelante, y para afianzar los conceptos, nos viene bien definir con claridad en qué se diferencian los sistemas distribuidos y la computación distribuida.
Los primeros en el contexto que nos ocupa hacen referencia a los elementos físicos: las máquinas o equipos informáticos que ejecutan los programas y la infraestructura que hace posible que esos nodos, que es como realmente se llama cada una de las máquinas en la terminología utilizada en redes de comunicaciones, «hablen» entre ellos. Sin embargo, la computación distribuida es un concepto un poco más amplio porque se preocupa del diseño y la programación de los sistemas distribuidos de manera que sean escalables (permitan incrementar el número de nodos sin dificultad), transparentes para los usuarios, abiertos y tolerantes a fallos. Esta última característica implica que si un nodo, por la razón que sea, deja de funcionar correctamente, el sistema distribuido pueda continuar trabajando sin él.
Lo que hemos visto hasta este momento nos permite intuir sin esfuerzo por qué los sistemas distribuidos son importantes: gracias a ellos podemos acceder a una capacidad de cálculo muy superior a la que tiene cada una de las máquinas que los conforman por separado. Esta aproximación resulta crucial a la hora de resolver problemas muy complejos que representan un reto inabarcable para un solo ordenador, por potente que sea, como son muchos de los que están llevando a cabo actualmente numerosos grupos de investigación en medicina, energía, genética, farmacia o astrofísica, entre otras disciplinas.
Esto explica, además, que la computación distribuida sea un pilar fundamental de una rama de la informática que cada vez está adquiriendo una mayor relevancia: la computación de altas prestaciones. Su objetivo es, sencillamente, sacar el máximo partido a la capacidad de cálculo de los sistemas informáticos que tenemos actualmente para que nos permitan resolver los problemas de mayor envergadura a los que nos enfrentamos hoy en día.
Esta es la ingeniosa táctica utilizada por la computación parásita
Volvamos a la historia de los cuatro investigadores de los que os hablé unos párrafos más arriba. Barabási, Freeh, Jeong y Brockman se dieron cuenta de que los protocolos estándar que utilizan nuestros ordenadores para comunicarse a través de Internet podían ser utilizados para transformar un conjunto de esas máquinas en un sistema distribuido, pero con una característica peculiar: las máquinas que llevan a cabo gran parte del esfuerzo computacional, las que resuelven una parte del trabajo duro, lo afrontan de manera involuntaria. No saben qué están haciendo en realidad porque lo único que perciben es que están participando en una comunicación convencional a través de Internet.
Lo más interesante de la computación parásita es que utiliza los protocolos estándar de Internet para conseguir que un conjunto de máquinas resuelva un problema de forma involuntaria
Esta estrategia es muy ingeniosa porque permite que una sola máquina, la que inicia la comunicación y la que, en última instancia, se beneficia de los cálculos que llevan a cabo las demás de forma involuntaria, se salga con la suya sin que las otras se den cuenta. Esa es, lógicamente, la máquina «parásita». De ahí procede el nombre de este paradigma de programación, al que también se conoce como «computación sigilosa» por su capacidad de llevar a cabo su cometido sin hacer ruido, sin que las máquinas «parasitadas» y sus propietarios sean realmente conscientes de lo que está sucediendo por debajo.
Para entender cómo funciona este método con precisión nos viene de maravilla recurrir a la misma explicación defendida por los investigadores que lo desarrollaron en el artículo que publicaron en Nature, y cuya lectura os recomiendo si os defendéis con el inglés y queréis profundizar aún más en la computación parásita. Vamos allá. El conjunto de protocolos que hace posible que nuestros ordenadores se comuniquen a través de Internet está organizado en varias capas de abstracción superpuestas, de manera que cada uno de ellos realiza una parte del trabajo necesario para llevar a cabo la comunicación sin preocuparse de lo que hacen los demás.
De esta forma, cuando tecleamos una dirección web en la barra de direcciones de nuestro navegador este inicia una conexión TCP (Protocolo de Control de Transmisión) con un servidor web. Para no complicar demasiado la explicación no vamos a profundizar en las características de cada protocolo de Internet, pero no dejéis que las siglas os intimiden; nos basta recordar que TCP es un protocolo muy importante utilizado en las comunicaciones en Internet. A continuación, expide una petición utilizando otro protocolo esencial conocido como HTTP (Protocolo de Transferencia de Hipertexto) que se afianza sobre la conexión TCP de la que hemos hablado antes.
Como estamos viendo, unos protocolos trabajan «por encima» de otros, dando forma a esas capas de abstracción de las que os hablé antes y conformando una estructura que podemos imaginar como una «pila de protocolos» en la que cada uno de ellos se beneficia de los servicios que le ofrece el que tiene debajo, y, al mismo tiempo, ofrece sus servicios al protocolo que tiene por encima. Sigamos adelante. Ya tenemos establecida una conexión TCP entre nuestro navegador y un servidor web, e iniciada una petición HTTP, así que llega el momento de que entre en acción un protocolo más que también tiene una importancia enorme: IP (Protocolo de Internet).
Este último se responsabiliza de que el mensaje TCP llegue a su destino, que puede ser una máquina situada físicamente a miles de kilómetros de distancia. Para lograrlo, el protocolo IP fragmenta el mensaje en varios paquetes más pequeños que no tienen por qué viajar entre el origen y el destino siguiendo el mismo camino. Lo realmente importante es que lleguen a su destino correctamente, sorteando la congestión y cualquier otro problema con el que van a encontrarse a medida que van viajando de un router a otro a través de Internet. Por fin, cuando la petición HTTP llega al servidor web con el que se ha establecido la comunicación inicialmente, este último envía una respuesta al navegador del usuario utilizando la misma conexión TCP.
No es necesario que repasemos con más profundidad cómo se administra el tráfico de los paquetes a través de Internet y qué papel desempeña cada uno de los protocolos involucrados en la comunicación, pero lo que acabamos de ver nos permite intuir con bastante precisión el considerable esfuerzo de cálculo que deben realizar tanto las máquinas que delimitan los puntos inicial y final del enlace como los nodos intermedios. Incluso aunque el objetivo sea, sencillamente, consultar una página web. Lo más interesante de la arquitectura que hace posible el funcionamiento de Internet es que se sostiene sobre la cooperación y la confianza de los equipos involucrados en el proceso de comunicación.
Precisamente, son esas dos características, la cooperación y la confianza entre las máquinas conectadas a través de Internet, las que aprovecha la computación parásita para conseguir utilizar los recursos de algunas de esas máquinas sin su consentimiento con el objetivo de resolver un problema determinado. Pero este propósito solo es factible recurriendo a la estrategia de la que hablamos al principio del artículo: divide y vencerás. Y es que para que un problema complejo pueda ser resuelto utilizando esta técnica es necesario descomponerlo en tareas más pequeñas y simples que puedan ser evaluadas y solventadas por las máquinas conectadas a Internet.
Se aprovecha, sí, pero no compromete la seguridad
Una característica muy importante de la computación parásita es que, a diferencia de los virus, los troyanos o cualquier otra forma de malware, no compromete la seguridad de las máquinas involucradas. De hecho, solo utiliza aquellas partes de los servidores directamente implicadas en la comunicación a través de Internet. Esta peculiaridad es la que hace posible que las máquinas que resuelven esos pequeños problemas de los que hablábamos antes no se percaten de lo que están haciendo en realidad. Sencillamente, creen que solo están comprobando que los paquetes que reciben llegan en perfecto estado.
El alcance de la computación parásita dentro de las máquinas «parasitadas» está limitado a aquellos componentes implicados en la comunicación a través de Internet
Unos párrafos más arriba mencioné que la computación parásita es un paradigma de programación. Esto tan solo significa que propone un enfoque concreto que resulta útil para resolver un determinado tipo de problemas que pueden ser más difíciles de solucionar utilizando otras estrategias. Los cuatro investigadores que desarrollaron inicialmente esta técnica la ilustraron en el artículo que publicaron en Nature con un ejemplo al que nos viene de maravilla recurrir para que entendamos un poco mejor cómo es posible que las máquinas «parasitadas» no se den cuenta de que están trabajando para una aplicación que se está ejecutando en una tercera máquina que actúa como «parásito».
El objetivo de su ejemplo era resolver un reto matemático muy complejo conocido como «problema de satisfacibilidad booleana». Su complejidad es demasiado elevada para que profundicemos en ella en este artículo (si queréis conocerlo un poco mejor podéis echar un vistazo a este artículo de nuestros compañeros de Xataka Ciencia), pero nos basta saber que es muy complicado y que puede descomponerse en operaciones más pequeñas y sencillas. Para afrontarlo los investigadores propusieron utilizar dos máquinas conectadas a través de Internet. Una de ellas es la que pretende resolver el problema y la que, por tanto, actúa como «parásito», y la otra es la que le ayuda a solucionarlo de forma involuntaria. Esta última es la «parasitada».
El parásito debe ser capaz no solo de descomponer el problema grande en otros más pequeños, sino también de codificar estos últimos bajo la forma de una relación entre un paquete de datos de red y una suma de verificación. Esta última es una operación matemática relativamente sencilla utilizada habitualmente en informática y telecomunicaciones para comprobar que los datos que se transfieren en una comunicación llegan a su destino sin sufrir ninguna alteración. Es, sencillamente, un sistema de detección de errores.
En este contexto lo único que tiene que hacer la máquina parasitada es recoger los paquetes que le envía la máquina que actúa como parásito y comprobar si la suma de verificación es correcta. Una propiedad muy interesante de esta última consiste en que tiene una base lógica lo suficientemente sólida para implementar una función lógica, y, por extensión, también una operación aritmética. Pero lo realmente revelador es que el resultado de la comprobación de la suma de verificación que lleva a cabo la máquina parasitada es también la solución a uno de los pequeños problemas en los que ha sido fragmentado el problema grande que representó nuestro punto de partida.
De esta forma, la máquina que recibe los mensajes, la parasitada, simplemente cree que está comprobando la integridad de los paquetes de datos que llegan como parte de una comunicación TCP/IP convencional, pero en realidad está llevando a cabo los cálculos que le va encomendando la máquina que emite los paquetes y que actúa como parásito. Eso sí, para que esta estrategia funcione esta última debe ser capaz, como vimos antes, de descomponer el problema que pretende resolver en otros más pequeños, y también de codificar cada uno de ellos para que sea posteriormente procesado por el equipo que recibe los paquetes.
Este es realmente el reto que plantea la computación parásita debido a que con frecuencia los recursos computacionales que exige la generación de los paquetes son superiores a los aportados por la máquina que procesa la suma de verificación, lo que puede echar por tierra la eficiencia de esta estrategia.
Del proyecto SETI a las criptomonedas
Desde un punto de vista conceptual la computación parásita es similar a los clústeres, que son conjuntos de ordenadores físicamente independientes que están unidos a través de una red de comunicaciones que les permite comunicarse y trabajar al unísono, como si fuesen un solo ordenador con una enorme capacidad de cálculo. Se utilizan para resolver problemas muy complejos que requieren una gran capacidad de procesado. Sin embargo, entre estas infraestructuras hay una diferencia muy importante que va más allá de la manera en que están implementadas: como hemos visto, en la computación parásita las máquinas parasitadas no participan de forma voluntaria en la resolución del problema inicial, pero en un clúster cada máquina «conoce» el propósito de los cálculos que está llevando a cabo.
La computación parásita es similar a los clústeres desde un punto de vista conceptual, pero se diferencian en una característica esencial: la voluntariedad o involuntariedad de los equipos implicados
El proyecto SETI@home es un buen ejemplo de clúster en el que cada nodo participa voluntariamente con el objetivo de contribuir a la resolución de un problema. De hecho, es una iniciativa de computación distribuida desarrollada por el Laboratorio de Ciencias del Espacio de la Universidad de California en Berkeley (Estados Unidos) con el propósito de analizar señales de radio que puedan proceder de una inteligencia extraterrestre. Otro proyecto de investigación interesantísimo que también recurre a la misma tecnología es Einstein@home, diseñado para identificar ondas gravitacionales en los datos recogidos por los laboratorios GEO 600, de Alemania, y LIGO, en Estados Unidos, así como para analizar la información generada por el radiotelescopio de Arecibo, en Puerto Rico, y por el telescopio espacial de rayos gamma Fermi.
Todas las máquinas que intervienen en SETI@home y Einstein@home, así como en otros proyectos de computación distribuida similares a estos dos, participan de forma voluntaria. Esto quiere decir que sus propietarios han accedido a colaborar instalando en sus ordenadores una aplicación y cediendo recursos para que esta pueda ejecutarse. Sin embargo, como hemos visto, aunque la computación parásita puede perseguir un objetivo similar y conceptualmente tiene mucho en común con estas iniciativas de computación distribuida, alcanza su objetivo sin que los propietarios de las máquinas que llevan a cabo buena parte del esfuerzo de cálculo sean conscientes de lo que sus ordenadores están haciendo realmente.
Afortunadamente, la seguridad de estas últimas máquinas no tiene por qué verse comprometida por la acción de la computación parásita porque su alcance queda limitado a las partes de los servidores web directamente involucradas en la comunicación TCP/IP. Pero esto no significa que sea absolutamente inocua para las máquinas parasitadas. No lo es porque acapara recursos de estas últimas que no están a disposición de los procesos que se ejecutan de forma legítima en ellas. Además, como su acción queda camuflada dentro de los protocolos utilizados por las comunicaciones en Internet resulta muy difícil desde un punto de vista técnico tanto detectarla como impedir que lleve a cabo su objetivo.
Las implicaciones éticas y legales de la computación parásita son evidentes. Incluso aunque sea utilizada para un propósito de carácter científico, el hecho de que se apropie de recursos de algunas máquinas conectadas a Internet sin que sus propietarios lo sepan es cuando menos criticable. Pero el problema más grave es que puede ser utilizada para fines perniciosos, como, por ejemplo, para minar criptomonedas. En septiembre del año pasado el motor de búsqueda y rastreo de ficheros BitTorrent conocido como The Pirate Bay realizó un experimento entre sus usuarios para poner sobre la mesa la viabilidad de esta práctica. Y sí, no solo es posible hacerlo, sino que se está haciendo.
Desafortunadamente, no hay mucho que los usuarios podamos hacer para protegernos de estas prácticas más allá de conocer su existencia, cómo funcionan y tener cierta precaución con los servidores web que visitamos en Internet, limitando el uso de la CPU de nuestro ordenador si sospechamos que podemos ser víctimas de estos manejos. Sin duda, es un primer paso para mantenernos al margen de la computación parásita. O, al menos, intentarlo.
Imágenes | Pexels | Oak Ridge National Laboratory | Offnfopt | Scott Martin
Más información | ResearchGate
En Xataka | Algunos sitios web siguen minando criptomonedas sin que lo sepas incluso si cierras el navegador
Ver todos los comentarios en https://www.xataka.com
VER 14 Comentarios