Gopher - À la recherche du protocole perdu

GNU/Linux Magazine n° 136 | mars 2011 | Denis Bernard
Creative Commons
  • Currently 0 out of 5 Stars.
0
Thank you for rating!
You have already rated this page, you can only rate it once!
Your rating has been changed, thanks for rating!
Qui se souvient de gopher ? Les anciens, assurément, ne peuvent l'avoir oublié. Ce service qui rendit Internet enfin convivial. Il permit de se brancher à des serveurs de fichiers, d'annuaires téléphoniques, de moteurs de recherche, d'applications interactives sur des micro ordinateurs ou des mainframes distants ; et ce, sans distinction de plateforme et à l'aide d'un seul client. Et ce client était utilisable par n'importe qui. Il initia l'accès universel aux ressources internet, empruntant le chemin ouvert par les protocoles Wais et Archie. Quelques années plus tard, le duo HTTP/HTML, né à la même époque, le supplanta. Mais, nostalgie mise à part, gopher pourrait revivre à travers l'informatique mobile. C'est ce que nous allons voir à travers cet article. Un retour vers le passé pour deviner le futur.

1. Prologue

J'ai découvert gopher par hasard et sans vraiment comprendre, à l'époque, de quoi il s'agissait. Je venais d'assembler un PC et d'y mettre le tout nouveau Windows 95 et Red Hat. Avec Linux, pour la première fois, je me retrouvais avec une logithèque imposante. Parmi ces logiciels, j'avais un machin avec des couleurs hideuses qui me branchait automatiquement sur une université américaine et affichait un menu avec des options. En cliquant sur une option, j'arrivais sur un fichier à télécharger dont je n'avais que faire. Ou bien, je tombais sur un autre menu qui me proposait tout un tas de choses dont je n'avais toujours rien à faire. Bon, rien d'excitant ; surtout avec une interface graphique, qui même à l'époque, faisait vieillotte. Par la suite, je me suis aperçu que ce machin bizarre n'arrivait même plus à se connecter. Cependant, je ne sais pourquoi, cette petite expérience me trottait dans la tête. Je finis par découvrir qu'il s'agissait d'un client qui fonctionnait sous le protocole gopher. J'ai cherché, en vain au fil des ans, une documentation sur cette chose mystérieuse. En 2008, enthousiasmé par un logiciel de blog, j'ai créé un site pour en fédérer les utilisateurs francophones et m'aider ainsi dans les traductions. En 2009, un de ces utilisateurs ouvrait un site gopher ! Grâce à lui, je disposais enfin de toute l'information que j'avais cherchée en vain. À mon tour, je mis en ligne un site gopher en plus du site web qui était déjà sur mon serveur domestique.

1.1 Un peu d'histoire

Gopher a été conçu en 1991 par l'université américaine du Minesota et prit le nom de sa mascotte. C'était un portail informatique à destination des étudiants, qui permettait principalement de télécharger des fichiers, des connexions Telnet ou la consultation d'annuaires téléphoniques. À ses débuts, le client était fait pour la console en mode caractère (Curses), il évolua vers le mode graphique puis la réalité virtuelle 3D. Ce fut un succès fulgurant. Il fut installé d'une université à l'autre jusqu'à devenir un service internet incontournable. Un couac eut lieu quand l'université du Minesota envisagea en 1993 de rendre propriétaire la licence du serveur gopherd. Elle se ravisa par la suite et mit le logiciel sous GPL. Mais beaucoup d'utilisateurs se tournèrent vers le Web, qui avait un statut juridique plus clair. L'archivage du groupe de discussions comp.infosystem.gopher [1] débute le 05 août 1992 avec un trafic de 321 messages/mois, le pic d'activité est en septembre 1993 (810 messages/mois), un net infléchissement en novembre 1994 (299 messages/mois) et en septembre 1995 (60 messages/mois). La teneur des messages en cette fin de période faste montre sans aucune équivoque le basculement massif des usagers vers le Web. Les archives sont tenues jusqu'à nos jours ; pour l'année 2010, il y a 77 messages, soit 6/mois. Activité à cumuler avec celle d'un autre groupe gmane.network.gopher.general [2], qui a un trafic similaire.

