Techniques d'implémentation des applications réseaux,
Philippe.Dax@enst.fr,
© ENST - 1996-2005
Plan
© (Copyright) Philippe Dax - 1996-2005
Couche application
La couche application dans les modèles OSI et Internet
Modèle OSI en 7 couches
Modèle Internet en 5 couches
Modèle ALF (Application Level Framing)
Interface de programmation avec les couches sous-jacentes
Opérations verticales (interface de services)
Connexion/déconnexion
Entrées/sorties
Boucles d'événements
Timeouts
Protocoles inter applications
Opérations horizontales (interface peer to peer)
Veiller à la bonne synchronisation des entrées/sorties
Automates à états
Architectures
Modèle client-serveur
Client centralisé, serveurs répartis
Relais
Passerelles
Coopération de serveurs
Coopération d'applications
Modèle client-serveur
Serveur centralisé, clients répartis
Manipulation de fichiers - serveur NFS
Lecteur de mail - serveur POP
Lecteur de news - serveur NNTP
Browser WWW - serveur HTTPD
Client centralisé, serveurs répartis
Monitoring réseau
SNMP
Robots et moteurs de recherche
Google
Yahoo
Relais
Store and forward
Mail relais
News feeds
Proxys
déportation de l'opération d'origine sur une machine d'accès global
proxy-cache
firewall
agents proxy-snmp
Passerelles
Tunnels
Encapsulation d'un protocole dans un autre
Réflecteurs
transfert des données par un protocole offrant des spécificités moindre
Translateurs
translation des données de/vers une machine d'accès global (proxy RTP)
Mixeurs
transformation des données par des procédés de codage / compression
Coopération de serveurs
Hiérarchie arborescente de serveurs
DNS (Domain Name System)
DSA X500 (Directory System Agent)
Internet cache (voisins et parents)
Squid
Coopération d'applications
Diffusion de groupe par multicast
Application à la fois client et serveur
Collecticiels
Répartition de ressources et d'informations
Peer to peer (P2P)
Morceaux de musique MP3 (Napster)
Implémentation d'applications classiques sous Unix
Communications inter processus locaux
Communications inter processus distants
Inetd
Protocoles basés ascii
Conventions d'erreurs ascii
Journalisation des messages d'erreur: syslog
Communications inter processus locaux
Nécessite un système multitâche
coopération de processus
Mécanismes de communications internes
pipe
tube de communication limité à une même filiation de processus
pipe nommé
nommage du tube limité à l'arborescence Unix d'une machine
IPC SystemV
mémoire partagée
files de messages
sémaphores
socket de la famille AF_UNIX
streams
interface avec les drivers périphériques (empilements de protocoles)
Communications inter processus distants
Nécessite des protocoles réseaux sous-jacents
adressage unique
adresse numérique unique : IP
adresse par nom : DNS
transport
fiable / connecté : TCP
non fiable / non connecté : UDP
port d'attache
API socket
point de connexion lié à un transport (socket)
attachement de ce point de connexion à une adresse "machine + port" (bind)
mécanisme de rendez-vous (connect/accept)
Mapping des services réseaux
mapping service - port/protocole dans /etc/services (facultatif)
service numero/protocole alias # commentaire
getservbyname()
API RPC (Remote Procedure Call)
adressage d'une procédure distante (nom du programme, nom de la procédure, numéro de version)
enregistrement du serveur auprès d'un portmapper (portmap, port 111)
mapping décrit dans /etc/rpc
utilisation de XDR (Echange de données indépendantes de l'architecture interne des machines)
mise à la disposition de "stubs" pour faciliter la programmation
précompilateur "rpcgen" générateur des stubs et fichiers include
Inetd
Daemon de daemons réseaux
Ecoute simultanément sur tous les ports des daemons réseaux
Fichier de configuration /etc/inetd.conf
service stream|dgram proto [no]wait owner path argv
Fonctions
bind sur tous les ports
Effectue l'accept
fork/exec sur le daemon sollicité
Duplique le descripteur de socket sur stdin et stdout
Mise oeuvre
Lancé à la fin du "boot" par /etc/rc.local
Relit la table /etc/inetd.conf par un kill -HUP pid_inetd
Incidence sur l'écriture d'un serveur
Suppression des appels système (socket, bind, listen, accept, fork, exec)
Descripteur de socket sur <stdin> et <stdout>
getpeername(0, &sin, &len) : permet de retrouver l'adresse de l'appelant
Protocoles basés ascii
Prise en compte de l'hétérogénéité des systèmes
Lignes terminées par <cr><lf> : MsDos, Windows
Lignes terminées par <lf> : UNIX
Lignes terminées par <cr> : MacOS
Lignes terminées par <cr><lf> : Network
Utilisation par telnet host port
Facile à utiliser
Mode de mise au point
Protocoles "ascii-based" biens connus
SMTP : mail
POP : mail
NNTP : news
FTP : ftp
HTTP : www
Conventions d'erreurs ascii
Erreurs sous forme ascii rendues au client
Comptes-rendus d'erreurs visibles par le client et non conservées par le serveur
Compréhensible par le client (Ascii)
Format: numéro: texte explicatif
Classification des erreurs selon les RFC en vigueur
100-199: erreurs système
200-299: informations à l'utilisateur (succès)
300-399: informations de progression
400-499: erreurs de syntaxe dans le protocole
500-599: rapports de terminaison anormale
Journalisation des messages d'erreur: syslog
Les daemons sont déconnectés du terminal
Facilités de syslog
Kernel
Daemon
Mail
Lpd
Auth
User
Local0 à local7
Niveaux de sévérité
Emergency
Critic
Error
Notice
Info
Debug
Fichier de configuration syslog.conf
destination
destination: console, fichier (/var/log/facility.log), mail, @host
Réseau de daemons syslogd
Fonctions
#include <syslog.h>
openlog(facility, flags, err_level)
syslog(err_level, "message")
syslog(err_level, "message %m")
closelog()
Choix d'implémentation d'une application réseau
Choix des critères et objectifs en fonction du type d'application
performance
portabilité
reutilisabilité
sécurité
sureté
demonstrabilité
Choix de l'architecture
OSI vs ALF
client/serveur vs émetteur/récepteur
Choix de la plateforme
serveur Unix / serveur NT
station Unix / PC
NC
multi-plateforme
Choix du système
systèmes: Unix, Windows, MacOS
mono-système
multi-système
Choix du langage
C, C++ : bibliothèques C, nsl, socket, bind, thread, X*
Java : classes
Scripting: Tcl/Tk, Python, Perl, Shell
Choix du transport
contrôle ou non des pertes de paquets
contrôle ou non de l'ordre de délivrance des paquets
contrôle ou non de la duplication des paquets
contrôle ou non de la congestion
Choix d'implémentation d'une application réseau (2)
TCP ou UDP (mode connecté ou non connecté)
contrôle implicite par TCP, contrôle explicite par UDP, pas de contrôle
Dépend de la taille des messages
Dépend des délais induits
Dépend de la capacité de l'application à contrôler le flux des données
Daemon standalone ou inetd
Dépend de la taille de l'espace swap local
Dépend de la vitesse à traiter des requêtes
Dépend de la fréquence des requêtes (évaluation de la sollication du service)
Dépend du maximum de ports écoutables par inetd
Daemon itératif ou concurrentiel
Dépend de la capacité du serveur à servir de manière séquentielle ou parallèle
Dépend de la durée de traitement d'une requête par le serveur
Dépend de la granularité des données
Nombre de processus daemons sur un même port
Daemon multi-threadé
Dépend de la granularité des données et de leurs types
Implémentation d'applications avec le Web
HTTP
Scripts CGI
Applications locales déclenchées par le serveur
(Viewers)
Java
3D
HTTP
Protocole ASCII
accessible par telnet
telnet www.host.la 80
GET / HTTP/1.1
<cr><cr>
Opérations
GET
HEAD
POST
PUT
URI/URL
methode://hote[:port]/chemin[/#ancre][?paramétres]
Méthodes
http
ftp
telnet
gopher
wais
file
mailto
news
Racine des pages
différente de celle d'Unix (/), définie dans httpd.conf (/www/pages par ex.)
arborescence accessible en lecture par le serveur httpd
pages individuelles accessibles par http://hote/~user/
page par défaut: index.html (en rw-r--r--)
Scripts CGI
Production dynamique de pages HTML
Protocole ASCII
Méthode GET
Paramètres transmis dans l'URL après le ?
Paramètres récupérés dans la variable QUERY_STRING
Méthode POST
Paramètres transmis séparemment de l'URL
Paramètres récupérés sur l'entrée standard <stdin>
Formulaires
Balises <form action=script.cgi method=...>...</form>
Paramètres transmis dans l'ordre physique où ils apparaissent à l'écran
Format de la chaîne des paramètres
var1=val1&var2=val2&var3=val3
espace codé '+', caractères de ponctuation codés '%XX' (XX=valeur héxa)
Bibliothèques de fonctions d'analyse syntaxique en C
get_cgi_info()
get_form_entries()
Identité du serveur
nobody
login spécifique déclaré dans httpd.conf
port privilégié (80) ou non
Applications locales déclenchées par le serveur
Formats non reconnus par les navigateurs
Textes aux formats PostScript et PDF
Images aux formats autres que GIF, JPEG, PNG
Audio
Vidéo
Type de média MIME
Content-Type: type/soustype[; paramètre=valeur ...]\n\n
Content-Type: text/html\n\n
Content-Type: image/tiff\n\n
Content-Type: audio/basic\n\n
Content-Type: video/mpeg\n\n
Content-Type: application/postscript\n\n
Content-Type: application/pdf\n\n
Content-Type: application/x-www-appli\n\n
Fichiers mailcap, mime.types
/usr/local/lib/netscape/mailcap
/usr/local/lib/netscape/mime.types
Java
Langage Java
Conçu par Sun Microsystems (James Gossling)
Syntaxe proche du C et du C++
Orienté objet, notion de classes
Pas de java-préprocesseur (#include, #define)
Pas de pointeurs ni de fonctions, que des méthodes
Insuffisances de Java
Pas de fork(0, pipe(), select(), socket(RAW)
Compilateur Javac
Produit du Bytecode (code indépendant des processeurs, interprétable)
Produit un Bytecode fichier.class à partir d'un source fichier.java
javac programme.java
Interpreteur Java
Interprétation locale du Bytecode (fichier.class)
java programme.class
Toolkit graphique Awt
Affichage basé pixel et non vectoriel
Applet
Téléchargement du Bytecode (fichier.class) dans le browser
Interprétation du Bytecode par le browser
Attention à la compatibilité (JDK-1.02 / JDK-1.1.8 / JDK-1.2 / JDK-1.4.1)
Exécution dans une zone de visualisation dimensionnée à l'avance (java zone)
Contraintes de sécurité drastiques au niveau des fichiers et du réseau
JavaScript
Le texte source est directement interprété par le browser, pas de bytecode
Le texte source est dans la page HTML: <script> source </script>
Norme Ecma (ecmascript)
3D
VRML - Virtual Reality Modeling Language
Conçu par Silicon Graphics (SGI)
Browser Webspace
Nécessite une machine puissante en calculs flottants et en graphique vectoriel (accélérateurs graphiques)
OpenGL
Conçu par Silicon Graphics (SGI)
Bibliothèque graphique 3D, nécessite des cartes accélératrices adhoc
Mesa3D
OpenGL-like public
Bibliothèque graphique 3D, entièrement logiciel
Java3D
Conçu par Sun javasoft
Classes graphique 3D, très lent