réseaux - wordpress.comhtons (host to network short) htonl (host to network long) ntohs (network to...
Post on 24-Aug-2020
6 Views
Preview:
TRANSCRIPT
1(c) 2011 Omar geryville Réseaux : Programmation sockets
Réseaux : Programmation avec l'API BSD/Sockets
Mias2011.wordpress.com
2Réseaux : Programmation sockets
Organisation du CoursOrganisation du CoursEnseignementEnseignement
3 x 2h de Cours3 x 2h de Cours3 x 4h de TP3 x 4h de TP
EvaluationEvaluationCC : Projet à rendre en binômeCC : Projet à rendre en binômeExamen 2hExamen 2h
Pré-requis Pré-requis indispensablesindispensables (à réviser d'urgence !) (à réviser d'urgence !)Programmation C : pointeurs, malloc, ... + makefile, ...Programmation C : pointeurs, malloc, ... + makefile, ...Programmation système : fork, signauxProgrammation système : fork, signaux
Avant-propos
(c) 2011 Omar geryville
3Réseaux : Programmation sockets
Plan du CoursPlan du CoursChapitre 1 : IntroductionChapitre 1 : Introduction
Chapitre 2 : Manipulations d'adressesChapitre 2 : Manipulations d'adresses
Chapitre 3 : Appels Systèmes ElémentairesChapitre 3 : Appels Systèmes Elémentaires
Chapitre 4 : Appels Systèmes AvancésChapitre 4 : Appels Systèmes Avancés
Chapitre 5 : Techniques de Communication AvancéesChapitre 5 : Techniques de Communication Avancées
Avant-propos
(c) 2011 Omar geryville
4Réseaux : Programmation sockets
RéférencesRéférencesLivresLivres
W. R. Stevens : « Unix Network Programming », Prentice-W. R. Stevens : « Unix Network Programming », Prentice-Hall 1990Hall 1990J.-M. Rifflet : « La Communication sous UNIX », MassonJ.-M. Rifflet : « La Communication sous UNIX », MassonD. Comer : « Internetworking with TCP/IP », Prentice HallD. Comer : « Internetworking with TCP/IP », Prentice Hall
URLsURLshttp://www.urec.fr/cours/ (unité réseaux du CNRS)http://www.urec.fr/cours/ (unité réseaux du CNRS)http://www.ecst.csuchico.edu/~beej/guide/net/html/http://www.ecst.csuchico.edu/~beej/guide/net/html/
Avant-propos
(c) 2011 Omar geryville
5Réseaux : Programmation sockets
Chapitre 1Chapitre 1
Introduction
(c) 2011 Omar geryville
6Réseaux : Programmation sockets
SocketSocket = Prise = PriseUn moyen de « brancher » des processus entre-euxUn moyen de « brancher » des processus entre-eux
Communication dite « par échange de messages »,Communication dite « par échange de messages »,((Message PassingMessage Passing))
Message = 1 caractère (stream) ou plusieurs (datagramm)Message = 1 caractère (stream) ou plusieurs (datagramm)
S'oppose à d'autre formes tq. Mémoire (Virt.) PartagéeS'oppose à d'autre formes tq. Mémoire (Virt.) Partagée
Connexion de processus locaux (IPC)Connexion de processus locaux (IPC)Protocol interne « Unix »Protocol interne « Unix »
Ex: DISPLAY=:0.0Ex: DISPLAY=:0.0
Connexion de processus distantsConnexion de processus distantsProtocoles de la famille TCP/IPProtocoles de la famille TCP/IP
Telnet, rlogin, ssh, ftp, http, nslookup, ...Telnet, rlogin, ssh, ftp, http, nslookup, ...
Autres protocoles possiblesAutres protocoles possiblesMais rarement utilisés car « TCP/IP » standard de faitMais rarement utilisés car « TCP/IP » standard de fait
Chapitre 1 : Introduction
(c) 2011 Omar geryville
7Réseaux : Programmation sockets
Socket = API (issue de BSD)Socket = API (issue de BSD)Interface de programmationInterface de programmationInterface avec le systèmeInterface avec le système
Application
Sockets
Transport
Network
Data Link
Physical
TCP
IP
UDP
IGMP
Ethernet / ATM (ADSL)
Unix
Noyau Unix
Matériel
Chapitre 1 : Introduction
(c) 2011 Omar geryville
8Réseaux : Programmation sockets
Principe de Base de l'API SocketPrincipe de Base de l'API SocketUnix = Fichiers + ProcessusUnix = Fichiers + Processus
Communiquer au travers de pseudo-fichiersCommuniquer au travers de pseudo-fichiersChaque socket est associé à un descripteurChaque socket est associé à un descripteur
Fonctionnement similaire aux FIFO (bi-directionnelles)Fonctionnement similaire aux FIFO (bi-directionnelles)Envoyer = écrire dans le descripteurEnvoyer = écrire dans le descripteur
Recevoir = lire dans le descripteurRecevoir = lire dans le descripteur
0123
i
fichier
fichier
socket
socket Réseau
disk
Processus Système
Chapitre 1 : Introduction
(c) 2011 Omar geryville
9Réseaux : Programmation sockets
Modèle Client/ServeurModèle Client/Serveur
Client Serveur
1 - Requête
2 - Réponse
Programmation socket = modèle client serveurProgrammation socket = modèle client serveurUne application socket = Une application socket = 2 programmes2 programmes (au moins) (au moins)
Un clientUn clientEtablit la connexionEtablit la connexion
Envoie une requête (demande service)Envoie une requête (demande service)
Un serveurUn serveurAttend connexion(s)Attend connexion(s)
Traite requête(s)Traite requête(s)
Chapitre 1 : Introduction
(c) 2011 Omar geryville
10Réseaux : Programmation sockets
Client/Serveur : un modèle AsymétriqueClient/Serveur : un modèle AsymétriqueServeur : normalement capable de (prévu pour) traiter Serveur : normalement capable de (prévu pour) traiter plusieurs requêtesplusieurs requêtes
Eventuellement en parallèle !Eventuellement en parallèle !
Client : connexion (ponctuelle) vers un serveurClient : connexion (ponctuelle) vers un serveur
ServeurClient
Client Client Client
hôte 1
hôte 2 hôte 3
Chapitre 1 : Introduction
(c) 2011 Omar geryville
11Réseaux : Programmation sockets
Modes de FonctionnementModes de FonctionnementDeux Deux modes de connexionmodes de connexion
Mode connectéMode connecté : l'interlocuteur (au bout de la prise) : l'interlocuteur (au bout de la prise) ne ne change paschange pas
Idée du « téléphone rouge »Idée du « téléphone rouge »
Mode non connectéMode non connecté : : réutilisationréutilisation d'un d'un socket socket pour joindre pour joindre (successivement) différents interlocuteurs(successivement) différents interlocuteurs
Deux types de Deux types de flots de donnéesflots de donnéesFlot de Flot de caractèrescaractères (mode « (mode « stream »stream »))
UneUne lecture peut récupérer les données envoyées par lecture peut récupérer les données envoyées par plusieursplusieurs écritures (et inversement) écritures (et inversement)
Flot de Flot de messagesmessages (mode « (mode « datagramm »datagramm »))UneUne écriture = écriture = UnUn message = message = UneUne lecture lecture
Chapitre 1 : Introduction
(c) 2011 Omar geryville
12Réseaux : Programmation sockets
Quel mode de connexion choisir ?Quel mode de connexion choisir ?Mode connecté : logique avec protocole connectéMode connecté : logique avec protocole connecté
En particulier TCPEn particulier TCP
Mode non connecté : logique avec protocole non Mode non connecté : logique avec protocole non connectéconnecté
En particulier UDPEn particulier UDP
MAISMAIS : Mode connecté possible avec UDP ! : Mode connecté possible avec UDP !Connexion virtuelleConnexion virtuelleEvite (à l'expéditeur) d'avoir à répéter le destinataire à Evite (à l'expéditeur) d'avoir à répéter le destinataire à chaque envoi...chaque envoi...
Allège la programmation dans certains casAllège la programmation dans certains cas
Chapitre 1 : Introduction
(c) 2011 Omar geryville
13Réseaux : Programmation sockets
Utilisation du mode «Flot de Messages»Utilisation du mode «Flot de Messages»Frontière de message conservée = Frontière de message conservée = information impliciteinformation implicite
Exemple :Exemple :expéditeur : envoi (écrit) 10 octetsexpéditeur : envoi (écrit) 10 octets
destinataire : lit 20 octetsdestinataire : lit 20 octets
Résultat ?Résultat ?Destinataire Destinataire ne récupère que 10 octets !!ne récupère que 10 octets !!
Utile lorsque les transmissions sont de longueur variableUtile lorsque les transmissions sont de longueur variablePb. destinataire : combien de données lire la prochaine Pb. destinataire : combien de données lire la prochaine fois ??fois ??
Solution : (tenter de) lire le maximum Solution : (tenter de) lire le maximum Aucun risque de déborder sur la réception suivanteAucun risque de déborder sur la réception suivante
Attention : possibilité de perte « silencieuse » de donnéesAttention : possibilité de perte « silencieuse » de donnéesLorsque le destinataire ne lit pas assez de données...Lorsque le destinataire ne lit pas assez de données...
Chapitre 1 : Introduction
(c) 2011 Omar geryville
14Réseaux : Programmation sockets
Utilisation du mode «F lot de Caractères»Utilisation du mode «F lot de Caractères»Lectures et écritures sont décorréléesLectures et écritures sont décorrélées
Le destinataire peut lire en une fois le produit de plusieurs Le destinataire peut lire en une fois le produit de plusieurs écrituresécrituresTransmissions de longueur variables ?!Transmissions de longueur variables ?!
A la charge du programmeur (concepteur du protocole)A la charge du programmeur (concepteur du protocole)
Ex : en-tête = longueur(contenu) + contenuEx : en-tête = longueur(contenu) + contenu
Pas forcément plus compliqué...Pas forcément plus compliqué...
Ex : exp souhaite envoyer chaîne « truc »Ex : exp souhaite envoyer chaîne « truc »exp: envoi printf("%2d",strlen(« truc »))exp: envoi printf("%2d",strlen(« truc »))
exp: envoi « truc »exp: envoi « truc »
dest : reçoit scanf("%2d",&msg_len)dest : reçoit scanf("%2d",&msg_len)
dest : truc_buf = malloc(msg_len)dest : truc_buf = malloc(msg_len)
dest : fread(truc_buf,msg_len, ...)dest : fread(truc_buf,msg_len, ...)
Attention à éviterles décalages intempestifs !
Chapitre 1 : Introduction
(c) 2011 Omar geryville
15Réseaux : Programmation sockets
Synchronisation Source/DestinationSynchronisation Source/DestinationMode de fonctionnement AsynchroneMode de fonctionnement Asynchrone
Capacité Capacité limitéelimitée de stockage à destination de stockage à destinationContrôle de flux ?Contrôle de flux ?
Aucun : à la charge du protocole sous-jacentAucun : à la charge du protocole sous-jacent
Possibilité de perdre des messages avec UDP ...Possibilité de perdre des messages avec UDP ...
Capacité de stockage (un peu) configurableCapacité de stockage (un peu) configurable
Le destinataire lit (consomme) les données reçues quand il Le destinataire lit (consomme) les données reçues quand il le souhaitele souhaite
Eventuellement très longtemps après leur réception...Eventuellement très longtemps après leur réception...
Possibilité de blocagePossibilité de blocageSi contrôle de flux (TCP)Si contrôle de flux (TCP)
Mode bloquant débrayableMode bloquant débrayable
Chapitre 1 : Introduction
(c) 2011 Omar geryville
16Réseaux : Programmation sockets
A propos d'API...A propos d'API...Socket n'est pas la seule API !Socket n'est pas la seule API !
API concurrente sur System V API concurrente sur System V TLI (Transport Layer Interface)TLI (Transport Layer Interface)
Plus sophistiquéePlus sophistiquée
Apparue plus tardApparue plus tard
Donc moins connue/utilisée ...Donc moins connue/utilisée ...
Solaris (Sun) = System VSolaris (Sun) = System VObligation de programmer avec TLI sur SUN ??Obligation de programmer avec TLI sur SUN ??Non : librairie de compatibilitéNon : librairie de compatibilité
gcc reseau_simple.c –o reseau_simple gcc reseau_simple.c –o reseau_simple –lnsl–lnslgcc reseau_socket.c –o reseau_socket gcc reseau_socket.c –o reseau_socket –lsocket –lnsl–lsocket –lnsl
Chapitre 1 : Introduction
(c) 2011 Omar geryville
17Réseaux : Programmation sockets
Chapitre 2Chapitre 2
Manipulations d'Adresses
(c) 2011 Omar geryville
18Réseaux : Programmation sockets
Où chercher ?Où chercher ?Fichiers d'inclusionFichiers d'inclusion
<sys/types.h> <sys/types.h> types de données élémentaires (u_char, u_long, …)types de données élémentaires (u_char, u_long, …)
<sys/socket.h> <sys/socket.h> déclarations concernant les socketsdéclarations concernant les sockets
<netinet/in.h> <netinet/in.h> déclarations concernant le protocole IPdéclarations concernant le protocole IP
<netdb.h> : <netdb.h> : déclarations concernant la résolution d'adressesdéclarations concernant la résolution d'adresses
Chapitre 2 : Manipulations d'adresses
(c) 2011 Omar geryville
19Réseaux : Programmation sockets
Où chercher ?Où chercher ?ManuelManuel
byteorder(3)byteorder(3) Conversions d'entiers entre format natif et format réseauConversions d'entiers entre format natif et format réseau
inet(3)inet(3) Conversion d'adresse entre formats texte et binaireConversion d'adresse entre formats texte et binaire
gethostbyname(3)gethostbyname(3) Résolution d'adressesRésolution d'adresses
Chapitre 2 : Manipulations d'adresses
(c) 2011 Omar geryville
20Réseaux : Programmation sockets
Conversion entre Formats Natif et RéseauConversion entre Formats Natif et RéseauAdresse IP = entier 32 bitsAdresse IP = entier 32 bits
Tous les CPU ne comprennent pas les entiers 32 bits de la Tous les CPU ne comprennent pas les entiers 32 bits de la même façonmême façon Format MSB, LSB, mixtes …Format MSB, LSB, mixtes …
Une convention a été adoptée pour éviter les erreurs : Une convention a été adoptée pour éviter les erreurs : Adresse IP = 32 bits MSBAdresse IP = 32 bits MSB
Les machines qui n'ont pas la chance de calculer au Les machines qui n'ont pas la chance de calculer au format MSB doivent convertirformat MSB doivent convertir
Adresses IP (32 bits)Adresses IP (32 bits)
Numéros de port (16 bits)Numéros de port (16 bits)
Masques de réseaux, …Masques de réseaux, …
Chapitre 2 : Manipulations d'adresses
(c) 2011 Omar geryville
21Réseaux : Programmation sockets
Conversion entre Formats Natif et Réseau (2)Conversion entre Formats Natif et Réseau (2)Fonctions de conversion :Fonctions de conversion :
hhtotonnss ( (hosthost to to networknetwork shortshort))htonl (host to network long)htonl (host to network long)ntohs (network to host short)ntohs (network to host short)ntohl (network to host long)ntohl (network to host long)
On ne sait pas toujours si l'ordinateur que l'on On ne sait pas toujours si l'ordinateur que l'on programme est MSB …programme est MSB …
Conversion systématique !Conversion systématique ! Ces fonctions existent aussi sur les "bonnes" machines au Ces fonctions existent aussi sur les "bonnes" machines au format MSB : elle ne changent rien …format MSB : elle ne changent rien …
Chapitre 2 : Manipulations d'adresses
(c) 2011 Omar geryville
22Réseaux : Programmation sockets
Quand utiliser les fonctions de conversion ?Quand utiliser les fonctions de conversion ?A chaque fois que :A chaque fois que :
L'API nous fournit une donnée de type adresse/portL'API nous fournit une donnée de type adresse/portEx: réception d'un message venant de xxx.yyy.zzz.tttEx: réception d'un message venant de xxx.yyy.zzz.ttt
L'API demande une donnée de type adresse/portL'API demande une donnée de type adresse/portEx: envoyer datagramm vers port iiii de machine Ex: envoyer datagramm vers port iiii de machine xxx.yyy.zzz.ttt ...xxx.yyy.zzz.ttt ...
Attention aux calculs arithmétiques !Attention aux calculs arithmétiques !Exemple : scan de portsExemple : scan de ports
for (port=1024 ; port<2048 ; port++) ...for (port=1024 ; port<2048 ; port++) ...
port++ est juste Ssi port au format hostport++ est juste Ssi port au format host
En cas de doute : ne pas hésiter à utiliser des variables de En cas de doute : ne pas hésiter à utiliser des variables de nom explicite : nom explicite : hhport = ntohs(port = ntohs(nnport)port)
Chapitre 2 : Manipulations d'adresses
(c) 2011 Omar geryville
23Réseaux : Programmation sockets
Résolution d'AdressesRésolution d'AdressesFonctions d'interface avec le DNSFonctions d'interface avec le DNS
gethostname(char * gethostname(char * namename, size_t , size_t lenlen)) Retourne dans Retourne dans namename le nom de la machine courante le nom de la machine courante
struct hostent *gethostbyname(char * struct hostent *gethostbyname(char * namename)) Retourne une structure décrivant la machine de nom Retourne une structure décrivant la machine de nom namename
struct hostent *gethostbyaddr(char *struct hostent *gethostbyaddr(char *addraddr, int , int lenlen, int , int typetype))Retourne une structure (la même) décrivant la machine d'adresse Retourne une structure (la même) décrivant la machine d'adresse addraddr (format réseau)(format réseau)
lenlen = sizeof(addr) = sizeof(addr)
typetype = AF_INET = AF_INET
Chapitre 2 : Manipulations d'adresses
(c) 2011 Omar geryville
24Réseaux : Programmation sockets
La structure HostentLa structure Hostentstruct hostent {struct hostent {
// nom officiel// nom officielchar *h_name;char *h_name;// autres noms : vecteur de chaînes, dont le // autres noms : vecteur de chaînes, dont le // dernier élément est NULL// dernier élément est NULLchar **h_aliases; char **h_aliases; // type d'adresse (AF_INET) // type d'adresse (AF_INET) int h_addrtype;int h_addrtype;// longueur des adresses (32 bits = 4 si IP)// longueur des adresses (32 bits = 4 si IP)int h_length;int h_length;// Liste des adresses (terminée par NULL aussi)// Liste des adresses (terminée par NULL aussi)char **h_addr_list;char **h_addr_list;
};};Attention : horreur !Faux type char * (en fait void *)Cast délicat dans le cas d'@ IP...
Chapitre 2 : Manipulations d'adresses
(c) 2011 Omar geryville
25Réseaux : Programmation sockets
Structure d'adresseStructure d'adressestruct sockaddr {struct sockaddr {
u_shortu_short sa_family;sa_family; /* address family: AF_xxx value */ /* address family: AF_xxx value */
charchar sa_data [14];sa_data [14]; /* up to 14 bytes protocol specific address *//* up to 14 bytes protocol specific address */
};};
struct in_addr {struct in_addr {
u_longu_longs_addr;s_addr; /* 32 bit netid/hostid, network byte ordered *//* 32 bit netid/hostid, network byte ordered */
};};
struct sockaddr_in {struct sockaddr_in {
shortshort sin_family; sin_family; /* AF_INET *//* AF_INET */
u_shortu_short sin_port;sin_port; /* 16 bit port number, net byte ordered *//* 16 bit port number, net byte ordered */
struct in_addrstruct in_addr sin_addr;sin_addr;
charchar sin_zero [8];sin_zero [8]; /* unused *//* unused */
};};
Chapitre 2 : Manipulations d'adresses
Type générique :jamais instancié
Type instancié dansle cas d'une @IP
(c) 2011 Omar geryville
26Réseaux : Programmation sockets
Conversion d'adresses IPConversion d'adresses IP#include <sys/socket.h>#include <sys/socket.h>
#include <netinet/in.h>#include <netinet/in.h>
#include <arpa/inet.h>#include <arpa/inet.h>
unsigned long inet_addr (char * unsigned long inet_addr (char * ptrptr););
char * inet_ntoa (struct in_addr char * inet_ntoa (struct in_addr inaddrinaddr););
Conversion d’adresses internet entreConversion d’adresses internet entreChaîne au format “point décimal” Chaîne au format “point décimal” (ex: 192.168.0.1)(ex: 192.168.0.1)
Format binaire 4 octets (réseau)Format binaire 4 octets (réseau)
Chapitre 2 : Manipulations d'adresses
(c) 2011 Omar geryville
27Réseaux : Programmation sockets
Chapitre 3Chapitre 3
Appels Systèmes Elémentaires
(c) 2011 Omar geryville
28Réseaux : Programmation sockets
Synoptique en mode connectéSynoptique en mode connecté
socket ()
bind ()
listen ()
accept ()
read ()
write ()
bloque jusqu’à demande de connexion client
traitementde la requête
socket ()
connect ()
write ()
read ()
établissement de la connexion
requête
réponse
serveur
client
Chapitre 3 : Appels Systèmes élémentaires
(c) 2011 Omar geryville
29Réseaux : Programmation sockets
Synoptique en mode non connectéSynoptique en mode non connecté
socket ()
bind ()
recvfrom ()
sendto ()
bloque jusqu’à réception de requête client
traitementde la requête
socket ()
bind ()
sendto ()
recvfrom ()
requête
réponse
serveur
client
Chapitre 3 : Appels Systèmes élémentaires
(c) 2011 Omar geryville
top related