Page sur les langues exotiques en LaTeX.
This commit is contained in:
parent
19cbcc3e45
commit
e21ad368bb
5 changed files with 788 additions and 4 deletions
|
@ -11,6 +11,14 @@
|
|||
|
||||
<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>
|
||||
|
||||
|
@ -205,7 +213,7 @@ syst
|
|||
|
||||
<div class="metainformation"> Auteurs : Éveline Prioux (1998),
|
||||
adaptation en HTML : Marie-Lan Nguyen (2000).
|
||||
Dernière modification : le <date value="$Date: 2004-02-24 22:00:29 $" />.
|
||||
Dernière modification : le <date value="$Date: 2004-04-12 17:58:01 $" />.
|
||||
</div>
|
||||
|
||||
</body> </html>
|
||||
|
|
|
@ -64,6 +64,7 @@ qu'un sujet important a
|
|||
<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="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="lettre.html">Écrire une lettre</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">
|
||||
Auteur : François-Xavier Coudert. Dernière modification le
|
||||
2003-02-05.
|
||||
<date value="$Date: 2004-04-12 17:58:01 $" />.
|
||||
</div>
|
||||
|
||||
</body>
|
||||
|
|
355
logiciels/latex/langues.tml
Normal file
355
logiciels/latex/langues.tml
Normal 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 — 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 <1999/12/01> 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>œ</code>,
|
||||
<code>“</code>, <code>”</code>, <code>‘</code>,
|
||||
<code>’</code>, <code>€</code>, <code>…</code>,
|
||||
<code>—</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>
|
|
@ -283,11 +283,12 @@ tous les c
|
|||
avec Vim ou Emacs (ou dans un terminal)</a></li>
|
||||
<li><a href="&url.tuteurs;internet/courrier/international.html">Gérer son
|
||||
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>
|
||||
|
||||
<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>
|
||||
|
||||
</body>
|
||||
|
|
419
theorie/internet.tml
Normal file
419
theorie/internet.tml
Normal 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>
|
Loading…
Reference in a new issue