En résumé, on peut considérer que l'âge d'or de gopher dura de 1992 à 1994 inclus, soit trois ans. Le protocole HTTP/HTML eut donc la peau de gopher, sans même une période transitoire suffisante pour vérifier que l'on ne perdait rien au change.

1.2 Aujourd'hui

Le gopherspace est évalué à seulement deux cents sites, dont une cinquantaine réellement actifs (chiffres de la fin 2010). Ces sites sont, pour presque tous, ceux de passionnés de gopher. Du côté des institutionnels, il y a encore le site gopher de Network Time Protocol [3]. Des statistiques sont disponibles sur le site web gopherproxy.org [4]. Curieusement, ayant publié de mon côté un petit quelque chose dans mon phlog (dans le jargon des initiés, la contraction de gopher log), ce texte fut rapidement répertorié par Google ! Ce qui démontre que ce dernier a bien des yeux partout.

2. Logiciels pour gopher

Le gopherspace utilise trois familles de logiciels :

- des clients ;

- des serveurs ;

- des moteurs de recherche.

Il n'y a pas de famille de logiciels en gestion et création de site gopher, car les outils nécessaires se résument en fait à un banal éditeur de texte. C'est probablement l'explication du succès immédiat qu'a rencontré gopher à ses débuts. Ceci, contrairement à son challenger (HTTP/HTML), qui nécessite un long apprentissage pour les administrateurs et les créateurs des sites web. À nuancer toutefois pour le protocole évolué gopher+, qui peut exiger des outils plus sophistiqués. Les logiciels applicatifs sont quasiment inexistants. Tout au plus peut-on mentionner certains convertisseurs de weblog vers gopher, formant des plogs. Ces derniers sont, pour la plupart, édités manuellement.

2.1 Clients gopher

Commençons par Firefox qui supportait, il y a peu, pleinement gopher. Il vous faudra maintenant charger le module complémentaire OverbiteFF. Ensuite, rendez-vous sur le site http://gopherproxy.org/ et cliquez sur l'onglet Statistics : vous y trouverez une liste de sites gopher en activité.

Il y a d'autres navigateurs internet supportant gopher, comme Seamonkey ou Konqueror (et ses dérivés). Pour ce dernier, il vous faudra installer kio_gopher. Pour la console, le client Lynx est depuis les débuts de gopher une valeur sûre. En fait, il emprunte beaucoup à un logiciel co-écrit par un certain Tim Berners-Lee : www. Le client www est livré par la bibliothèque libwww du W3C. Il se peut que vous ayez www sur votre machine. Vous pouvez alors tester ce navigateur mixte HTTP/gopher en ligne de commandes et sans Curses :

$ www gopher://example.com/

Le client Lynx est une version plus évoluée du client www, qu'il porte de la ligne de commandes à la console en Curses. Mais à l'origine, Lynx était un pur client gopher. Je ne parlerai que plus loin de la deuxième version de gopher, qui s'appelle gopher+. Pour gopher+, il y a le navigateur éponyme Gopher, qui est en Curses pour la console. Son emploi est vraiment agréable et il est compatible avec les sites restés au standard gopher originel.

2.2 Serveurs gopher

