Page sur les langues exotiques en LaTeX.

This commit is contained in:
george 2004-04-12 17:58:01 +00:00
parent 19cbcc3e45
commit e21ad368bb
5 changed files with 788 additions and 4 deletions

View file

@ -11,6 +11,14 @@
<h1>Le grec ancien sous LaTeX</h1> <h1>Le grec ancien sous LaTeX</h1>
<div class="attention">
<p>
La méthode décrite ici fonctionne encore très bien, mais de nouveaux outils
sont maintenant disponibles, qui peuvent sembler plus confortables à
utiliser. Pour apprendre à s'en servir, allez voir la page sur
<a href="langues.html">langues exotiques</a> (oui, le grec, c'est exotique).
</p>
</div>
<h2>Avant toute chose...</h2> <h2>Avant toute chose...</h2>
@ -205,7 +213,7 @@ syst
<div class="metainformation"> Auteurs : Éveline Prioux (1998), <div class="metainformation"> Auteurs : Éveline Prioux (1998),
adaptation en HTML : Marie-Lan Nguyen (2000). adaptation en HTML : Marie-Lan Nguyen (2000).
Dernière modification&nbsp;: le <date value="$Date: 2004-02-24 22:00:29 $" />. Dernière modification&nbsp;: le <date value="$Date: 2004-04-12 17:58:01 $" />.
</div> </div>
</body> </html> </body> </html>

View file

@ -64,6 +64,7 @@ qu'un sujet important a
<li> <a href="macros.html">Faire des macros</a></li> <li> <a href="macros.html">Faire des macros</a></li>
<li> <a href="references.html">Faire des références</a></li> <li> <a href="references.html">Faire des références</a></li>
<li> <a href="maths.html">Mathématiques élémentaires</a></li> <li> <a href="maths.html">Mathématiques élémentaires</a></li>
<li> <a href="langues.html">Les langues exotiques</a></li>
<li> <a href="grec.html">Le grec ancien sous LaTeX</a></li> <li> <a href="grec.html">Le grec ancien sous LaTeX</a></li>
<li> <a href="lettre.html">Écrire une lettre</a></li> <li> <a href="lettre.html">Écrire une lettre</a></li>
<li> <a href="polices.html">Utiliser différentes polices</a></li> <li> <a href="polices.html">Utiliser différentes polices</a></li>
@ -161,7 +162,7 @@ href="mailto:tuteurs@clipper.ens.fr">mail</a>
<div class="metainformation"> <div class="metainformation">
Auteur : François-Xavier Coudert. Dernière modification le Auteur : François-Xavier Coudert. Dernière modification le
2003-02-05. <date value="$Date: 2004-04-12 17:58:01 $" />.
</div> </div>
</body> </body>

355
logiciels/latex/langues.tml Normal file
View file

@ -0,0 +1,355 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html
PUBLIC "-//ENS/Tuteurs//DTD TML 1//EN"
"tuteurs://DTD/tml.dtd">
<html>
<head>
<title>Langues exotiques</title>
</head>
<body>
<h1>Langues exotiques</h1>
<div class="resume">
<p>
Dans cette page, nous allons voir comment utiliser LaTeX pour taper des
langues « exotiques ». Par là, nous entendons des langues qui s'écrivent
avec autre chose que l'alphabet latin, comme le russe ou le japonais.
</p>
</div>
<h2>Le point sur la situation</h2>
<h3>Anciennes et nouvelles méthodes</h3>
<p>
LaTeX a été conçu avant tout par des Américains, et à ce titre, prévu pour
taper de l'anglais. Comme l'auteur principal est quelqu'un de soigneux, il
est assez facile de rajouter des accents, et même de taper autre chose que
de l'alphabet latin. Mais facile ne veut pas dire pratique : avec la manière
directe de procéder, le code source d'un mot en grec ancien risque d'être
moins lisible que les jurons de Fantasio.
</p>
<p>
Heureusement, LaTeX est programmable, et des extensions ont été écrites pour
permettre plus de confort. Hélas, ces extensions sont toutes plus ou moins
incompatibles entre elles, et souvent plutôt plus que moins. Par exemple, si
vous voulez taper du français et du grec, vous avez un choix exclusif entre
taper confortablement les caractères accentués français et taper
confortablement les mots grecs.
</p>
<p>
Plus récemment, l'informatique a vu le développement d'Unicode, un système
qui résout les problèmes de langues dans les fichiers textes (un fichier
<code>.tex</code> est un fichier texte. L'architecture de LaTeX ne l'a pas
rendu facile, mais petit a petit, il est devenu possible de bénéficier de ce
progrès.
</p>
<h3>Difficultés encore présentes</h3>
<p>
Unicode résout certains problèmes, mais ne les résout pas tous. Le principal
est bien sûr celui des polices : votre texte aura beau contenir,
informatiquement parlant, des idéogrammes chinois, si ces idéogrammes ne
sont disponibles dans aucune police que connaît LaTeX, vous n'irez pas loin.
</p>
<p>
Ensuite, Unicode est conçu pour la <em>saisie</em> du texte, pas son rendu :
Unicode traite des entités plus ou moins abstraites appelées caractères, qui
n'ont pas nécessairement un rapport direct avec les glyphes qu'on veut voir
dans un document imprimé. Pour les langues européennes, ça se passe plutôt
bien, mais certaines langues, l'arabe et surtout les langues indiennes, ont
des interactions entre caractères très complexes : ligatures,
réordonnancement, combinaisons, etc. Unicode n'aplanit pas ces difficultés,
il se contente de fournir un point d'entrée confortable à une extension qui
le fait &mdash; si elle existe.
</p>
<p>
Enfin, LaTeX est conçu presque exclusivement pour l'écriture de gauche à
droite. Ses algorithmes sont incapables de gérer l'écriture de droite à
gauche de l'arabe et de l'hébreu, et l'écriture en colonnes.
</p>
<h3>Finalement, qu'est-ce qui marche ?</h3>
<p>
Après toutes ces considérations défaitistes, on en vient à se demander s'il
est possible de taper autre chose que de l'anglais. Voici une petite liste
de ce qui marche bien.
</p>
<ul>
<li>les langues occidentales, avec des extensions de l'alphabet latin
(accents, ligatures, ponctuations bizarres, etc.) ;</li>
<li>le grec, moderne et ancien ;</li>
<li>le cyrillique</li>
<li>le chinois, simplifié et traditionnel, écrit de gauche à droite ;</li>
<li>le japonais, écrit de gauche à droite.</li>
</ul>
<p>
La distribution standard de LaTeX comporte des polices latines, grecques et
cyrilliques. Des polices chinoises et japonaises sont également disponibles,
mais parfois plus techniques à installer. Il y en a installées à l'ENS.
</p>
<h2>Comment faire</h2>
<h3>Préparation</h3>
<p>
Avant de commencer, il y a un pré-requis qui n'est pas spécifique à LaTeX :
savoir taper un texte quelconque, dans la langue qui vous intéresse, en
Unicode. Heureusement, nous avons une documentation sur les
<a href="&url.tuteurs;unix/editeurs/unicode.html">éditeurs en Unicode</a>,
que nous vous invitons à lire avant d'aller plus loin si ce n'est déjà fait.
</p>
<p>
Tout ce que vous avez à faire maintenant, c'est de créer votre fichier LaTeX
avec votre éditeur en Unicode. Nous allons voir dans un instant ce qu'il
faut mettre dans le préambule.
</p>
<div class="ens">
<p>
<strong>Attention,</strong> sur certains PC FreeBSD, c'est une ancienne
version de LaTeX qui est installée. Si vous éprouvez des problèmes, regardez
la deuxième ligne des messages lors de la compilation : si elle indique
« <code>LaTeX2e &lt;1999/12/01&gt; patch level 1</code> », changez de
machine (en vous loguant à distance, c'est le plus simple).
</p>
</div>
<h3>Ce qu'il faut écrire</h3>
<p>
Dans le cas général, il n'y a quasiment rien à changer. Il suffit d'avoir la
ligne suivante dans le préambule :
</p>
<pre>\usepackage[utf8]{inputenc}</pre>
<p class="continue">
(à la place de l'habituel <code>latin1</code>). Avec cette ligne, un texte
en alphabet latin étendu (y compris <code>&oelig;</code>,
<code>&ldquo;</code>, <code>&rdquo;</code>, <code>&lsquo;</code>,
<code>&rsquo;</code>, <code>&euro;</code>, <code>&hellip;</code>,
<code>&mdash;</code>, etc., tapés directement) fonctionne directement.
</p>
<p>
Pour d'autres langues, il faut quelques options supplémentaires, et en
particulier informer babel du changement de langue.
</p>
<h3>Babel polyglotte</h3>
<p>
Jusqu'a présent, vous n'avez probablement utilisé du package babel que la
ligne <code>\usepackage[francais]{babel}</code>. Il est temps d'apprendre à
l'utiliser pour d'autres langues. Par chance, c'est assez simple. La
première chose à faire est de charger les bons modules :
</p>
<pre>\usekackage[greek,russian,francais]{babel}</pre>
<p class="continue">
La dernière langue mentionnée est la langue « principale » du document,
celle qui est sélectionnée s'il n'y a pas d'indication contraire. L'ordre
des autres langues n'a pas d'importance.
</p>
<p>
Il faut ensuite, tout au long du texte, indiquer les changements de langue.
Trois commandes permettent de faire ça :
</p>
<pre>\selectlanguage{<var>langue</var>}</pre>
<p class="continue">
sélectionne une nouvelle langue pour tout le reste du texte, ou jusqu'à la
prochaine rencontre avec la même commande. De manière surprenante, cette
commande s'échappe des groupes et des environnements ; à utiliser avec
prudence donc.
</p>
<pre>
\begin{otherlanguage}{<var>langue</var>}
\end{otherlanguage}
</pre>
<p class="continue">
sélectionne une langue pour l'étendue de l'environnement. Aucune surprise
ici.
</p>
<pre>\foreignlanguage{<var>langue</var>}{<var>blabla</var>}</pre>
<p class="continue">
sélectionne une langue pour le texte « blabla », et s'utilise de la même
manière que <code>\emph</code>.
</p>
<p>
Souvent, des commandes plus compactes sont disponibles spécifiquement pour
une langue donnée (comme <code>\textgreek</code> pour
<code>\foreignlanguage{greek}</code>).
</p>
<div class="attention">
<p>
<strong>Attention,</strong> il est souvent <strong>nécessaire</strong> de
bien informer LaTeX du changement de langue. En effet, le changement de
langue s'accompagne d'un changement de police (plus précisément,
d'<em>encodage</em> de police), ce dont LaTeX ne prend pas l'initiative tout
seul.
</p>
</div>
<p>
Dans le cas d'un texte comportant beaucoup de mots étrangers, par exemple le
commentaire en français d'un texte grec, changer sans arrêt de langue est
fastidieux, même en ayant défini une macro très courte. Il est possible
d'automatiser ça en utilisant le package <code>autofe</code>. Attention
cependant si vous optez pour cette solution : si dans un mot certains
caractères sont disponibles dans la police actuelle et d'autres pas, ce mot
sera rendu avec un mélange de polices, ce qui peut être très laid, et vous
n'aurez aucun avertissement. De plus, au delà de quelques mots, il faut
quand même expliciter le changement de langue, faute de quoi la typographie
et, plus grave, la césure ne respecteront pas les règles spécifiques.
</p>
<h2>Langue par langue, en détail</h2>
<h3>Le grec</h3>
<p>
Le nom pour babel est simplement <code>greek</code>. La commande
<code>\textgreek{<var>blabla</var>}</code> est définie pour avoir le même
effet que <code>\foreignlanguage{greek}{<var>blabla</var>}</code>. Le
changement de langue est nécessaire pour que la police soit disponible.
</p>
<p>
Quand le grec est actif, LaTeX utilise une sorte de translittération depuis
l'alphabet latin, avec des conventions pour les accents et les esprits. Mais
comme nous travaillons en UTF-8, c'est inutile et nous n'en parlons pas.
</p>
<h3>Le cyrillique</h3>
<p>
Le nom pour babel est <code>russian</code>, et le changement de langue est
nécessaire pour que la police soit disponible. Rien d'autre à signaler.
</p>
<h3>Le chinois</h3>
<p>
Là, ça se complique un peu, il faut quelques packages supplémentaires. Voici
ce qu'il faut mettre dans le préambule pour du chinois traditionnel :
</p>
<pre>
\usepackage[cjkbg5]{ucs}
\usepackage[utf8]{inputenc}
\usepackage[C00,T1]{fontenc}
\DeclareFontSubstitution{C00}{sng}{m}{n}
</pre>
<p class="continue">
et pour du chinois simplifié :
</p>
<pre>
\usepackage[cjkgb]{ucs}
\usepackage[utf8]{inputenc}
\usepackage[C10,T1]{fontenc}
\DeclareFontSubstitution{C10}{sng}{m}{n}
</pre>
<p>
Les deux ont la même structure. La première ligne indique quelle
interprétation choisir pour un caractère qui aurait le mauvais goût d'être
commun au chinois simplifié, au chinois traditionnel et au japonais. La
troisième ligne charge l'encodage nécessaire (C00 pour le chinois
traditionnel, C10 pour le simplifié), ainsi que l'encodage occidental (faute
de quoi ça ne marche pas). Enfin, la dernière ligne indique quelle famille
de police employer par défaut pour cet encodage, ici Arphic SungtiL
(<code>sng</code>). Deux autres polices sont disponibles ici, Arphic KaitiM
(<code>kai</code>), très ornée, et Bitstream Cyberbit (<code>cyb</code>),
qui n'est pas libre. Il est possible de changer de police en modifiant la
ligne <code>\DeclareFontSubstitution</code> ou en utilisant la commande
<code>\fontfamily</code>.
</p>
<p>
Quelques points supplémentaires à savoir. D'abord, babel n'a pas de mode
pour le chinois. Pour éviter des bizarreries typographiques, il peut être
bon de passer babel en mode anglais pour un bout de chinois. Ensuite, ce
mode de saisie n'est pas capable de couper automatiquement entre les
idéogrammes ; il est nécessaire d'insérer des espaces à la main. Peut-être
dans un avenir proche un package résoudra-t-il le problème.
</p>
<div class="ens">
<p>
L'installation de polices chinoises pour LaTeX est assez acrobatique, et
pas complètement standard. Les indications ci-dessus fonctionneront
normalement sur l'installation LaTeX de l'ENS, mais il n'est pas sûr du tout
que ce soit le cas ailleurs ; en particulier, les noms des polices (pour le
<code>\DeclareFontSubstitution</code>) peuvent varier considérablement.
</p>
</div>
<h3>Le japonais</h3>
<p>
Là, ça se complique un peu, il faut quelques packages supplémentaires. Voici
ce qu'il faut mettre dans le préambule :
</p>
<pre>
\usepackage[cjkjis]{ucs}
\usepackage[utf8]{inputenc}
\usepackage[C42,T1]{fontenc}
\DeclareFontSubstitution{C42}{dg}{m}{n}
</pre>
<p>
La première ligne indique quelle
interprétation choisir pour un caractère qui aurait le mauvais goût d'être
commun au japonais et au chinois. La
troisième ligne charge l'encodage nécessaire (C42 pour le japonais), ainsi
que l'encodage occidental (faute de quoi ça ne marche pas). Enfin, la
dernière ligne indique quelle famille de police employer par défaut pour cet
encodage, ici Wadalabe DG (<code>dg</code>). Trois autres polices Wadalabe
sont disponibles ici, <code>dm</code>, <code>mc</code> et <code>mr</code>.
Il est possible de changer de police en modifiant la ligne
<code>\DeclareFontSubstitution</code> ou en utilisant la commande
<code>\fontfamily</code>. La police (non-libre) Bitstream Cyberbit est
également disponible sous le nom <code>cyb</code>, mais il faut dans ce cas
remplacer partout C42 par C40, et donc exclure d'utiliser les polices
Wadalabe.
</p>
<p>
Quelques points supplémentaires à savoir. D'abord, babel n'a pas de mode
pour le japonais. Pour éviter des bizarreries typographiques, il peut être
bon de passer babel en mode anglais pour un bout de japonais. Ensuite, ce
mode de saisie n'est pas capable de couper automatiquement entre les
caractères ; il est nécessaire d'insérer des espaces à la main. Peut-être
dans un avenir proche un package résoudra-t-il le problème.
</p>
<div class="ens">
<p>
L'installation de polices japonaises pour LaTeX est assez acrobatique, et
pas complètement standard. Les indications ci-dessus fonctionneront
normalement sur l'installation LaTeX de l'ENS, mais il n'est pas sûr du tout
que ce soit le cas ailleurs ; en particulier, les noms des polices (pour le
<code>\DeclareFontSubstitution</code>) peuvent varier considérablement.
</p>
</div>
<div class="metainformation">
Auteur : Nicolas George.
Dernière modification le <date value="$Date: 2004-04-12 17:58:02 $" />.
</div>
</body>
</html>

View file

@ -283,11 +283,12 @@ tous les c
avec Vim ou Emacs (ou dans un terminal)</a></li> avec Vim ou Emacs (ou dans un terminal)</a></li>
<li><a href="&url.tuteurs;internet/courrier/international.html">Gérer son <li><a href="&url.tuteurs;internet/courrier/international.html">Gérer son
courrier électronique en Unicode avec Mutt</a></li> courrier électronique en Unicode avec Mutt</a></li>
<li>Taper du LaTeX en Unicode : pour bientôt.</li> <li><a href="&url.tuteurs;logiciels/latex/langues.html">Taper du LaTeX en
Unicode</a></li>
</ul> </ul>
<div class="metainformation"> <div class="metainformation">
Auteur : Nicolas George. Dernière modification le <date value="$Date: 2004-02-23 12:23:30 $." />. Auteur : Nicolas George. Dernière modification le <date value="$Date: 2004-04-12 17:58:46 $." />.
</div> </div>
</body> </body>

419
theorie/internet.tml Normal file
View file

@ -0,0 +1,419 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html
PUBLIC "-//ENS/Tuteurs//DTD TML 1//EN"
"tuteurs://DTD/tml.dtd">
<html>
<head>
<title>Internet</title>
</head>
<body>
<h1>Comment marche Internet</h1>
<h2>Relier les ordinateurs</h2>
<h3>Le principe</h3>
<p>
Un câble, d'un côté quelqu'un qui envoit du courant par intermittence, de
l'autre quelqu'un qui regarde quand il y a du courant. C'est le principe du
télégraphe, avec le code Morse. Et ça s'adapte vraiment parfaitement aux
ordinateurs. Les ordinateurs peuvent même faire mieux : ils ont des
métronomes (dans le domaine informatique on parle d'horloges) qui battent
très précisément la mesure ; à chaque tic, ils peuvent envoyer ou pas le
courant, ça fait un bit d'information à chaque fois.
</p>
<p>
Nous ne rentrerons pas dans les détails de la réalisatoin physique : ça
peut aller d'une bête paire de fils sur à peine plus d'un mètre à un
faisceau de fibres optiques, en passant par un câble coaxial. Ça peut
également être des ondes radio, ou bien le fait de dire ou de ne pas dire
bip sur une ligne téléphonique. Bref, il y a plein de manières pour deux
ordinateurs de se dire 0 ou 1.
</p>
<p>
Ça, c'est bien pour relier deux ordinateurs. Mais comment faire s'il y en a
plusieurs ? Tirer un câble entre chaque paire n'est pas envisageable. La
solution la moins coûteuse, et donc celle qui a été rapidement préférée, est
d'utiliser un seul câble qui connecte tous les ordinateurs. Quand un
ordinateur veut parler, il parle à tous les autres, et il faut inventer des
moyens pour que deux ne parlent pas en même temps. Le système de ce genre le
plus répandu consiste en un câble coaxial où tous les ordinateurs sont
branchés en sérié ; plus récemment on a adopté une structure en étoile
autour d'un appareil bon marché appelé hub, plus efficace et plus robuste
que la structure en série.
</p>
<p>
Plusieurs ordinateurs, c'est bien, mais relier beaucoup d'ordinateur, c'est
mieux. La technologie des câbles impose des limites de longueur, et il est
rarement possible de relier directement un câble coaxial de réseau
domestique à un faisceau de fibres optiques transatlantique. La solution
consiste alors à avoir une machine branchée sur les deux (ou plus) réseaux,
avec pour tâche de faire suivre l'information de l'un à l'autre ; quand un
ordinateur d'un réseau veut parler à un ordinateur de l'autre réseau, il
adresse son message à cette machine, avec une étiquette indiquant le
destinataire. On appelle une telle machine un <dfn>routeur</dfn>.
</p>
<h3>Comment on fait, en vrai, sur Internet</h3>
<p>
Pour les réseaux locaux (les
<abbr lang="en" title="Local Area Network">LAN</abbr> quand on veut faire
moderne), la technologie employée est <dfn>ethernet</dfn>. Elle fonctionne
soit avec un câble coaxial en série, soit avec un câble simple (à huit fils
dont peu sont vraiment utilisés) organisé en étoile autour d'un hub. Avec
ethernet, les données sont envoyées par blocs appelés trames qui font au
plus environ 1,5 ko. Il n'y a pas de système pour s'assurer <i>a priori</i>
que deux ordinateurs sur le câble ne parlent pas en même temps : la
détection se fait <i>a posteriori</i> par le fait que le signal est alors
incompréhensible ; les deux ordinateurs réémettent alors après un délai
aléatoire, qui sera probablement différent ; en pratique, ce système marche
plutôt bien.
</p>
<p>
Au début de chaque trame ethernet, ou trouve ce qu'on appelle un
<dfn>entête</dfn> : quelques octets réservés par le protocole ethernet
lui-même pour son fonctionnement interne. Toutes les cartes réseau ethernet
possèdent une adresse
<abbr lang="en" title="Media Access Control">MAC</abbr> depuis l'usine (mais
les cartes modernes permettent de la changer), qui est code unique de six
octets. Par exemple clipper a pour adresse MAC
<code>08:00:20:b0:24:32</code>. Dans l'entête ethernet, on trouve l'adresse
MAC de l'ordinateur auquel la trame est adressée (ainsi que celle de
l'ordinateur qui envoit). En temps normal, le filtrage se fait directement
au niveau de la carte réseau, de sorte que parmi les ordinateurs sur un même
câble, seul celui qui est concerné voit effectivement un message.
</p>
<p>
Dans l'entête ethernet, on trouve également un numéro de protocole. C'est un
petit nombre, sur deux octets, qui décrit très brièvement ce qu'on prévoit
de faire avec les données de la trame.
L'<abbr lang="en" title="Internet Assigned Numbers Authority">IANA</abbr>
tient à jour une
<a href="http://www.iana.org/assignments/ethernet-numbers">table des numéros
ethernet</a> attribués. Ainsi, le système d'exploitation de l'ordinateur qui
a reçu la trame peut immédiatement appeler le bon sous-système, ou ignorer
la trame s'il ne sait pas quoi en faire. Pour illustrer, quand on utilise
ethernet pour faire passer de l'« Internet », le numéro est 513. Ce
mécanisme de numéros décrivant le genre d'utilisation d'un système est très
général, et on le retrouve à tous les niveaux des protocoles Internet.
</p>
<p>
Quand on utilise une ligne téléphonique, le protocole employé est le
<span lang="en">Point to Point</span> (PPP). Il a des mécanismes différents
parce qu'il ne relie que deux ordinateurs, mais sous des contraintes
différentes (ligne moins fiable et temps de latence supérieur).
</p>
<h2>Relier les réseaux</h2>
<h3>Le routage</h3>
<p>
Mettez une lettre à la poste. Si le destinataire habite dans la même ville,
elle lui sera distribuée directement. S'il habite dans une ville voisine, le
facteur transmet la lettre à son collègue de cette ville. S'il habite plus
loin, le facteur transmettra la lettre au centre de tri dont il dépend. Et à
son tour, le centre de tri va faire suivre la lettre à qui de droit. La
lettre va donc passer par différentes étapes où elle sera redirigée en
fonction de l'adresse qui est écrite dessus.
</p>
<p>
Les réseaux informatiques, dès qu'ils dépassent les quelques dizaines de
machines qu'on peut brancher sur un même câble, fonctionnent de la même
manière : les données sont découpées en <dfn>paquets</dfn>, qui jouent le
rôle de notre enveloppe. Quand il n'est pas possible de transmettre le
paquet directement à son destinataire, il est transmis à un ordinateur
(défini dans la configuration du réseau) appelé <dfn>routeur</dfn>. Cet
ordinateur est censé être capable de faire suivre le paquet ; ça suppose par
exemple qu'il est relié par un autre câble à un autre réseau.
</p>
<p>
Pour pouvoir marcher, ce système a besoin que les ordinateurs soient dotés
d'une adresse qui reflète leur position dans le réseau global. L'adresse MAC
ne convient pas pour cette tâche, d'une part parce que elle est (plus ou
moins) immuable et ne correspond en rien à la position sur le réseau (un
portable qu'on débranche d'un endroit et rebranche a un autre ne change pas
d'adresse MAC), et d'autre part parce qu'on souhaite que ça fonctionne avec
différents types de connexion (les modems pour les connexions PPP, par
exemple, n'ont pas d'adresse MAC). On invente alors un nouveau système
d'adresses, indépendant du protocole utilisé pour connecter les ordinateurs.
</p>
<h3>Le protocole IP</h3>
<p>
Ce qui fait Internet, c'est
<abbr lang="en" title="Internet Protocol">IP</abbr> (et l'on découvre que le
titre de cette section est un pléonasme). Ce protocole décrit la structure
des adresses utilisée, la manière d'écrire ces adresses dans les paquets, et
les moyens d'assurer leur bonne circulation.
</p>
<p>
Nous utilisons actuellement la version 4 d'IP, ce qu'on indique parfois par
IPv4. Dans cette version, les adresses sont constituées de 32 chiffres
binaires (bits), ce qu'on écrit généralement sous la forme de quatre nombres
entre 0 et 255. Par exemple, l'adresse IP de clipper est 129.199.129.1. Une
nouvelle version d'IP, IPv6, est progressivement mis en place ; les adresses
y font 128 bits, et sont écrites en hexadécimal ; l'ENS n'est pas reliée en
IPv6, mais si vous voulez un exemple, 2001:660:3001:4002:2C0:4FFF:FE4E:41D3
est l'adresse IPv6 du serveur web de
<a href="http://www.renater.fr/">Renater</a>.
</p>
<p>
Tout ordinateur relié à Internet possède (au moins) une adresse IP, et il
est le seul à la posséder (dans Internet). Ces adresses sont structurées en
réseaux et sous-réseaux, en fixant les chiffres de gauche à droite. Ainsi,
toutes les adresses en 129.199.x.y sont dans l'ENS, et celles en
129.199.129.y sont plus particulièrement dans la salle S. De l'extérieur,
quelqu'un qui veut envoyer un paquet à 129.199.129.1 a seulement à savoir
qu'il doit l'envoyer à l'ENS. C'est ensuite à nos routeurs de finir le
travail.
</p>
<p>
Les paquets IP comportent tous l'adresse IP de l'expéditeur, celle du
destinataire, une somme de contrôle qui permet de vérifier qu'il est intact,
et un numéro de protocole indiquant à quoi va servir ce paquet. Ils
comportent également un compteur qui limite le nombre de routeurs par lequel
il peut passer (de manière à ce qu'un paquet perdu ne reste pas éternellement
à circuler entre des routeurs mal configurés), ainsi que quelques autres
options. Un des principes d'Internet, c'est que les routeurs font le strict
minimum : ils doivent se contenter de faire suivre les paquets sans les
altérer (sauf le compteur ; si un paquet a atteint la limite, le routeur
l'arrête et envoit un paquet à l'expéditeur pour signaler l'erreur). Un des
autres principes est que tous les ordinateurs sont égaux : du point de vue
du protocole, rien ne distingue le super ordinateur central de la NASA de
votre petit PC personnel ; en particulier, rien ne distingue un serveur d'un
poste client.
</p>
<p>
IP est conçu sur un principe de <span lang="en">best effort</span> (meilleur
effort) : les infrastructures (les routeurs) font leur possible pour faire
parvenir vos paquets, mais sans aucune garantie. Un paquet peut disparaître
sans laisser de trace, ou bien se perdre au mauvais endroit (mais il n'ira
en général pas bien loin), ou encore être retardé et arriver après un paquet
pourtant parti plus tard. Il arrive même qu'un paquet arrive en plusieurs
exemplaires. Bien sûr, <em>en général</em>, les paquets arrivent bien, et
dans l'ordre. Ce principe du meilleur effort a l'avantage d'être simple et
léger ; il est ensuite possible de concevoir un système d'accusés de
réception et de numéros d'ordre pour assurer la fiabilité de la
transmission.
</p>
<h2>Relier les programmes</h2>
<h3>Trier les paquets</h3>
<p>
C'est bien gentil de dire que votre ordinateur peut envoyer des paquets qui
arriveront (peut-être) à n'importe quel ordinateur dans le monde, mais vous,
ce qui vous intéresse, c'est de surfer sur le web et d'envoyer du courrier
en même temps, et que les informations arrivent. Pourtant, le web et le
courrier électronique ne sont pas toujours dans le même logiciel : il faut
donc que plusieurs applications puissent se partager le réseau, et que l'une
n'aille pas recevoir les données de l'autre.
</p>
<p>
Quand on programme une application réseau, on amierait en général avoir une
sorte de tuyau : tout ce qu'on dit d'un côté, l'application à l'autre bout
le reçoit, dans l'ordre, sans perte, et une seule fois, et inversement, on
reçoit tout ce qu'elle dit. Si les ordinateurs aux deux bouts sont d'accord,
un tel tuyau peut être simulé : on découpe ce qui doit passer dans le tuyau
en morceaux assez petits pour tenir dans des paquets, et on les expédie avec
un numéro d'ordre ; à l'autre bout, l'ordinateur répond par un paquet
accusant la réception, et utilise les numéros pour remettre de l'ordre. Si
on constate qu'un accusé de réception tarde, on réexpédie le paquet
incriminé, au pire il arrivera en double et ce n'est pas grave.
</p>
<p>
Tant qu'on en est à rajouter des numéros aux paquets, on peut ajouter encore
quelques informations. Par exemple l'identité du programme qui l'a envoyé,
ou l'identité du programme qui doit le recevoir. Avec tout ça, on peut
concevoir des <dfn>connexions</dfn> réseau : un tuyau virtuel entre un
ordinateur et un autre, avec une extrémité qui envoit des paquets, attend
des accusés de réception, et réexpédie les paquets qui se perdent, et
l'autre extrémité qui reçoit les paquets et les remet dans l'ordre. Quand un
paquet arrive sur un ordinateur, le système réseau consulte son contenu pour
voir ses références, et trouve dans ses tables à quelle connexion il
appartient.
</p>
<p>
Tout ceci est normalement fait par le système d'exploitation des
ordinateurs, et caché aux programmes. Les programmes, eux, se contentent de
réclamer une connexion, et ensuite d'utiliser le tuyau. Les données passent,
ils n'ont pas à se soucier de toute la machinerie interne.
</p>
<h3>Le protocole TCP</h3>
<p>
Sur internet, le protocole qui sert à établir des connexions est
<abbr lang="en" title="Transmission Control Protocol">TCP</abbr>. Pour
distinguer les connexions, TCP utilise un <dfn>numéro de port</dfn>, un
petit nombre (entre 1 et 65535), qu'on peut voir un peu comme le casier d'un
élève, alors que l'adresse IP correspond à « 45 rue d'Ulm ». Une connexion est
identifiée par quatre données :
</p>
<ul>
<li>l'adresse IP de l'ordinateur de départ ;</li>
<li>le port sur cet ordinateur ;</li>
<li>l'adresse IP de l'ordinateur d'arrivée ;</li>
<li>le port sur cet ordinateur</li>
</ul>
<p>
Chaque paquet échangé dans le cadre d'une connexion rappelle ces quatre
références. On peut remarquer que sur un ordinateur donné, le même port peut
participer à plusieurs connexions. De fait, ça arrive assez souvent, mais
jamais aux deux extrémités à la fois (même si rien ne l'interdit
fondamentalement).
</p>
<p>
Les connexions TCP sont toujours doubles : dans un sens et dans l'autre
entre les mêmes extrémités.
</p>
<p>
Du point de vue du programme, une connexion est un objet sur lequel on peut
lire et écrire des données. Sous Unix, ça se présente presque de la même
manière qu'un fichier. Le système d'exploitation sait à quel programme
chaque connexion active « appartient », et fait tout le nécessaire.
</p>
<h3>Clients et serveurs</h3>
<p>
Comme dans toutes relations de couple, aux débuts d'une connexion, il faut
que l'un des deux fasse le premier pas, alors que l'autre se contente
d'attendre. En informatique, l'extrémité de la future connexion qui attend
s'appelle un <dfn>serveur</dfn> (eh oui, c'est le contraire du restaurant,
où le serveur vient à votre table prendre la commande), tandis que
l'extrémité qui fait le premier pas (qui envoit le premier paquet) s'appelle
le <dfn>client</dfn>. Après l'échange de quelques paquets (trois, avec TCP)
pour vérifier qu'il y a bien un serveur au port demandé, pour se mettre
d'accord sur la taille des paquet, etc., la connexion est établié.
</p>
<p>
Une fois que c'est fait, il n'y a du point de vue du réseau plus de
différence entre les deux extrémités. Cependant, le dialogue entre les
programmes ne sera probablement pas symétrique : une fois une connexion
établie entre votre navigateur web et
<a href="http://www.google.com/">Google</a>, c'est bien votre navigateur web
qui va poser une question à Google et non l'inverse. Il arrive néanmoins que
ça finisse par être symétrique, en particulier dans le cas de dialogue en
direct (avec ytalk par exemple) ou de jeux en réseau sans serveur central.
</p>
<p>
L'important est que les deux extrémités se comprennent. Pour ça, elles
doivent encore une fois coder leurs données d'une certaine manière : encore
un protocole. Cette manière n'est d'ailleurs pas la même s'il s'agit de web,
de mail, ou d'autres activités tout aussi passionnantes.
</p>
<p>
Les plus attentifs doivent se poser une question : il y a sur l'ordinateur
de Google (dont l'adresse IP est 216.239.59.99) 65535 ports différents,
comment notre navigateur web a-t-il deviné le quel contacter ? La réponse
est simple : le web, c'est sur le port 80. Pourquoi 80 ? C'est comme ça. Les
services importants ont des numéros de port qui leur sont dédiés, l'IANA les
<a href="http://www.iana.org/assignments/port-numbers">recense</a>. Les
services moins répandus prennent un port plus ou moins au hasard, en
espérant ne pas entrer en conflit avec un autre service, et comme c'est la
même personne qui écrit les programme client et serveur c'est le même qui
est utilisé des deux côtés.
</p>
<p>
Sous Unix, il faut des droits spéciaux pour créer un serveur sur un port en
dessous de 1024, ce qui permet d'être sûr, quand on donne son mot de passe à
SSH (port 23) ou à IMAP (port 143), d'être bien en train de parler au
programme autorisé. Au dessus de 1024, c'est libre. Certains se rappellent
peut-être que le serveur web des élèves était
<code>http://www.eleves.ens.fr<strong>:8080</strong>/</code>. Ceci veut dire
qu'il était sur le port 8080 au lieu du 80 habituel, justepent parce qu'il
aurait fallu des droits supplémentaires pour avoir 80.
</p>
<p>
Pour le client, c'est en général plus simple : le programme laisse le
système d'exploitation choisir un port inutilisé. Certains programmes
forcent l'utilisation d'un port en dessous de 1024 pour prouver qu'ils ne
sont pas n'importe quel utilisateur, mais cette pratique tombe en désuétude
au profit de méthodes cryptographiques.
</p>
<h2>Plus pour nous faciliter la vie</h2>
<h3>Le DNS</h3>
<p>
Se rappeler les adresses IP, ce n'est pas facile. Et ce sera encore pire
avec IPv6. Mais le problème n'est pas nouveau : on a le même avec les
numéros de téléphone, et pour le résoudre on a inventé l'annuaire.
L'annuaire pour Internet s'appelle le
<abbr lang="en" title="Domain Name System">DNS</abbr>, et fonctionne bien
entendu en réseau.
</p>
<p>
À l'échelle d'un site, ou d'un fournisseur d'accès, il y a un (ou plusieurs)
ordinateur, que tous les autres connaissent par son adresse IP, et sur
lequel tourne un programme qui écoute sur le port 53 et qui se charge de
répondre aux questions du genre « quelle est l'adresse IP de
<code>www.google.com</code> ? ».
</p>
<p>
Ce programme n'a en général pas la réponse, mais il a l'adresse d'autres
ordinateurs à qui demander, qui eux-mêmes peuvent ne pas savoir mais avoir
l'adresse d'autres ordinateurs, etc. Le système est hiérarchique. Il y a à
la racine quelques ordinateurs (une douzaine) qui savent qui s'occupe des
<code>.com</code>, qui s'occupe des <code>.org</code>, qui s'occupe des
<code>.fr</code>, etc. Dans le cas des <code>.fr</code>, il y a encore
quelques ordinateurs, gérés par des organismes français (enfin, pas tous),
qui savent à qui s'adresser pour chaque domaine. Et ainsi de suite.
</p>
<p>
Par exemple, pour connaître l'adresse de <code>clipper.ens.fr</code>, il
faut commencer par interroger l'un des serveurs racine, par exemple
198.41.0.4, qui répond qui'il ne sait pas, mais que les <code>.fr</code>
sont gérés par 192.93.0.1, 193.51.208.13, et quelques autres. Si on
interroge l'un d'entre eux, on apprend qu'il ne sait pas non plus, mais il
nous informe que <code>ens.fr</code> est géré par 129.199.96.11 (on
reconnaît le 129.199 : c'est un ordinateur de l'ENS) et quelques autres.
Enfin, on interroge 129.199.96.11, et on obtient la réponse, à savoir
129.199.129.1
</p>
<p>
Bien sûr, tous les programmes pour faire ça sont déjà écrits : quand on
programme une nouvelle application réseau, il suffit d'utiliser la bonne
fonction de la bibliothèque standard.
</p>
<div class="metainformation">
Auteur : Nicolas George.
Dernière modification le <date value="$Date: 2004-04-12 17:58:46 $"/>.
</div>
</body>
</html>