secure-chat/RFC8497.md

4.0 KiB

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.