Les serveurs gopher fonctionnent soit selon la version gopher originelle ou celle ultérieure, gopher+. Un serveur gopher+ est de toute façon forcément compatible au protocole gopher de la première version, mais plus complexe à administrer. Tout comme pour les clients gopher, le choix des serveurs est large. Faute d'un large public d'utilisateurs, il est difficile aujourd'hui de trancher vers l'un ou l'autre. Ce que l'on peut dire, c'est que Gentoo propose GoFish, et Debian, Pygopherd. Il y a aussi Bucktooth, qui est écrit en Perl et tourne sous Xinetd. Ayant installé les trois sur ma machine, mon préféré va pour GoFish, qui est simple, stable et orienté vers la sécurité. Pygopherd est tout l'opposé de GoFish dans son principe de simplicité : il gère à la fois les protocoles gopher et gopher+, HTTP et WAP.

Certains serveurs, tout comme Pygopherd, font également serveur web sur le port 70.

Les serveurs fonctionnent sur un port unique, tant en réception qu'en émission. Le port par défaut est 70. Il est possible d'avoir plusieurs serveurs sur la même machine en les affectant à des ports différents, tout comme pour les serveurs web. La problématique de sécurité est la même que pour les serveurs web. Mais, compte tenu du très petit écosystème de gopher comparé à celui du Web, il n'y a pas assez de retour d'expérience pour considérer les serveurs gopher comme matures, quoique certains sont anciens.

Dans tous les cas, il est absolument indispensable de lire attentivement la documentation. La mise en service initiale étant aussi aisée et rapide que celle d'un serveur HTTPD, il est tentant de s'en tenir là.

2.3 Moteurs de recherche gopher

L'offre en moteurs de recherche et d'indexation du gopherspace est bien moindre que pour les serveurs. Ils inventorient soit le gopherspace, soit seulement leur propre site. Il y a Jugtail, que l'on trouve sur quelques sites gopher. Il est facile à installer et la documentation est limpide. Par défaut, il écoute sur le port 3000. Jugtail a trois fonctions distinctes :

- robot de recherche qui extrait les liens gopher du site visité ;

- création d'une base de données des ressources collectées ;

- serveur répondant aux requêtes.

Le visiteur se connectant sur le serveur Jugtail fait sa requête comme il le ferait avec un homologue du Web. Les données indexées ne portent que sur la description des items des menus. Le moteur de recherche d'un autre site gopher peut éventuellement faire un dump de la base de données d'un serveur Jugtail.

3. Protocole gopher

Les URL gopher sont décrites par la rfc 4266. Elles diffèrent de celle du HTTP, par l'inclusion d'un caractère unique (généralement une lettre ou un chiffre) avant le chemin vers le fichier. Ce caractère codant permet de décrire le type de ressource à laquelle on veut accéder. Par exemple :

gopher://example.com/ /montexte.txt

signifie que le fichier à télécharger se nomme montexte.txt et que le zéro avant le nom du fichier indique qu'il s'agit d'un fichier au format texte, et non pas qu'il existe un répertoire nommé « 0 » !

Je classerai ces types gopher en quatre catégories : les menus, les téléchargements, les services de renseignement et la connexion à des serveurs non gopher.

3.1 Menus gopher

Le type 1 concerne les menus gopher. Quand un client fait une requête à la racine d'un serveur gopher, il envoie simplement / ou même rien, ce qui équivaut au même. Le serveur va renvoyer un fichier en ASCII ou Latin1 listant les fichiers, les accès distants (HTTP ou Telnet) et d'éventuels sous-menus qui auront, eux aussi, le type 1. Les menus gopher sont une liste d'enregistrements. Chaque enregistrement est composé de quatre champs séparés par le caractère de tabulation horizontale. Le premier champ débute impérativement par le caractère unique identifiant le type de ressource et est suivi par une chaîne de moins de 70 caractères qui décrit la ressource. C'est cette chaîne de caractères que verra l'utilisateur, ainsi qu'un logo ou un sigle identifiant le type de ressource. Et rien d'autre. Le deuxième champ est le nom du fichier avec son chemin complet. Le troisième champ est le nom de domaine du serveur où se trouve la ressource. Le quatrième champ est le port de ce dernier. Voilà, c'est tout ! Les menus gopher peuvent être des fichiers statiques ou générés dynamiquement.

