Comprendre les Réseaux (S32)clarinet.u-strasbg.fr/~merindol/uploads/Teaching/CM-socket.pdf ·...

42
Comprendre les Réseaux (S32) DUT INFO Pascal Mérindol (GR 1-2): [email protected] TD/TP (GR 3-4): Jonathan Weber TD/TP (GR 5): Julien beaudeaux http://www-r2.u-strasbg.fr/~merindol/ + guest star: Julien Montavont !

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)

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

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/