Encrypted Illegitimate Communication Peer to Peer Protocol - `EICP2P2` - V1 =========================================================================== Présentation ------------ Ce protocole est le protocole utilisé pour la communication entre les clients et les nœuds du réseau de communication EIC. Architecture du réseau ---------------------- C1 C2 C3 C4 \/ \/ N1 N2 \ / C5 - N3 -- N4 - C6 | | \ N5 - N8 C7 | | C9 - N6 - N7 - C8 | | C10 C11 Cn sont des clients, Nn sont des noeuds. Principe -------- Pour communiquer, les clients se connectent aux nœuds et leur communication est transférée de manière transparente et cryptée. Par exemple, pour communiquer avec le client 5, le client 3 se connecte au nœud 2, qui transfère sa communication au nœud 4, puis au nœud 3 et enfin au client 5. Chaque noeud et chaque client a un id unique qui permet de l'identifier sur le réseau. Chaque noeud possède trois tables de correspondances: une qui associe l'id d'un noeud à une addresse ip, une qui associe l'id d'un client au noeud sur lequel il est connecté (y compris sur le noeud même) et une qui associe les addresses ip des clients connectés au noeud et leurs id La première table qui associe id d'un noeud et son addresse ip sera appelé `table_noeud` dans la suite du document. La table qui associe les id d'utilisateur à leur noeud de connection sera désigné `table_id_noeud`. Enfin celle qui associe un client à son addresse ip sera désigné `table_ip_client`. Structure de la requête ----------------------- Les requêtes sont divisées en deux parties : un en-tête et un corps. L'en-tête contient les informations utiles à la communication (version du protocole, adresse IP, port, type de requête...) et le corps contient les données à transférer. Exemple d'entête: EICP2P2 v1 host: 135.32.5.73:3353 type: ping Communication entre les noeuds ------------------------------ ### Ping ### ###### En-tête: ###### EICP2P2 V1 dest: ip:port type: ping ###### Contenu: ###### hash_de_la_table_noeud::hash_de_la_table_id_noeud ###### Utilisation: ###### Cette requête est envoyée pour virifier qu'un noeud est toujours actif ou pour rajouter un noeud au réseau (le ping permet de recevoir la liste des noeuds connus et d'ajouter l'emeteur à la liste des noeuds). Si le hash de la table des noeuds, ou de celle de la table id_noeud reçue est différent de celle de celle que le noeud posède, on envoie une requête `updateAsk` pour recevoir les tables complètes. Dans tous les cas le destinataire doit envoyer un `pingACK`. ### PingAck ### ###### En-tête ###### EICP2P2 V1 dest: ip:port type: pingACK ###### Contenu ###### hash_de_la_table_noeud::hash_de_la_table_id_noeud ###### Utilisation ###### Cette requête est envoyé en retour à un `ping`. Si le hash de la table des noeuds, ou de celle de la table id_noeud reçue est différent de celle de celle que le noeud posède, on envoie une requête `updateAsk` pour recevoir les tables complètes. ### updateAsk ### ###### En-tête ###### EICP2P2 V1 dest: ip:port type: updateAsk ###### Contenu ###### table_noeud table_id_noeud ###### Utilisation ###### Cette requête est envoyée pour actualiser les listes table_noeuds et table_id_noeuds, on envoie le contenu du noeud émmeteur et le récepteur renvoie le sien en échange avec un `updateBack`. ### updateBack ### ###### En-tête ###### EICP2P2 V1 dest: ip:port type: updateBack ###### Contenu ###### table_noeud table_id_noeud ###### Utilisation ###### Réponse à `updateAsk`. ### transfer ### ###### En-tête ###### EICP2P2 V1 dest: ip:port type: transfer ###### Contenu ###### requête_à_transférer ###### Utilisation ###### Permet de transférer une requête directement grâce au champ `dest` de la requête à transférer.