On peut expérimenter, avec Netcat, le téléchargement d'un menu gopher :

$ echo /|nc example.com 70

Supposons que l'on veuille transposer un billet de blog au monde gopher. On commencerait par faire un menu qui aurait pour intitulé la date du billet. On trouverait ensuite une référence au texte du billet qui aurait pour intitulé le titre du billet. S'il y a des photos ou des vidéos, il faudra ajouter chacun de ces fichiers dans ce menu, avec leur légende.

Tous les fichiers texte, image ou vidéo peuvent se trouver dans le même répertoire physique, tant qu'il n'y a pas de collision de nom. L'internaute navigant dans ce gopher log aura la sensation de traverser des répertoires.

Les menus gopher sont très souvent agrémentés de décorations en ascii-art. Même si c'est contraire à l'esprit du protocole, qui vise à simuler un système de fichiers... Quasiment tous les clients reconnaissent cette extension peu orthodoxe : les lignes du code source du menu commencent par le type i (comme information).

3.2 Télécharger avec gopher

- type   : fichier texte ;

- type 4 : fichier Macintosh binhex ;

- type 5 : archive binaire DOS de quelque sorte que ce soit ;

- type 6 : fichier UNIX uuencodé (fichier binaire converti en ASCII) ;

- type 9 : fichier binaire ;

- type g : fichier graphique GIF ;

- type I : un quelconque fichier graphique.

Les fichiers téléchargeables peuvent être soit préexistants, soit générés à la demande.

3.3 Renseignements par gopher

- type 2 : serveur d'annuaire téléphonique CSO ;

- type 7 : serveur de renseignements indexés.

Le type 2, le serveur d'annuaire téléphonique CSO d'hier, correspond aujourd'hui à LDAP. Les rfc en rapport : 2258 et 2378. Le type 7 est celui des requêtes par mots-clés d'un moteur de recherche. C'est le pendant de Google pour le monde gopher. À ceci près qu'il est assez aisé d'implémenter soi-même son propre moteur de recherche. La rfc en rapport : 4266 (The gopher URI Scheme).

3.4 Connexion à des machines distantes

- type 8 : pointe vers une session Telnet en mode texte ;

- type T : pointe vers une session tn3270 en mode texte.

Le type T correspond à l'accès des terminaux de mainframes fonctionnant en mode IBM 3270. C'est un type de Telnet spécifique, dit Telnet 3270 (rfc 1041). Il existe de nombreux clients pour Windows et Mac. Le type 8 est celui du bien connu Telnet en mode VT100. Telnet est souvent compris comme étant le prédécesseur de SSH, ce qui est très inexact. Certes, on l'a largement utilisé comme moyen de connexion à un shell distant, mais c'était en invoquant un logiciel de login. Or, Telnet permet d'invoquer n'importe quel programme en ligne de commandes ou pour la console. Il est possible d'utiliser Telnet pour jouer en ligne, comme avec NetHack. Le nombre de serveurs Telnet en service a considérablement diminué. Mais, par exemple, on peut encore aller sur le serveur d'éphémérides astronomiques Horizon, du Jet Propulsion Laboratory. Tous les détails concernant leur serveur Telnet sont sur leur site http://ssd.jpl.nasa.gov/?horizons.

On doit aussi citer le type h (comme HTML), pour les liens du Web, qui n'est pas dans le protocole. Ce type est très répandu et certains clients acceptent cette extension, d'autres pas.

3.5 Implémentation de gopher

On remarquera qu'un site gopher pourra comporter plusieurs serveurs (sur une ou plusieurs machines physiques), qui chacun proposera ses menus et, éventuellement, un moteur de recherche. Pour un site de taille importante, il est recommandé de répartir les fichiers sur plusieurs machines pour éviter les goulets d'étranglement.

Le protocole gopher est décrit par la rfc 1436. Il repose sur TCP/IP. La simplicité de ce protocole est érigée en vertu cardinale.

