6.2 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.
Communication entre un client et un noeud
Register
En-tête
EICP2P2 V1
dest: ip:port
type: register
Contenu
Rien
Utilisation
Cette requête est envoyée par un client pour s'enregistrer sur le réseau. Le serveur répond avec un registerACK
.
RegisterACK
En-tête
EICP2P2 V1
dest: ip:port
type: registerACK
Contenu
id_noeud::id_client
Utilisation
Réponse à un register
. Le noeud communique au client son id et l'id du noeud auquel il est connecté.
Send
En-tête
EICP2P2 V1
dest: ip:port
type: send
to: id_client_destinataire
Contenu
message_a_envoyer
Utilisation
Cette requête est envoyé par un client enregistré à un noeud pour envoyer un message à un autre client. Le noeud va tansférer le message au client, soit directement, soit par d'autre noeuds. La requête sendACK
est envoyée en retour.
SendACK
En-tête
EICP2P2 V1
dest: ip:port
type: sendACK
Contenu
Rien
Utilisation
Cette requête est envoyée par le destinataire d'une requête send
après avoir transféré le message et avoir reçu le sendACK associé à l'envoi.
C1 N1 C2
> send > > send >
Wait sendACK from C2
< sendACK < < sendACK <
Exit
En-tête
EICP2P2 V1
dest: ip:port
type: exit
Contenu
id_client
Utilisation
Envoyé par le client pour se déconnecter du réseau. Ne demande aucune réponse de la part du noeud.
Ping
En-tête
EICP2P2 V1
dest: ip:port
type: ping
Contenu
Rien
Utilisation
Envoyé par le serveur pour vérifier qu'un client est encore en ligne. Exige une réponse pingACK
de la part du client.
PingACK
En-tête
EICP2P2 V1
dest: ip:port
type: pingACK
Contenu
Rien
Utilisation
Réponse duclient à une requête de ping.