Professional Documents
Culture Documents
Serveur de milieu
Logique
Logique
Logique
Logique Donnes
Logique
Serveur
Donnes
Donnes
excution requte
Serveur itratif
traite squentiellement les requtes adapt aux requtes qui peuvent s'excuter rapidement souvent utilis en mode non connect (recherche de la performance) le serveur accepte les requtes puis les "dlgue" un processus fils (traitement de plusieurs clients) adapt aux requtes qui demandent un certain traitement (le cot du traitement est suffisamment important pour que la cration du processus fils ne soit pas pnalisante) souvent utilis en mode connect
Serveur concurrent
le serveur conserve localement un tat pour chacun des clients connects : informations sur le client, les requtes prcdentes, le serveur ne conserve aucune information sur l'enchanement des requtes...
Incidence sur les performances et la tolrance aux pannes dans le cas o un client fait plusieurs requtes successives
performance --> service sans tat tolrance aux pannes --> service avec tats
Ds lors qu'une application est rpartie, elle se dcompose en plusieurs processus qui doivent communiquer (changes de donnes) Deux grands types de schma de communication
communication par mmoire partage (ou fichier) communication par passage de messages dans des communications locales : entre processus s'excutant sur le mme hte dans des communications distantes : entre processus s'excutant sur des htes distants
62
Les processus se partagent une zone de mmoire commune dans laquelle ils peuvent lire et/ou crire
P1
Zone de mmoire partage entre P1 et P2 write() read() read() write()
P2
Intrt : communications transparentes, limitation des copies mmoire Problme : gestion de l'accs une ressource partage
problme si deux critures simultanes (ordre dordonnancement, atomicit des oprations) les processus P1 et P2 doivent se synchroniser pour accder au tampon partag (verrou, smaphore, )
63
Communications locales
les deux processus s'excutent sur la mme machine donc peuvent se partager une partie de leur espace d'adressage exemple : les threads s'excutent dans le contexte d'un mme processus la mmoire partage est physiquement rpartie le gestionnaire de mmoire virtuelle permet de regrouper les diffrents morceaux selon un seul espace d'adressage problme de cohrence mmoire...
Communications distantes
le canal de communication est unidirectionnel (pas de problme de synchronisation) communications entre 2 processus uniquement : l'un crit dans le tube, l'autre lit
Cration du tube et des processus fils fork(); exec(); write()
Exemple : sh$ ls -l | wc -l
sh
fork(); exec(); read()
ls -l
wc -l
Les processus n'ont pas accs des "variables" communes Ils communiquent en s'changeant des messages
au moins deux primitives : send() et recv() des zones de mmoire locales chaque processus permettent l'envoi et la rception des messages l'metteur/rcepteur doit pouvoir dsigner le rcepteur/metteur distant zones d'mission et rception distinctes ? nombre d'metteurs/rcepteurs dans une zone ? oprations bloquantes/non bloquantes ?
Problmes
write
P2 P3
read
P1
P2
P1
read
--> dissocier le tampon d'mission et de rception --> avoir autant de tampons de rception que d'metteurs potentiels --> il ne reste plus alors au protocole qu' s'assurer que deux missions successives (d'un mme metteur) n'crasent pas des donnes non encore lues (contrle de flux)
Quand un appel une primitive send() ou recv() doit-il se terminer ? Plusieurs smantiques en rception :
aussitt (recv() non bloquant) quand les donnes ont t reues et recopies depuis le tampon de rception local (le tampon de rception est de nouveau libre)
send() peut rendre la main aussitt (send() non bloquant) quand les donnes ont t recopies dans le tampon d'mission local (les donnes peuvent tre modifies au niveau de l'application) quand les donnes ont t recopies dans le tampon de rception distant (le tampon d'mission local est de nouveau libre) quand le destinataire a consomm les donnes (le tampon de rception est de nouveau libre)
Oprations bloquantes
Intrt :
le processus peut faire autre chose en attendant que les donnes soient mises ou reues
Le processus a tout de mme besoin d'tre inform de la compltion de l'opration (lecture ou criture) Deux possibilits :
attente active : appels rguliers la primitive jusqu' compltion attente passive : le systme informe le processus par un moyen quelconque de la compltion de l'opration (signaux par exemple)
Mcanisme de communications locales interprocessus (ou depuis le noyau vers un processus) permettant de notifier un vnement Principe : interruption logicielle quand l'vnement se produit Le processus
indique les signaux qu'il souhaite capter (provoquant son interruption) met en place un handler (fonction particulire) qui sera excut quand l'vnement se produira
Application read()
read()
read()
Recopie
Retour
Attente active
handler() read()
Recopie
Retour
Attente passive
Dsignation du destinataire/metteur
Pour faire du passage de messages, il est ncessaire de dsigner l'autre extrmit de la communication Dsignation explicite
du ou des processus destinataire(s)/metteurs recevoir un message de n'importe qui mettre un message n'importe qui (diffusion) une phase d'tablissement de connexion dsigne les deux entits communicantes
Dsignation implicite
Les sockets
Deux processus communiquent en mettant et recevant des donnes via les sockets Les sockets sont des portes d'entres/sorties vers le rseau (la couche transport) Une socket est identifie par une adresse de transport qui permet d'identifier les processus de l'application concerne Une adresse de transport = un numro de port (identifie l'application) + une adresse IP (identifie le serveur ou l'hte dans le rseau)
Le serveur doit utiliser un numro de port fixe vers lequel les requtes clientes sont diriges Les ports infrieurs 1024 sont rservs :
"well-known ports" ils permettent d'identifier les serveurs d'applications connues ils sont attribus par l'IANA
ils utilisent un port quelconque entre 1024 et 65535 condition que le triplet <transport/@IP/port> soit unique ils communiquent leur numro de port au serveur lors de la requte ( l'tablissement de la connexion TCP ou dans les datagrammes UDP)
Une socket est un fichier virtuel avec les oprations d'ouverture, fermeture, criture, lecture, Ces oprations sont des appels systme Il existe diffrents types de socket associs aux diffrents services de transport :
stream sockets (connection-oriented) - SOCK_STREAM utilise TCP qui fournit un service de transport d'octets fiable, dans l'ordre, entre le client et le serveur datagram sockets (connectionless) - SOCK_DGRAM utilise UDP (transport non fiable de datagrammes) raw sockets - SOCK_RAW utilise directement IP ou ICMP (ex. ping)
Flux TCP
@IP serveur
En mode connect...
le processus serveur doit dj tourner le serveur doit avoir cr au pralable une socket pour recevoir les demandes de connexion des clients en crant une socket locale au client en spcifiant une adresse IP et un numro de port pour joindre le processus serveur
Le client demande alors l'tablissement d'une connexion avec le serveur Si le serveur accepte la demande de connexion
il cre une nouvelle socket permettant le dialogue avec ce client permet au serveur de dialoguer avec plusieurs clients
En mode connect...
socket()
Cration du descripteur local Demande d'ouverture de connexion Attachement d'un numro de port la socket Le serveur autorise NMAX connexions (le service est ouvert !) Le serveur accepte (ou attend) une connexion pendante et cre une nouvelle socket ddie au client
socket() connect()
Demande de connexion
Connexion ouverte
write()
Requte
Traitement de la requte
read()
Rponse
write()
En mode connect...
Paramtres en entre socket() bind() listen() connect() accept() read() write()
type, domaine, protocole sock_id, port sock_id, NMAX sock_id, @sock_dest sock_id client_sock_id, @recv_buf, lg client_sock_id, @send_buf, lg @sock_src, client_sock_id read_lg write_lg
Paramtres en sortie
sock_id
En mode connect...
Au retour d'accept() File des connexions en attente (pendantes) id=xxx
Processus client
id=xxx1
id=xxx2
TCP
port=yyy IP
TCP
port=80 IP
Internet
En mode connect...
write(m)
read(m)
N lectures
r3
r4
...
rN
il doit connatre l'adresse de la socket du serveur le serveur doit avoir cr la socket de rception
Le client envoie sa requte en prcisant, lors de chaque envoi, l'adresse de la socket destinataire Le datagramme envoy par le client contient l'adresse de la socket mettrice (port, @IP) Le serveur traite la requte et rpond au client en utilisant l'adresse de la socket mettrice de la requte
socket()
bind() recv_from()
send_to()
Requte
recv_from()
Rponse
send_to()
Paramtres en sortie
sock_id
Processus client
TCP TCP
Processus serveur
port=yyy IP
IP
Internet
read()
Traitement de la requte cliente
read()
Traitement de la requte cliente
write() close()
write() close()
Par dfaut, les primitives connect(), accept(), send_to(), recv_from(), read(), write() sont bloquantes
recv() sur un tampon vide attendra l'arrive des donnes pour rendre la main send() sur un tampon plein attendra que les donnes quitte le tampon pour rendre la main accept() ne rend la main qu'une fois une connexion tablie (bloque si pas de connexions pendantes) connect() ne rend la main qu'une fois la connexion cliente tablie (sauf si pas entre listen() et accept())
Il est possible de paramtrer la socket lors de sa cration pour rendre les oprations non bloquantes Comportement d'une mission non bloquante
tout ce qui peut tre crit dans le tampon l'est, les caractres restants sont abandonns (la primitive retourne le nombre de caractres crits) si aucun caractre ne peut tre crit (tampon plein), retourne -1 avec errno=EWOULDBLOCK (l'application doit ressayer plus tard) s'il n'y a rien lire dans la socket, retourne -1 ... (l'application doit ressayer plus tard)
s'il n'y a pas de connexion pendante, retourne -1 ... (l'application doit ressayer plus tard)
la primitive connect() retourne immdiatement mais la demande de connexion n'est pas abandonne au niveau TCP...
fonctions setsockopt() et getsockopt() options boolennes et non boolennes diffusion (dgram uniquement ; remplace l'@IP destinataire par l'@ de diffusion de l'interface) keepalive : teste rgulirement la connexion (stream) tcpnodelay : force l'envoi des segments au fur et mesure des critures dans le tampon taille du tampon d'mission, taille du tampon de rception, type de la socket
exemple : DAYTIME (RFC 867) port 13 sur UDP et sur TCP qui permet de lire la date et l'heure sur le serveur 13/TCP : la demande de connexion du client dclenche la rponse ( une requte donc implicite) : le client nmet aucune requte 13/UDP : la version UDP de DAYTIME requiert une requte du client : cette requte consiste en un datagramme arbitraire qui nest pas lu par le serveur mais qui dclenche lmission de la donne ct serveur
certains systmes ferment tout accs UDP pour des raisons de scurit (pare-feu) non duplication des ressources associes au service (corps du serveur) un seul processus utilisant des oprations non bloquantes de manire grer les communications la fois en mode connect et en mode non-connect deux implmentations possibles : en mode itratif et en mode concurrent
Fonctionnement
En mode itratif
le serveur ouvre la socket UDP et la socket TCP puis boucle sur des appels non bloquants accept() et recv_from() sur chacune des sockets si une requte TCP arrive le serveur utilise accept() provoquant la cration dune nouvelle socket servant la communication avec le client lorsque la communication avec le client est termine, le serveur ferme la socket "cliente" et ritre son attente sur les deux sockets initiales si une requte UDP arrive le serveur reoit et met des messages avec le client lorsque les changes sont termins, le serveur ritre son attente sur les deux sockets initiales
En mode concurrent
un automate gre l'arrive des requtes (primitives non bloquantes) cration dun nouveau processus fils pour toute nouvelle connexion TCP traitement de manire itrative des requtes UDP elles sont traites en priorit pendant ce temps, les demandes de connexion sont mises en attente
Un serveur qui rpond plusieurs services (une socket par service) Pourquoi un serveur multi-services ?
problme li la multiplication des serveurs : le nombre de processus ncessaires et les ressources consommes qui y sont associes le code ralisant les services nest prsent que lorsquil est ncessaire la maintenance se fait sur la base du service et non du serveur : ladministrateur peut facilement activer ou dsactiver un service
Avantages
le serveur ouvre une socket par service offert, attend une connexion entrante sur lensemble des sockets ouvertes lorsquune demande de connexion arrive, le serveur cre un processus fils qui prend en compte la connexion le processus fils excute (via exec() sur systme UNIX) un programme ddi ralisant le service demand
L'invocation d'un service Internet standard (FTP, TELNET, RLOGIN, SSH, ) ncessite la prsence ct serveur d'un processus serveur
On parle de dmon A priori, il faudrait un dmon par service Problme : multiplication des services --> multiplication du nombre de dmons Sous UNIX, un super-dmon : inetd
Le dmon inetd
Un "super serveur"
un processus multi-services multi-protocoles un serveur unique qui reoit les requtes activation des services la demande permet d'viter d'avoir un processus par service, en attente de requtes une interface de configuration (fichier inetd.conf) permettant ladministrateur systme dajouter ou retirer de nouveaux services sans lancer ou arrter un nouveau processus
Le processus inetd attend les requtes l'aide de la primitive select() et cre un nouveau processus pour chaque service demand (except certains services UDP qu'il traite lui-mme)
Le fichier /etc/inetd.conf
# Internet services syntax : # <service_name> <socket_type> <proto> <flags> <user> <server_pathname> <args> # wait : pour un service donn, un seul serveur peut exister un instant donn # donc le serveur traite l'ensemble des requtes ce service # stream --> nowait : un serveur par connexion ftp stream tcp nowait root /etc/ftpd ftpd -l tftp dgram udp wait root /etc/tftpd tftpd shell stream tcp nowait root /etc/rshd rshd pop3 stream tcp nowait root /usr/local/lib/popper popper -s -d -t /var/log/poplog # internal services : # => service ralis par inetd directement time stream tcp nowait root internal time dgram udp nowait root internal
Scrutation : mcanisme permettant l'attente d'un vnement (lecture, connexion, ) sur plusieurs points de communication
exemple : une attente de connexion ( accept) sur une des sockets empche l'acceptation sur les autres rendre les primitives non bloquantes l'ouverture de la socket inconvnient : attente active (dans une boucle)
Premire solution
Deuxime solution
crer un fils par socket pour la scrutation d'un service inconvnient : lourd, gaspillage de ressources mais avantage conserv d'activation la demande permet de raliser un multiplexage d'oprations bloquantes (scrutation) sur des ensembles de descripteurs passs en argument : descripteurs sur lesquels raliser une lecture descripteurs sur lesquels raliser une criture descripteurs sur lesquels raliser un test de condition exceptionnelle (arrive d'un caractre urgent) un argument permet de fixer un temps maximal d'attente avant que l'une des oprations souhaites ne soit possible
l'un des vnements attendus sur un descripteur de l'un des ensembles se ralise : les descripteurs sur lesquels l'opration est possible sont dans un paramtre de sortie le temps d'attente maximum s'est coul le processus a capt un signal (provoque la sortie de select())