Une séquence gopher peut ressembler à ceci :

1. Le client ouvre la liaison.

2. Le serveur accepte la liaison.

3. Le client envoie le sélecteur (nom du fichier).

4. Le serveur retourne l'intégralité du fichier.

5. Le serveur envoie le caractère point en guise de signal de fin de transmission.

6. Le serveur coupe la liaison.

7. Le client coupe la liaison.

Ayant été conçu pour les besoins d'un réseau d'université, gopher ne prend pas en compte les difficultés matérielles inhérentes à l'Internet international. Pour gopher, soit la ressource existe, soit elle n'existe pas. Dans ce dernier cas, le serveur retourne au client un message d'erreur (du type 3, qui est l'unique code d'erreur pour ce protocole). Toutefois, il est possible d'inscrire plusieurs fois dans le menu la même ressource répliquée sur des sites miroirs avec le type +. L'utilisateur aura la possibilité de cliquer sur un autre item en cas de congestion. Ce type + ne doit pas être confondu avec le protocole gopher+. C'est juste le symbole d'un site miroir.

Vous remarquerez qu'il n'y a pas de négociation. La latence entre la requête et la réponse est des plus réduites. On est vraiment étonné de pouvoir aller de menus en sous-menus d'un site gopher distant avec la même fluidité que sur son propre disque dur.

3.6 Gopher+

L'équipe de développement de gopher a, peu de temps après les débuts de gopher, lancé gopher+; ce dernier restant compatible avec la première version. Gopher+ n'est pas très compliqué à comprendre, mais mieux vaut ne pas brûler les étapes et ne s'y intéresser qu'une fois que l'on a déjà pratiqué gopher. Disons que gopher+ apporte des informations sur les ressources disponibles, comme la taille des fichiers, le nom des auteurs, les copyrights, etc. On reconnaît qu'un site est en version gopher+ à l'ajout d'un espace de tabulation supplémentaire suivi du signe +, aux lignes des menus. Il reste bien entendu qu'un client gopher de la première génération peut aller sur un site en mode gopher+. Il pourra tout télécharger normalement, mais il n'aura pas accès à toutes ses fonctionnalités.

Analyse d'un navigateur au standard gopher : Lynx. À l'invocation de l'URL suivante :

$ lynx gopher://example.com/1/

Wireshark capte l'envoi de trois caractères ascii en seule fois : /, carriage return et line feed.

Data (3 Bytes)

Data: 2f0d0a

[Length: 3]

Cet envoi de 3 caractères ascii (2F, 0D et 0A) correspond bien à la spécification du protocole gopher.

Analyse d'un navigateur au standard gopher+ : le client gopher (qui, on le rappelle, est un client gopher+). Il ne supporte pas le schéma des URI et l'on doit invoquer un site par :

$ gopher example.com

Wireshark capte l'envoi de quatre caractères ascii en trois fois : horizontal tab, $ et enfin : carriage return + line feed.

Data: (1 byte)

Data: 09

  [Length: 1]

................

Data: (1 byte)

Data: 24

  [Length: 1]

................

Data: (2 bytes)

Data: 0d0a

  [Length: 2]

On a là l'émission de 4 caractères ascii (09, 24, 0D et 0A), qui est typique du protocole gopher+. Cependant, il est permis de s'étonner que cela ne se fasse pas en une seule fois. En fait, le protocole gopher+ présente des subtilités dévoilées dans son mémo du 30 juillet 1993 [5]. Mais ce document, qui est LA référence, n'est pas vraiment un modèle de limpidité rédactionnelle... Avec ces séquences différentes entre gopher et gopher+, qu'en est-il de la compatibilité entre les deux modes ? En fait, pour le second navigateur, gopher, il faudra reformuler l'invocation pour le faire émettre la séquence de caractères à l'ancien mode par :

