I. Généralités▲
I-A. Présentation▲
Il s'agit d'un protocole reposant sur de multiples échanges continus. Il permet deux types de connexions, les connexions classiques client/serveur qui permettent à un client de se connecter au réseau. Mais également des connexions de type serveur/serveur qui permettent de gérer de grands réseaux supportant de grandes montées en charge. Il est asynchrone : les serveurs et les clients envoient leurs données sans véritablement se soucier de ce que répond l'autre...
Les échanges entre le client et le serveur se font en mode texte. Le charset généralement utilisé est l'US-ASCII sur 8 bits. Il est cependant possible que cet encoding soit modifié selon le client ou le réseau.
I-B. Structure sous-jacente au protocole▲
Il est important de comprendre la structure sous-jacente au protocole IRC. Un réseau IRC est composé de serveurs et de clients.
Les serveurs sont les seuls composants d'un réseau IRC qui permettent d'interconnecter tous les autres.
Chaque serveur est identifié par un nom unique. On peut symboliser l'ensemble des serveurs composant un réseau IRC par un graphe non orienté dont les sommets sont les serveurs et une arrête entre deux sommets symbolise la relation « Les deux serveurs sont connectés directement entre eux ». Dans ce cas, le graphe doit être un arbre, c'est-à -dire qu'il doit être connexe (on peut toujours trouver un ensemble ordonné d'arrêtes reliant deux sommets quelconques du graphe) et acyclique (pour deux sommets donnés, il existe au maximum un seul et unique ensemble ordonné d'arrêtes permettant de les relier). Autrement dit, si un serveur quelconque envoie un message à tous les serveurs auxquels il est connecté, puis que tous les autres serveurs envoient le message reçu à tous les serveurs auxquels ils sont connectés sauf à celui dont ils ont reçu le message, alors tous les serveurs recevront le message une et une seule fois. Ceci assure l'intégrité au niveau de la propagation des messages, et prévient les problèmes de boucles infinies sur un message.
Les clients sont tout ce qui se connecte à un serveur sans être soi-même un autre serveur.
On distingue deux types de clients :
- les clients utilisateurs qui fournissent généralement une interface basée sur le texte et qui est utilisée pour communiquer interactivement via IRC ;
- les clients de service qui sont généralement des bots utilisés pour fournir une fonctionnalité supplémentaire sur le réseau.
Ces fonctionnalités ne sont généralement pas reliées directement au protocole IRC en lui-même.
Chaque client est ensuite connecté à un seul et unique serveur et est ainsi en liaison avec tous les autres clients et serveurs. Chaque client est identifié par un pseudonyme (nick) unique sur le réseau, composé de 9 caractères au plus. De plus, chaque client doit fournir aux serveurs un nom et un domaine de connexion (host). Chaque serveur est tenu de savoir à quel serveur est connecté directement un client. Pour communiquer entre eux, les clients ont deux possibilités : soit désigner explicitement les destinataires du message, soit joindre un chan (salle de discussion) et envoyer les messages à celui-ci (et par propagation à tous les clients qui y sont présents).
Un chan est créé dès qu'un utilisateur y est présent. Le chan peut avoir différentes options (modes), que nous détaillerons plus tard… Le nom d'un chan doit commencer par un dièse (#) ou une esperluette (&).
Il existe deux type d'utilisateurs ayant des statuts spéciaux :
- les opérateurs IRC (IRCOP) qui ont des fonctions d'administrateur au niveau des serveurs, leur permettant de faire redémarrer un serveur, de déconnecter un serveur, de déconnecter ou de bannir un client du réseau, etc. ;
- les opérateurs de chan (chanops ou ops) qui ont des fonctions d'administrateur sur un ou plusieurs chans, leur permettant de changer les modes de ces chans, d'en éjecter (kicker) ou bannir un client. On peut les reconnaitre sur un chan, car leur nick est précédé d'une arobase (@) dans la liste des nicks présents.
I-C. Syntaxe du protocole▲
Les serveurs et les clients IRC génèrent chacun des messages pouvant ou non générer une réponse. Ces messages ont toujours le même format (les crochets indiquent une partie optionnelle dans le message).
[{:}{prefix}{SP}]{COMMANDE}[{SP}{PARAMETRES}]{CRLF}
Le séparateur SP est un espace (code ascii : 0x20). Le séparateur CRLF est le duo "Retour Chariot, Fin de Ligne" (codes ascii 0x0D et 0x0A).
À noter que les caractères CR (0x0D), LF (0x0A) et NUL (0x00) sont interdits dans les messages IRC. De plus, la longueur d'un message IRC est de 512 caractères au maximum, y compris le CRLF final.
Le préfixe n'est utilisé que pour un message provenant d'un serveur, il doit être ignoré s'il provient d'un client. Si le message est destiné à un serveur ou que le message a été émis sur le réseau par un serveur, le préfixe est simplement le nick du client, ou le nom du serveur ayant envoyé le message sur le réseau. Si le message est destiné à un client et que c'est un client qui a envoyé le message sur le réseau, alors le préfixe suit cette syntaxe :
{NICK}{!}{NOM DU CLIENT}{@}{DOMAINE DU CLIENT}
La commande est soit un mot (une suite de une ou plusieurs lettres (A-Z) insensibles à la casse), soit un code de trois chiffres. Les codes de trois chiffres correspondent à des réponses de serveur, chacun ayant un nom, pour chaque commande, les réponses possibles seront listées. Les paramètres sont des chaînes de caractères sans espace, séparées par des espaces. À noter que le dernier paramètre peut contenir des espaces, dans ce cas, son premier caractère doit alors être les deux-points (:). Chaque commande a ses paramètres.