Académique Documents
Professionnel Documents
Culture Documents
TCP/IP - Sockets
Rappels
C.Crochepeyre Applications CS 1
PLAN
• Modèle client/serveur
• Modèle ISO et protocole TCP/IP
• Comment ça marche?
• La programmation: les sockets
• Exemples client/serveur: UDP et TCP
C.Crochepeyre Applications CS 2
Modèle client/serveur : C/S
• L’application informatique est éclatée entre
– La partie application cliente : processus « client »
– La partie application serveur : processus « serveur »
• Le client fournit au serveur les données pour effectuer des
traitements: demande de service
• Le serveur rend le service et retourne au client les résultats
client serveur
C.Crochepeyre Applications CS 3
Pourquoi?
• Le serveur peut être sollicité par plusieurs clients pour le même service
• Chaque application peut être distante : réseau
• Clients et serveur peuvent s’exécuter sur des machines différentes. Les
puissances de calcul peuvent être mieux réparties
• Les applications clientes peuvent être différentes
M2
M1
M3
M2
M1
client serveur
C.Crochepeyre Applications CS 5
Côté serveur
• Le serveur doit être actif et attendre une demande
• A la demande d’un client, il doit récupérer les données
pour effectuer le traitement
• Il doit renvoyer au client concerné les résultats non
formatés
M3
serveur
client
M2
M1
C.Crochepeyre Applications CS 6
• Serveur itératif
– Le serveur ne traite qu’une demande à la fois
clients serveur
• Serveur parallèle
– Le serveur traite plusieurs demandes simultanément
clients
serveur
C.Crochepeyre Applications CS 7
Les échanges par réseaux
C.Crochepeyre Applications CS 8
Modèle OSI
C.Crochepeyre Applications CS 9
• Les couches basses:
– Physique: transmission binaire
– Liaison: transmission de trames
– Réseau: acheminement des paquets, routage, interconnexion des sous-
réseaux
• Les couches hautes
– Transport: transport de bout en bout des messages, découpage et
réassemblage (paquets), gestion de la connexion
– Session: dialogue entre tâches distantes synchronisation
– Présentation: présentation des données échangées entre applications
– Application: accès aux services par l’utilisateur
• Protocole simplifié: TCP/IP
C.Crochepeyre Applications CS 10
Le protocole TCP/IP
C.Crochepeyre Applications CS 11
• Le réseau Ethernet
– Réseau local
– Norme IEEE 802.3 technique d’accès CSMA/CD
– Topologie: segment de bus
– Vitesse de transmission de 10Mbits/s à 1000 Mbits/s
– Supports: câble coaxial, paires torsadées, fibre optique
– Avantages: simplicité, faible coût, débit élevé, connexion/déconnexion, …
– Inconvénients: durée de transmission bornée, absence de récupération
d’erreurs au niveau liaison, pas de mécanisme de priorité…
C.Crochepeyre Applications CS 12
• Le protocole IP
– Interconnexion de machines situées sur des réseaux différents.
– Assure:
• L’adressage par des adresses Internet
• Le routage
• La fragmentation et réassemblage des paquets
• Le contrôle des erreurs
• Le contrôle des flux
• Le contrôle de la durée de vie du datagramme
– Deux services: send et deliver
– Avantage: hétérogénéité des sous réseaux que doivent traverser les
messages des deux machines
– Met en communication deux machines via des adresses Internet
C.Crochepeyre Applications CS 13
• UDP et TCP
– Deux services transport, couche supérieure à IP
– UDP: communication légère sans exigence de fiabilité ni de temps de
réponse
• Transmission de messages
• Possibilité de perte, duplication, déséquencement des messages: contrôle
par la couche supérieure application
Exemple TFTP (transfert de fichiers)
– TCP: communication fiable avec connexion
• circuit virtuel entre deux processus
• Pas de message mais un flot d’octets fragmentés en segments
• Fiabilité avec numérotation des octets, acquittement, ré-
ordonnancement: contrôle de flux
Exemple SMTP (mail)
– Communication entre deux processus via des n° de port
C.Crochepeyre Applications CS 14
Adresses IP
C.Crochepeyre Applications CS 15
• Classe A: 0.0.0.0 à 127.255.255.255
réseau @locale
0
1 7 24
C.Crochepeyre Applications CS 16
• Adresse réseau
– Identificateur réseau suivi de zéro
• 163.173.0.0 : réseau 163.173 de classe B
– Diffusion au réseau (broadcast)
• Identificateur du réseau suivi de un
• 163.173.255.255 diffusion au réseau 163.173 de classe B
• Adresse machine
– Identificateur réseau et machine
– 163.173.224.27: machine 224.27 du réseau 163.173 de classe B
– 163.x.x.x: localhost désigne la machine locale
– 0.0.0.0 utilisé si adresse inconnue de la machine
• Adresse sous réseau
– Utilisation des adresses machines comme adresse sous réseau
– Masque de réseau: 255.255.0.0 pour la classe B
– Masque de sous réseau: 255.255.255.0 pour le sous réseau
Si @IPdest & masque = @de la machine; alors envoi à la machine - sinon
routeur (@IPdest & masque, @IPmachine)
C.Crochepeyre Applications CS 17
• Adresse Ethernet
– Chaque machine = adresse éthernet sur 48 bits
– Adresse physique
– Correspondance entre @IP et @Ethernet (@MAC)
• ARP Adress Resolution Protocol:
– @IP -> @Ethernet -> machine
– M1 envoie un message ARP avec son @IPM1et @EthernetM1
à toutes les machines, si M2 reconnaît son @IPM2
– M2 répond et renvoie @EthernetM2
– M1 met à jour sa table ARP avec les deux adresses de M2
– M2 met à jour sa table ARP avec les deux adresses de M1
• RARP Reverse ARP:
– Une station recherche son @IP dans une table inversée de
correspondance
– machine -> @Ethernet -> @IP
C.Crochepeyre Applications CS 18
Comment ça marche?
• Les ports:
– Côté serveur: chaque service (application) ouvre un port de communication
identifié par un n°
– Côté client : chaque client (application) ouvre un port de communication
identifié par n°
– La communication s’établit entre deux applications identifiées (ports) sur
deux machines identifiées (@IP).
• Envoi de paquets :
– UDP: le message envoyé est découpée en datagrammes
– TCP: le flot d’octets est bufferisé en segments
• Les couches UDP et TCP
– UDP et TCP ajoutent aux données les n° ports: port_dest, port_exp
C.Crochepeyre Applications CS 19
• Couche IP:
– IP ajoute, entre autres, aux données transmises par UDP ou TCP les
adresses IP des machines (destinataire et expéditeur)
@dest, @exp, données…. @dest, @exp, données….
• Les paquets sont acheminés via les réseaux jusqu’à la machine
destinataire @dest
• Les données sont transmises à l’application identifiée par son n°
de port et récupère l’@IP de l’expéditeur
C.Crochepeyre Applications CS 20
Le client interroge le serveur
Serveur Client
Port PS Port PC
« Pourquoi? » « Pourquoi? »
UDP UDP
PS PC « Pourquoi? » PS PC « Pourquoi? »
IP IP
@S @C PS PC « Pourquoi? » @S @C PS PC « Pourquoi? »
@S @C
C.Crochepeyre Applications CS 21
Programmation: les sockets
• Programmation des points terminaux de communication entre deux processus
– Une socket à chaque extrémité du canal de communication
• Point de sortie pour l’émission de données
• Point d’entrée pour la réception de données
C.Crochepeyre Applications CS 22
• Descripteur
– Référence attribuée dans le processus créateur
– utilisation des descripteurs de fichiers:
• Entrée dans la table des descripteurs du processus avec
pointeur vers une structure interne de type socket
• Redirection possible d’un fichier standard vers une socket
• fork() : le fils hérite des descripteurs donc des sockets
• Lecture et écriture en spécifiant le descripteur
Table des
fichiers
Table des Files
descripteurs i-noeud
Connexions en attentes
du socket Connexions actives
processus A
Data à émettre
Data à recevoir
Structure
socket
C.Crochepeyre Applications CS 23
• Domaine
– Deux domaines possibles
• Internet pour une communication distante
• Unix pour une communication interne (si besoin)
– Un format d’adresses de la socket selon le domaine
– Des protocoles associés au domaine
• Nom
– Référence pour le processus et les autres processus
• Une structure interne avec:
– Pour une communication locale: nom de fichier
– Pour une communication distante: une adresse transport
adresse réseau + n° de port
• Tout processus, non fils, peut hériter de la socket à condition
que le descripteur soit « attaché » à cette référence
– Similitude avec un fichier
• La référence d’une socket est dans un i-nœud particulier
C.Crochepeyre Applications CS 24
– Socket distante
• Côté client
– Un client doit connaître la référence de la socket serveur afin de
l’appeler
– La référence de la socket cliente peut être laissée à la charge du
système
• Côté serveur
– La référence de la socket serveur doit être connue du client
– La référence de la socket cliente est transmise automatiquement
au serveur lors de la demande du client. Le serveur peut ainsi lui
répondre.
C.Crochepeyre Applications CS 25
• Le type
– Sémantique associée à la communication
• SOCK_DGRAM pour mode datagramme : des messages
• SOCK_STREAM pour mode connecté : un flot de données
– Similitudes avec
• le courrier : l’expéditeur écrit au destinataire avec son adresse dans
le courrier, pour la réponse
• le téléphone : l’appelant compose le n°, l’appelé décroche et une
ligne de communication est établie entre les deux n°. Ils raccrochent,
la ligne est libérée.
• Deux protocoles, deux modes de communication
– Pour assurer la sémantique (type)
• UDP pour SOCK_DGRAM
• TCP pour SOCK_STREAM
C.Crochepeyre Applications CS 26
Mode datagramme: le protocole UDP
Côté Client Côté Serveur
création d’une socket création et attachement
(attachement) d’une socket
socket()/bind() socket() et bind()
construction
adresse du serveur
attente message du client
envoi message au serveur réception
sendto() recvfrom()
à une @serveur connue @client
C.Crochepeyre Applications CS 27
Mode connecté: le protocole TCP
Côté Client Côté Serveur
création d’une socket création et attachement
(attachement) d’une socket d’écoute
socket()/bind() socket() et bind()
C.Crochepeyre Applications CS 28
Les primitives de création
C.Crochepeyre Applications CS 29
• Suppression d’une socket
close(sock)
int sock; descripteur socket
C.Crochepeyre Applications CS 30
• Attachement d’une adresse à une socket: nom de la socket
– Le descripteur doit être associé à un nom de fichier si domaine Unix ou
un n° de port et une @IP si domaine Internet
C.Crochepeyre Applications CS 31
• Après le bind() le descripteur pointe sur la structure système
associée à la socket
– avec le nom du fichier de type S (socket) spécifié dans sun_path
si Unix
– avec le n° du port et l’adresse IP si Internet
• Possibilités
sin_addr = INADDR_ANY (une des adresses de la machine)
= ou gethostname()…
sin_port = 0 un port libre alloué par le système
= n° port choisi
= getservbyname() ….
C.Crochepeyre Applications CS 32
• Exemples
socket Unix
struct sockaddr_un sockux;
………..
sockux.sun_family = AF_UNIX;
strcpy(sockux.sun_path, « sockunix.test »)
bind(sock,&sockux,strlen(sockux.sun_path)+2)
socket INTERNET
struct sockaddr_in sockit;
……………..;
sockit.sin_family = AF_INET;
sockit.sin_port = n° du port associé à la socket; (format réseau)
sockit.sin_addr = adresse de la machine; (format réseau)
bind(sock, &sockit,sizeof(sockit));
C.Crochepeyre Applications CS 33
• Des fonctions pour récupérer les adresses machines
gethostname() récupération du nom de la machine dans une chaîne de
caractères
gethostbyname() récupération du nom de la machine dans une structure
hostent
C.Crochepeyre Applications CS 34
• Conversion des formats des données
– Chaque machine code ses données selon un format local, les échanges
entre machines impliquent donc des conversions
• du format local au format réseau et
• du format réseau au format local
– L’adresse IP et n° port doivent être au format réseau dans la structure
système avant envoi
– L’adresse IP et n° port reçus dans la structure doivent être reconvertis au
format local avant utilisation (ex: pour un printf de l’adresse de la
machine)
C.Crochepeyre Applications CS 35
Les primitives d’échanges mode UDP
C.Crochepeyre Applications CS 36
• Réception
nc = recvfrom(sock,msg,lg,option,p_exp,lgexp)
int nc; nb de car reçus
int sock; n° descripteur socket
char *msg; adresse récupération du message
Int lg; taille espace réception
Int option; 0 ou MSG_PEEK
struct sockaddr *p_exp; struct récup l’adresse de l’expéditeur
int lgdest; long structure de l’expéditeur
C.Crochepeyre Applications CS 37
Primitives en mode TCP
• Après création de la socket et attachement
• Etablissement du circuit virtuel
Serveur
int socke descripteur socket écoute serveur
int nb; nombre maxi de connexions pendantes
int socks; descripteur socket de service qui va communiquer avec le client
struct sockaddr *p_adr; structure récupérant @machineClient et n° port
Int lg_adr; long structure
C.Crochepeyre Applications CS 38
• Emission
nc = write(socks,msg,lg)
int socks descripteur socket de service
char *msg adresse du message à envoyer
int lg long du message
int nc nb de car réellement émis
Ou
nc = send(socks,msg,lg,option)
option 0 idem write
MSG_OOB caractère urgent (out-of-band)
MSG_PEEK conservation message…
C.Crochepeyre Applications CS 39
• Réception
Nc = read(socks, msg, lg, option)
int socks descripteur socket de service
char *msg adresse du message reçu
int lg long du message
int nc nb de car réellement lus
Ou
Nc = recv(socks, msg, lg, option)
C.Crochepeyre Applications CS 40
Serveur parallèle: TCP
C.Crochepeyre Applications CS 41
Serveur parallèle
clients
serveur
C.Crochepeyre Applications CS 42
Serveur parallèle: TCP
Côté Client Côté Serveur
création d’une socket création et attachement
(attachement) d’une socket d’écoute
socket()/bind() socket() et bind()
C.Crochepeyre Applications CS 43
Exemple simple UDP
• Client UDP
/**********************************************/
/* utilisation des sockets mode datagramme */
/* client UDP */
/* Le client envoie une suite de car au serveur */
/*********************************************/
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
extern errno;
C.Crochepeyre Applications CS 44
if(argc!=3) {
fprintf(stderr,"usage: %s remotehost remoteport \n",argv[0]);
exit(0); }
if((sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)) < 0) création socket cliente UDP
{
perror("socket");
exit(1); }
if(!(h=gethostbyname(argv[1]))) { récupération @machine serveur
perror(argv[1]);
exit(2); }
C.Crochepeyre Applications CS 45
if(sendto(sock,"ABC",3,0,&sin, sizeof(sin))!=3) {
fprintf(stderr,"erreur ecriture \n");
exit(1); }
if(sendto(sock,"DEFGH",5, 0,&sin, sizeof(sin))!=5) {
fprintf(stderr,"erreur ecriture \n");
exit(1); }
if(sendto(sock,"IJ",2, 0,&sin, sizeof(sin))!=2) {
fprintf(stderr,"erreur ecriture \n");
exit(1); }
if(sendto(sock,"KLMNOPQRS",9,0,&sin, sizeof(sin))!=9) {
fprintf(stderr,"erreur ecriture \n");
exit(1); }
sleep(2);
if(sendto(sock,"TUV",3, 0,&sin, sizeof(sin))!=3) {
fprintf(stderr,"erreur ecriture \n");
exit(1); }
if(sendto(sock,"WXYZ",4, 0,&sin, sizeof(sin))!=4){
fprintf(stderr,"erreur ecriture \n");
exit(1); }
close (sock);}
C.Crochepeyre Applications CS 46
• Serveur UDP
/************************************************/
/* utilisation de socket sur le reseau mode datagramme */
/* partie serveur */
/* Le serveur reçoit du client les caractères */
/************************************************/
#include <unistd.h>
#include<stdio.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <netdb.h>
struct sockaddr_in sin = {AF_INET}; Struct pour la socket serveur
main()
{
int len, sock;
char ligne[10];
int n;
struct sockaddr_in adr; Struct pour récupérer l’adresse client
C.Crochepeyre Applications CS 47
if(bind(sock, &sin, sizeof(sin)) < 0) attachement de la socket serveur
{perror("bind");
exit(2);
}
len = sizeof(sin);
if(getsockname(sock, &sin, &len) < 0) récupération n° port attribué à la socket serveur
{perror("getsockname");
exit(3);
}
printf("server bound to port %u 0x%x \n",ntohs(sin.sin_port),sin.sin_port); affiche le n° port socket serveur
for(;;)
{len = sizeof(adr);
n = recvfrom(sock,ligne,10,0,&adr, &len); attend les carac du client
if (n == -1) {perror (" pb socket lecture");
exit();
}
ligne[n] ='\0';
printf("la chaine lue par le serveur est %s\n",ligne); affichage
}
}
C.Crochepeyre Applications CS 48
Exemple simple TCP
• Client TCP
/*************************************/
/* client.c tcp_client */
/* socket mode connecte */
/* le client attend un message du serveur */
/* il n’envoie rien au serveur */
/*************************************/
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
extern errno;
main(argc,argv) arguments: @port serveur et @machine serveur communiqués par le printf() du serveur
char **argv;
{
struct hostent *h; Struct conversion adresses
struct sockaddr_in sin; Struct socket cliente dans laquelle on place l’adresse du serveur
char buf[2048]; Buffer message du serveur
int sock; Descripteur socket cliente
C.Crochepeyre Applications CS 49
if(argc!=3)
{fprintf(stderr,"usage: %s remotehost remoteport \n",argv[0]); @du port serveur
exit(0);
}
if((sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0) création socket cliente TCP
{perror("socket");
exit(1);
}
if(!(h=gethostbyname(argv[1]))) @machine serveur
{perror(argv[1]);
exit(2);
}
bzero(&sin,sizeof(sin)); maj struct socket
sin.sin_family = AF_INET;
bcopy(h->h_addr,&sin.sin_addr,h->h_length); @machine serveur
sin.sin_port = htons(atoi(argv[2])); @port serveur
C.Crochepeyre Applications CS 50
• Serveur TCP
/*************************************/
/* server.c tcp_serveur */
/* socket mode connecte */
/* le serveur envoie un message au client */
/* il n’attend rien du client */
/*************************************/
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <netdb.h>
struct sockaddr_in sin = {AF_INET}; structure socket serveur
main(argc,argv)
char **argv;
{
int namelen, newsock, sock;
if((sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0) création socket serveur TCP
{perror("socket");
exit(1);
}
C.Crochepeyre Applications CS 51
if(bind(sock, &sin, sizeof(sin)) < 0) attachement de la socket serveur
{perror("bind");
exit(2);
}
namelen = sizeof(sin);
if(getsockname(sock, &sin, &namelen) < 0) récupération n° port socket serveur
{perror("getsockname");
exit(3);
}
printf("server bound to port %u 0x%x \n",ntohs(sin.sin_port),sin.sin_port); affichage n° port
write (newsock, "bonjour du Serveur", 18); le serveur envoie son bonjour au client
close(newsock);
}
}
C.Crochepeyre Applications CS 52