Comprendre les Réseaux (S32)clarinet.u-strasbg.fr/~merindol/uploads/Teaching/CM-socket.pdf ·...
Transcript of Comprendre les Réseaux (S32)clarinet.u-strasbg.fr/~merindol/uploads/Teaching/CM-socket.pdf ·...
Comprendre les Réseaux (S32)DUT INFO
Pascal Mérindol (GR 1-2): [email protected]/TP (GR 3-4): Jonathan WeberTD/TP (GR 5): Julien beaudeaux
http://www-r2.u-strasbg.fr/~merindol/
+ guest star: Julien Montavont !
INFOS PRATIQUES
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
Salles‣CM: Amphi 4‣TD1/2: 104 - TP1/TP2: 203‣TD3/4: 218 - TP3/TP4: 203‣TD5: 109 - TP5: 105
Pour plus détails (horaires & cie), rendez vous sur ADE !..
Note ‣Groupe 1 TP en décalage jusqu’à la semaine 5 (Lundi 22/11- 105)‣Groupe 2 TP en décalage jusqu’à la semaine 7 (Lundi 6/12 - 203)
‣ https://iut-info.unistra.fr/prive/pedagogie/1/
‣ http://www-r2.u-strasbg.fr/~merindol/
‣ http://www-r2.u-strasbg.fr/~gallais/
‣ http://www-r2.u-strasbg.fr/~lucas/
‣ http://www-r2.u-strasbg.fr/~pansiot/enseignement/
‣ http://inl.info.ucl.ac.be/CNP3
✓ Computer Networks (A. S. Tannenbaum)
✓ TCP/IP Illustré volume 1 (DL. Stevens)
✓ Le Routage dans l’Internet (C. Huitema)
✓ TCP/IP : Architecture, protocoles, applications (D. Comer)
Liens utiles (& refs du cours)
I. Introduction & Programmation sockets
✓Modèle OSI, Architecture, Evolution de l’Internet, LAN & sockets
II. Accès au medium & Ponts
✓CSMA/CD, Commutation de trame, STP & VLAN
III. Adressage IP & Routeurs
✓Configuration IPv4/IPv6, Routage des paquets IP : RIP/OSPF
IV. Internet de bout en bout & Perspectives
✓Le mode connecté (TCP), Sécurité & Internet du futur
Plan du cours
DUT INFO 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
L’Internet, c’est quoi ?
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
‣Une interconnexion de réseaux (locaux, métropolitains, régionaux, nationaux et internationaux) qui utilisent le même protocole : IPv4 (et IPv6 ?).
‣Cette interconnexion mondiale est gérée par de multiples entités autonomes (AS).➡Coordination et coopération de tous autour de consensus/normes opérationnels.
‣Mais les «difficultés» sont nombreuses ... :
➡L’Internet est étendu (nombre d’équipements et distance géographique).➡Les acteurs sont multiples (constructeurs, fournisseurs d’accès et utilisateurs).➡Le matériel est hétérogène (les noeuds comme les liaisons ...)➡Les informations et les applications sont très variées:✓texte, images, vidéos, ...✓ftp, http, VoIP, streaming, ...
‣Comment s’adapter aux différents besoins et proposer une qualité de service adéquate (best effort, premium class, ...) ?
1m 10m 100m 1km 10km 100km 1000km
PAN: Réseau personnel
MAN: Réseau
Métropolitain
WAN: Réseau longue distance
LAN:Réseau local
Différentes échelles
Le modèle OSIApplication
SessionPrésentation
TransportRéseauLiaisonPhysique
ApplicationSession
Présentation
TransportRéseauLiaisonPhysique
RéseauLiaisonPhysique
RéseauLiaisonPhysique
Le modèle OSI
Du modèle OSI à TCP/IP
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
Données Ea
Données
Ep
Es
Et
Er
El
Eφ
Données
Données
Données
Données
Données
Données
Unitéséchangées
Paquet
Trame
Bit
Transport PDU
Session PDU
Presentation PDU
Application PDU**: PDU = Protocol Data Unit
Couche K Couche KCommunicationentre couches KDonnéesEk
Couche K-1DonnéesEkEk-1
Couche K-1
DonnéesEk
➡ Chaque couche rend des «services» à la couche supérieureNorme ISO 7498OSI = Open System Interconnection
Du modèle OSI à TCP/IP
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
Application
Présentation
Session
Transport
Réseau
Liaison
Physique
Services réseaux (client/serveur, peer2peer)
➡Chaque couche a une fonctionnalité spécifique :
Représentation des données : format/codage
Synchronisation & organisation des transactions
Gestion des communications de bout en bout
Acheminement des données : adressage & routage
Partage du medium, détection/correction d’erreur, commutation réseau local
Transmission effective du signal sur le medium
Du modèle OSI à TCP/IP
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
➡En pratique, la réalité : TCP/IP
ApplicationTransportRéseauLiaisonPhysique
ApplicationTransportRéseauLiaisonPhysique
RéseauLiaisonPhysique
RéseauLiaisonPhysique
Application
Transport
Réseau
Liaison
http, ftp, smtp, ssl, ...
TCP / UDP
IPv4 / IPv6
Ethernet (802.3), WiFi (802.11), ...
➡Le modèle TCP/IP est une pile de protocoles
LiaisonPhysique
LiaisonPhysique
MAN/WANLAN LAN
Différents composants
‣ Routeur✓ Couche 3 du modèle OSI (réseau) ✓ Table de routage✓ Achemine les paquets d'une interface vers une autre
‣ Commutateur / Ponts / Switchs✓ Couche 2 du modèle OSI (liaison de données)✓ associe des adresses MAC avec des ports correspondants
‣ Concentrateur✓ permet la connexion de plusieurs appareils sur un même medium
Différents supports physiques
Filaires
Fibres optiquesL’air…
Différents équipements
Topologies et échelles
Pajek
4 Niveaux :‣CANAL PARTAGE (BUS, ETOILE)‣PONTS/SWITCHS (COMMUTATION MAC)‣ROUTEURS INTRA-DOMAINE (RIP, OSPF, IS-IS)‣ROUTEURS INTER-DOMAINE (BGP)
Topologies et échelles
Sprint - Tier1- AS1239
Internet, un peu d’histoire
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
‣ 1957✓ Contexte : Lancement de Spoutnik✓ Création de l’ARPA (Advanced Research Projects Agency)
‣ 1960✓ Le DoD veut plus de robustesse
➡Communications militaires via réseau téléphonique✓ AT&T laisse courir
‣ 1967✓ L’ARPA s’oriente vers les réseaux✓ Présentation d’un projet à l’ACM SIGOPS
➡ Idée similaire au Royaume-Uni➥ Décision de créer ARPAnet
Internet, un peu d’histoire
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
‣ Nœuds du réseau✓ Hôte✓ IMP (Interface Message Processor)
‣ Eté 1969✓ Liaisons hôte-IMP confiées à des étudiants
- Snowbird (Utah)
Internet, un peu d’histoire
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
‣ Evolution des besoins✓ Toujours plus de réseaux raccordés à ARPAnet✓ Gérer les communications sur des inter-réseaux✓ UNIX de Berkeley
➡ Développement des sockets, d’utilitaires et d’outils de gestion⇒UNIX BSD 4.2 avec pile TCP/IP intégré
✓ 1980: de plus en plus étendu (extensibilité ?)➡ DNS pour localiser les hôtes
‣ Parallèlement ...✓ Fin des 1970s
➡ NSFnet (National Science Foundation)➡ TCP/IP dès le début: 1er WAN TCP/IP !
‣ Début des 1980s✓ 1983: ARPAnet séparé de sa partie appartenant aux forces armées✓ ARPAnet + NSFnet ➥ « inter-réseau » ➥ « Internet »
‣ Comment se raccorder à l’Internet ?✓ Avoir une adresse IP✓ Utiliser TCP/IP
➡ Envoyer des paquets IP à tous les hôtes participants !
Internet, aujourd’hui
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
‣ Ouverture au grand public au début des 1990s✓ Application World Wide Web
‣ 1995✓ 50 000 réseaux, 4 millions d'hôtes, ~100 pays
‣ 2005 → 2010✓ 2005 : ~350 millions d'hôtes✓ 2010 : plus d’un milliard d’hôtes (350 millions rien qu’en Chine...)
‣ Problèmes d’échelle✓ extinction de l’espace d ’adressage d’IPv4✓ NAT ?
‣ Migration vers IPv6 ✓ très grand espace d’adressage✓ Sécurité, mobilité, autoconfiguration ...
‣ Comment s’adapter ?✓ tout est à revoir ? ✓ incrémentalement ?
table de routage BGP
In Out
In Out
Out In
In
Out
Introduction Couche Liaison
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
I. Local Aera Network (LAN) & Adressage Ethernet
II. Accès au medium : CSMA/CD
III. Ponts et commutation de trames
IV. Spanning Tree Protocol (STP)
V. Virtual Local Aera Network (VLAN)
AnneauBus
Etoile
LAN = multiplexeur distribué
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
‣ Un LAN de base, c’est quoi ?✓ Concept apparu dans les années 80
➡ Norme du comité IEEE 802 / 802.3 = Ethernet✓ Débit élevé à moindre coût
➡ 10 Mb/s → 1 Gb/s, puis ≥ 10Gb/s (sans CSMA/CD) ...✓ Infrastructure privée
➡ moins de contraintes réglementaires➡ propriétaire du réseau = «propriétaire des murs»
✓ Réseau d’égal à égal : tout le monde s’entend parler !
✓ Objectifs➡ Liaison fiable➡ Partage équitable➡ Connectivité transparente➡ Extensible (débit et nombre de machines) et peu couteux (installation et maintenance)
✓ Un domaine de broadcast physique➡ Innondation du réseau ...
✓ Un domaine de collision➡ Interférences entre machines ...
✓ Un sité géographique➡ Limité dans l’espace ...
LAN normalisés IEEE802 Architecture IEEE802‣La couche liaison (2 de l’ISO)
➡ découpée en deux sous-couches• couche MAC : Medium Access Control
définit une méthode d’accès (CSMA/CD, …)• couche LLC : Logical Link Control / multiplexage et contrôle d’erreur
✓permet de choisir le service «au dessus» : IPv4/v6, STP, AppleTalk, NetBIOS...✓commune aux différentes couches Mac✓définit un protocole de liaison : lien « virtuel » entre deux stations➡ 3 types de protocole suivant le service :✓LLC type 1 : datagramme non fiable (le + utilisé en pratique)✓LLC type 2 : avec connexion, fiable✓LLC type 3 : sans connexion, avec acquittements
‣Réseau local normalisé défini par:➡ une méthode d’accès (couche MAC)➡ une couche physique
• caractérisée par plusieurs paramètres:✓support (paire torsadée, coaxial, fibre, canal radio)✓débit✓encodage (adapté au support et au débit) ➥ Ethernet = Manchester différentiel ✓paramètres du réseau (distance, nombre équipements, règle 5-4-3, …)
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
Architecture IEEE802
Management, bridging, ... 802.1
802.2LLC
...MAC1 MAC2 MAC3 MACn
Phy Phy Phy Phy
802.3/4/5...
Couche 2
Couche 1
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
TRAME IEEE 802.3
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
Format d’une trame :
préambule SFD @dst @srclongueur ou type
DATA FCS
Chaque champ occupe un nombre entier d’octets :
-préambule : synchronisation 7 octets 10101010 (début peut être perdu)-SFD (Start of Frame Delimiter) : début de l’info utile 1 octet 10101011(exemple en 10baseT, dépend de la couche physique)-adresse destination : 6 octets-adresse source : 6 octets-longueur ou type : 2 octets-DATA (données) : 46 à 1500 octets (y compris bourrage/padding éventuel)-FCS (Frame Check Sequence) : 4 octets ➾ code polynomial détecteur d’erreursX32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 + X8 + X7 + X5 + X4 + X2 + X1 + 1 (CRC32)
Adressage IEEE 802.3• Codées sur 6 octets « adresses MAC »– premier bit (= bit poids faible du 1er octet)• 0 : adresse individuelle (= adresse d’interface réseau classique)• 1 : adresse de groupe multicast (concerne seulement la destination)
– ex 01:80:c2:00:00:00 (spanning tree)– cas particulier ff:ff:ff:ff:ff:ff broadcast
– deuxième bit• 1 : adresses allouées localement, ou non universelles– Ex : adresses multicast• 0 : adresses universelles ➾ 24 bits/fabricant, 24 bits/numéro de série
– ex 00:0d:93:c8:91:9c ; «00:0d:93» ➥ Apple– voir http://standards.ieee.org/regauth/oui/oui.txt– adresse MAC non volatile sur la carte
Longueur de la trame (hors préambule) :– garantir Lmin/D > 2t (car CSMA/CD) // t: temps de propagation
• choix Lmin = 64 octets ➥ 2t < 51,2 µs à D = 10Mb/s : limite taille réseau (qqs km)• si données < 46 octets : padding / bourrage
Même champ peut coder le type (hérité de l’ethernet initial ≠ 802.3)• identifie protocole supérieur (~Couche 3)• Ex (hexa) 0800 : IPv4, 0806 : ARP, 88DD : IPv6 ➾ http://www.iana.org/assignments/ethernet-numbers• valeurs disjointes avec longueurs possibles
➾ cohabitation possible entre plusieurs types de trames dans le même réseau
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
Encapsulation 802.2 LLCComment choisir le bon service (trame de service) ?
APPLIIP/ STP ...
LLCMACPHYS
APPLIIP /STP ...
LLCMACPHYS
‣DSAP : Destination Service Acces point (1 byte)✓bit de poids faible : Individual/Group pour le SAP de destination‣SSAP : Source Service Acces point (1 byte)✓bit de poids faible : Command/Reponse pour le SAP source → indique comment interpréter le champs "CONTROL"‣CONTROL : De nombreuses trames de service (1-2 byte)✓permettent de gérer les trois types de service (Ethernet/IP n'utilisent que trois types de trames en mode LLC type 1) :
➡UI : cette trame est un simple Datagramme (que des données)➡XID : Echange Identification (classe supportée, ...)➡TEST : vérifier l'accessibilité, découvrir la route
I/G DSAP C/R SSAP CONTROL
SAP : Service Access Point
Ethernet : protocole IPv4 unicast00:0d:93:c8:91:9c > 00:00:5e:00:01:33, ethertype IPv4 (0x0800), length 122: 130.79.90.153 > 130.79.200.11
Ethernet protocole IPv6 multicast00:05:85:82:f8:3e > 33:33:00:00:00:09, ethertype IPv6 (0x86dd), length 1070: fe80::205:8500:282:f83e.521 > ff02::9.521:
Broadcast ethernet protocole ARP00:05:85:8a:5c:5d > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 64: arp
Multicast 802.3 + 802.2 Spanning Tree Protocol00:0e:d7:ff:1c:50 > 01:80:c2:00:00:00, 802.3, length 64: LLC, dsap STP (0x42), ssap STP (0x42), cmd 0x03, 802.1d
Exemples de trames
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
Une trame STP avec encapsulation LLC capturée par Wireshark
Address Resolution Protocol (ARP)
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
‣ Mapping @MAC ⇔ @IP
✓ Le protocole ARP permet de trouver quelle adresse Ethernet correspond à quelle adresse IP
‣ ARP: @IP ⇒ @MAC
‣ RARP: l’inverse, @MAC ⇒ @IP
‣La station regarde si l’adresse IP destination du paquet est dans le (sous-)réseau local :✓Si oui, la requête ARP va «directement» interroger cette IP :
➡La machine diffuse sa requête ARP, qui sera suivie d’une réponse en unicast.✓Sinon, la requête ARP va «indirectement» interroger l’IP passerelle concernée :
➡commande route : passerelle par défaut
➡seulement si la correspondance @IP ⇔ @MAC de la passerelle n’est pas connue ...
➡@MAC destination d’une trame vers une machine extérieure est celle de la passerelle !
‣Afin de minimiser la réitération des requêtes ARP, toutes les correspondances locales sont stockées dans un cache dynamique (cf. commande arp)
Format trame ARP
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
– Hardware type : 0x0001 = Ethernet– Protocol type : 0x0800 = IP– Opcode : 0x0001 = request et 0x0002 = reply
Les Sockets en C
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
‣ Application programming interface (API) des sockets permet le développement de logiciel de communication réseau✓ Interface entre l’espace utilisateur et l'espace noyau (user space ↔ kernel space)
✓ Il s’agit d’un moyen «simple» de gérer des connections UDP et TCP✓ Fonctionnement quasiment identique d’un OS à l’autre :
➡ Linux➡ BSD / MAC OS➡ Windows
Rappels UDP (S21)
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
‣ Communication UDP✓ non connecté✓ non fiable✓ sans régulation de débit✓ unidirectionnelle✓ très simple à utiliser !
‣ Emetteur UDP✓ créer une socket✓ gérer une structure avec les infos du destinataire✓ écrire/envoyer des paquets au destinataire✓ fermer sa socket
‣ Récepteur UDP✓ créer une socket ✓ gérer une structure avec les infos locales✓ associer sa socket à la structure locale✓ lire/recevoir les paquets reçus✓ fermer sa socket
socket
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
// prototype : int socket(int domain, int type, int protocol);#include <sys/types.h>#include <sys/socket.h>int sock;if((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1){perror("main (udp_src_hello_world.c): socket");return -1;}
‣Le domaine détermine la couche réseau à utiliser : ✓AF_UNIX (comm. locale), ✓AF_INET (IPv4), ✓AF_INET6 (IPv6), etc...
‣Le type détermine la couche transport utilisée :✓SOCK_STREAM (TCP), ✓SOCK_DGRAM (UDP), ✓SOCK_RAW (pas de couche transport), etc...
‣Le dernier paramètre sert à sélectionner un protocole spécifique lorsqu’il en existe plusieurs pour un même type de sémantique.
‣Créer point d’E/S pour communiquer (+ retourner descripteur) :
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
#include <arpa/inet.h>#include <netinet/in.h>
struct sockaddr_in to;socklen_t to_len = sizeof(to);memset(&to, 0, to_len);to.sin_family = AF_INET;to.sin_port = htons(port_dest);if(inet_pton(AF_INET, ip_dest, &(to.sin_addr)) <= 0){perror("main (udp_src_hello_world.c): inet_pton");return -1;}
‣sockaddr_in.sin_family représente la famille d’adresse utilisée : ✓AF_INET (IPv4), AF_INET6 (IPv6), etc...
‣sockaddr_in.sin_port : adresse couche transport (port).‣sockaddr_in.sin_addr : adresse couche réseau (IP).
struct sockaddr_in
‣Note INADDR_ANY : adresse IP locale «générique» (permet d’écouter sur toutes les interfaces)
addr.sin_addr.s_addr = htonl(INADDR_ANY));
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
gethostbyname (DNS)
struct hostent *gethostbyname(const char *name);
#include <netdb.h>struct hostent{char *h_name; /* official name of host */char **h_aliases; /* alias list */int h_addrtype; /* host address type */int h_length; /* length of address */char **h_addr_list; /* list of addresses *//* address, for backward compability */#define h_addr h_addr_list[0]};
Exemple d’utilisation :
struct hostent *he;struct sockaddr_in to;to.sin_family = AF_INET;he = gethostbyname("iut-info.unistra.fr");if(he == NULL) /* traitement de l’erreur */{perror("gethostbyname");return -1;}memcpy(&to.sin_addr, he->h_addr, sizeof(to.sin_addr));to.sin_port = htons(port_dest);
‣Cette fonction permet de récupérer l’adresse IP d’une machine à partir de son nom dans une structure hostent :
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
Big ou little Endian ?‣Représentation différente dʼun CPU à lʼautre :
✓Les grand-boutistes (big-endian) enregistrent lʼoctet de poids fort en tête ➡processeurs SPARC, Motorola
✓Les petit-boutistes (little-endian) enregistrent lʼoctet de poids faible en tête ➡processeurs Intel, AMD
✓uint16_t htons(uint16 t hostshort) : permet dʼencoder des short du format local au format réseau.✓uint32_t htonl(uint32 t hostlong) : permet dʼencoder des long du format local au format réseau.✓uint16_t ntohs(uint16 t netshort) : permet dʼencoder des short du format réseau au format local.✓uint32_t ntohl(uint32 t netlong) : permet dʼencoder des long du format réseau au format local.
‣Sur le réseau : big-endian
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
Envoyer vs. attacher & recevoir‣Envoyer :
if((nb_sended = sendto(sock,buffer,buffer_size,flags,(struct sockaddr *) &to,to_len)) == -1){perror("main (udp_src_hello_world.c): sendto");return -1;}
Les flags servent à activer certaines options lors de la transmission :MSG_MORE : signale au socket qu’il y a encore des données à envoyer.MSG_DONTWAIT : rend l’appel à sendto non bloquant.
‣Attacher :
if(bind(sock, (struct sockaddr *) &to, to_len) == -1){perror("main (udp_recv_hello_world.c): connect");return -1;}
Enregistrer le port et l’adresse IP de to comme étant lié au socket sock pour y recevoir des paquets
‣Recevoir :if((nb_received = recvfrom(sock,buffer,buffer_len,flags,\(struct sockaddr *) &from,&from_len)) == -1){perror("main (udp_recv_hello_world.c): recvfrom"); return -1;}
Le paramètre from est renseigné par la fonction recvfrom ➥ permet de savoir qui a envoyé le paquet reçu !
source
destination
‣Fermer :if(close(sock) == -1){perror("main (udp_src_hello_world.c): close");return -1;}
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
Structure des adresses
Rappels TCP (S21)
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
‣ Communication TCP✓ en mode connecté✓ fiable (gestion des pertes, ...)✓ avec régulation de débit✓ bidirectionnelle✓ architecture client/serveur✓ un peu plus complexe à utiliser ...
‣ Client TCP✓ créer une socket✓ gérer une structure avec les infos du serveur✓ se connecter au serveur✓ échanger des données avec le serveur✓ fermer sa socket
‣ Serveur TCP✓ créer une socket ✓ gérer une structure avec les infos locales✓ associer sa socket à la structure locale✓ créer une file d’attente pour les connections entrantes✓ accepter les connexions (une nouvelle socket/client)✓ échanger des données avec les clients connectés✓ fermer les sockets des clients✓ fermer la socket principale
Coté Serveur, gérer les clients ...
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
‣Création d’une file d’attente (ici 5 clients max «en attente») :
#include <sys/types.h>#include <sys/socket.h>if(listen(sock, 5) == -1){perror("main (tcp_src_hello_world.c): listen");return -1;}
‣Accepter les connexions entrantes (les clients) :
if((new_sock = accept(sock,(struct sockaddr *) &clt,&clt_len)) == -1){perror("main (tcp_src_hello_world.c): accept");return -1;}//clt est renseigné par la fonction accept: il s’agit d’un client
‣Envoyer :
if((nb_sended = send(new_sock, buffer, buffer_size, flags)) == -1){perror("main (tcp_src_hello_world.c): send");return -1;}//ou :if((nb_sended = write(new_sock, buffer, buffer_size)) == -1){perror("main (tcp_src_hello_world.c): write");return -1;}
‣Recevoir :
if((nb_recv = recv(new_sock, buffer, buffer_size, flags)) == -1){perror("main (tcp_src_hello_world.c): recv");return -1;}//ou :if((nb_recv = read(new_sock, buffer, buffer_size)) == -1){perror("main (tcp_src_hello_world.c): read");return -1;}
Coté client, connection au serveur
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
#include <sys/types.h>#include <sys/socket.h>
if(connect(sock,(struct sockaddr *) &serv,serv_len) == -1){perror("main (tcp_recv_hello_world.c): connect");return -1;}
‣Le reste des fonctions est identique (envoi/réception & fermeture)‣La fonction connect est bloquante : tant que le serveur n’accepte (via son accept) pas la connection, le déroulement du processus client est «bloqué là ...»‣Il en est de meme pour les fonctions d’écriture / lecture :(
➡problème de l’accès conccurent !
‣Comment gérer la conccurence inter-connection ?
Accès concurrents et bloquages
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
‣Comment écouter à tour de rôle ?➡...si l’un d’entre eux ne «dit rien» ...
‣Comment lire à deux endroits en même temps ?➡...si on a rien à lire sur l’un d’eux...
if((new_sock = accept(sock,(struct sockaddr *) &clt,&clt_len)) == -1){perror("main (tcp_src_hello_world.c): accept");return -1;}
Deux options :
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
‣Parrallélisme (multi-processus) : fork
➡vue orientée «serveur» : on crée un processus fils par connexion entrante✓boucle sur le accept avec création d’un fils à chaque tour✓chaque fils envoie/reçoit les données d’un client TCP
➡vue orientée «pair à pair» : on crée deux processus fils lecture réseau + clavier✓le fils réseau lit les données sur la socket puis écrit en local✓le fils clavier lit les données sur le descripteur local puis écrit sur le réseau
‣Ecoute sur plusieurs descripteurs (mono processus) : select
➡On écoute en boucle sur tous les descripteurs enregistrés pendant un timeout donné et on traite le premier signal reçu...
fork
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
‣Gestion père/fils
int pid;/* Création d’un processus fils. */pid = fork();/* traitement de l’erreur */if(pid == -1){perror("fork");return -1;}/* processus fils */else if(pid == 0){/* traitement du fils */}/* processus père */else{/* traitement du père */}
‣Exterminer ses fils zombies :#include <signal.h>
void kill_child(int signum){int tmp;if(signum == SIGCHLD){/* on attend qu’un (ou +) fils se transforme en zombie et on le butte !... */while((tmp = waitpid(-1,NULL,WNOHANG))> 0){}if(tmp == -1){perror("waitpid");}}/* on ré-arme le signal */if(signal(SIGCHLD, kill_child) == SIG_ERR){perror("signal");exit(-1);}}
select
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
‣Cette fonction permet de demander au système quels sont les descripteurs accessibles en (~ayant générer des signaux en) : lecture, écriture, ou génèrant des exceptions.
#include <sys/select.h>#include <sys/time.h>#include <sys/types.h>#include <unistd.h>
fd_set read_fs;fd_set write_fs;
while(1){tv.tv_sec = 5;tv.tv_usec = 0;FD_ZERO(&read_fds);FD_SET(sock1, &read_fds);FD_SET(sock2, &read_fds);FD_ZERO(&write_fds);FD_SET(sock3, &write_fds);max_fd = max(sock1, sock2, sock3);[...]
✓Timeout
✓Initialisation des groupes de descripteur
✓Plus grand descripteur ...
select:gestion des descripteurs
DUT INFO S32 2010/2011 - Pascal Mérindol - http://www-r2.u-strasbg.fr/~merindol/
[...]if((retval = select(max_fd + 1, &read_fds, &write_fds, NULL, &tv)) == -1){perror("select()");return -1;}else if (retval){if(FD_ISSET(sock1, &read_fds)){read(sock1, ..., ...);}else if(FD_ISSET(sock2, &read_fds)){read(sock2, ..., ...);}else if(FD_ISSET(sock3, &write_fds)){write(sock3, ..., ...);}}else{printf("Pas de descripteurs actifs sur les 5 dernières sec\n");}
‣ (A appeler en boucle ..! )
Comprendre les Réseaux CM1 - THE END
DUT INFORMATIQUE
MERCI JULIEN !
http://www-r2.u-strasbg.fr/~merindol/