Citar
[...] Todas las comunicaciones son directamente de usuario a usuario con ayuda de un nodo (que es otro usuario, con una dirección IP y puerto conocidos) quien permite enlazar esas comunicaciones. [...]
Ahora bien, que ocurriría si todos los host de la red tienen ips dinámicas? Nadie conocería ninguna ip. Y si se intentase cerrar esta red p2p, podrían cortar la comunicación con esa lista de ips fijas, y la red se iría al garete.
Se me ocurrió una idea algo rara, pero tal vez funcione. El programa p2p del ordenador A no sabe quien hay en la red, es mas la red aún ni existe. Sólo conoce su propia ip.
Para tratar de buscar más nodos hace una especie de "ping" a las ips a partir de la suya. Una a una tardaría mucho en encontrar algún nodo, a si que quizás se pueda hacer varios pings a las vez de 10 en 10, o 100 en 100, eso no se muy bien como se haría.
Para simplificar tenemos los siguientes datos:
Código:
Nodo | IP
A | 10
B | 20
C | 22
D | 29
Todos comienzan a buscar en la siguiente ip a ver si hay alguien. En el primer intento ninguno va a tener suerte. Al segundo el nodo B que buscaba en la 22 va a encontrar al nodo C que en ese momento estaba buscando en la 24. En este momento el nodo B y C se enlazan, y ambos guardan las ips del otro, creando una lista, que se comprobará periódicamente para comprobar que el nodo sigue conectado.
En este momento, B comparte su lista de nodos con C y viceversa. Como aun no tenían ningun nodo en la lista, pues no van a conocer a ningún nodo más. Pero el nodo C le dice al B que ya ha explorado de 22 a 24, y al parecer no hay nadie por ahi. Por lo tanto el nodo B en vez de volver a hacer ping a esas ips puede aliarse con C y decidir que B buscará las impares y C las pares. Así tardarán menos.
Ahora mismo llevamos 2 pings, continuamos con 3 pings, A exploró (11,12,13); B(21,22,25); C(22,23,24); D(29,30,31).
cuatro A(11,12,13,14); B(21,22,25,27); C(22,23,24,26); D(29,30,31,32),
cinco A(11,12,13,14,15); B(21,22,25,27,29); C(22,23,24,26,28); D(29,30,31,32,33),
seis A(11,12,13,14,15,16); B(21,22,25,27,29,31); C(22,23,24,26,28,30); D(29,30,31,32,33), ahora sí que se han encontrado C con D, de modo que C añade a su lista a D, y envia a todos los nodos de su lista, su propia lista. Entonces B recibiría la ip de D, y viceversa. Ahora pueden aliarse los tres nodos para continuar buscando.
Todo esto ocurre en el transcurso de 6 pings. Pero en una red real quizás hagan falta miles de ellos.
Una vez que se hayan conectado todos, si alguien se conectase a la red, tendría que buscar al nodo más cercano, y que ese le ofreciese la lista de nodos actuales.
Cuando un nodo se desconecta, guarda toda la lista de ips, y al volver a conectarse, trata de averiguar si esas ips están online. Si alguna lo esta, le transfiere la lista de nodos.
Una mejora que se me ocurre es que el programa, pueda reconocer si se trata de una ip fija, y comunicarselo a los demás para que busquen por el primero que las dinamicas.
Será posible crear una red así? Partiendo de cero?
Saludos!