$ gopher -p/ example.com

Du côté des serveurs : ceux basés sur le mode gopher ancien affichent un menu spécial qui fait basculer sur le menu normal. Ensuite, la navigation se poursuit normalement. Dans la pratique, il n'y a pas d'incompatibilité entre les deux modes, gopher et gopher+.

L'étude complète du protocole gopher+ nécessiterait un long développement et dépasserait le but de cet article, qui est celui d'une introduction au monde gopher. Gopher+ apporte des informations sur les ressources proposées par les sites et permet aussi aux clients de participer à des votes ou faire des commentaires comme on peut en trouver au bas des pages de blog (blocs ASK). Il apporte un semblant d'interactivité, sans toutefois permettre un vrai suivi de connexion.

On peut comparer le mode gopher de la première génération à celui du HTML du début. C'est-à-dire du temps où les feuilles de style n'étaient pas encore inventées et où les écrans vidéo couleurs étaient chers et les souris rares. À l'opposé, gopher+ de la seconde génération correspond à l'évolution du HTML avec CGI et CSS. Nul doute que si gopher devait se développer massivement, qu'il ne faille créer des clients spécifiques pour les affichages en mode graphique d'aujourd'hui. Ces derniers sont des candidats naturels pour la version évoluée du protocole, gopher+.

4. A-t-on tué trop tôt gopher ?

Gopher, dans sa courte vie flamboyante, a introduit les concepts suivants :

- les moteurs de recherche multisites (avec Veronica) ;

- les méta informations sur les ressources (avec gopher+) ;

- les votes et commentaires (avec gopher+) ;

- les menus en blocs 3D ou réalité virtuelle (avec gopher+).

Gopher est mort brutalement au milieu des années 90, même s'il reste encore quelques étincelles de vie ça et là. Le Web avait des atouts séduisants, dont la possibilité de financement des sites et des moteurs de recherche par la publicité. Il y a eu d'autres victimes de l'expansion du Web, comme les BBS fonctionnant sur les réseaux téléphoniques à bas coût de tarification locale ou le gigantesque Minitel français. D'ailleurs, pour ce dernier, on peut remarquer que son application phare était l'annuaire électronique... ce qui correspond au type 2 du monde gopher.

Il n'est pas certain que le Web fasse toujours mieux que gopher dans tous les domaines. Prenons l'exemple d'un site web ordinaire. Si l'on imprime toutes ses pages, on aura l'équivalent d'une brochure ou d'un magazine, pas plus. Par contre, dans un site gopher, on pourrait avoir le contenu entier d'une médiathèque. La finalité d'un site web est, bien souvent, plus de faire passer un message que de délivrer des informations. Et lorsque le site web d'une grosse institution s'avise de mettre toutes ses ressources en ligne, les internautes sont frappés d'indigestion (voir les sites des services météorologiques). Ou alors, ils se retrouvent avec un frontal de base de données d'une lenteur exaspérante. Enfin, doit-on préciser que la mise en place d'un site gopher est à la portée de tout administrateur système après un temps d'apprentissage de quelques heures seulement ? À comparer aux années d'expérience et au sens artistique que requiert un site web de qualité.

Aujourd'hui, l'informatique prend un virage spectaculaire avec la téléphonie mobile. Il y a une similitude en matière de puissance et d'affichage des téléphones intelligents avec celle des ordinateurs de bureau des décennies passées. Un client gopher pour Android existe déjà, voir le projet Overbite [6]. Le protocole gopher ressuscitera-t-il par le monde de l'embarqué ?

Liens

[1] http://groups.google.com/group/comp.infosystems.gopher/

[2] http://blog.gmane.org/gmane.network.gopher.general

[3] gopher://archive.ntp.org/

[4] http://gopherproxy.org/

[5] gopher://gopher.floodgap.com/0/gopher/tech/gopherplus.txt

[6] http://gopher.floodgap.com/overbite/