Cours de Systèmes des Réseaux p.1/40. Master IST partie Linux



Documents pareils
1. Fonctionnement de l Internet 2. Protocoles applicatifs 3. Programmation réseau

Travaux Pratiques Introduction aux réseaux IP

Applications client/serveur TCP/IP - Sockets Rappels. C.Crochepeyre Applications CS 1

Programmation Réseau. Anthony Busson IUT Info Lyon 1

Communication par sockets

LA COUCHE TRANSPORT CONTRÔLE LE FLOT DE DONNEES TRANSMISES par la couche Réseau

Communication sous UNIX les sockets

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

DHCP et NAT. Cyril Rabat Master 2 ASR - Info Architecture des réseaux d entreprise

Configuration automatique

Programmation Réseau en C sous Unix

Plan. Programmation Internet Cours 3. Organismes de standardisation

Installation et configuration d un serveur DHCP (Windows server 2008 R2)

Programmation Réseau. ! UFR Informatique ! Jean-Baptiste.Yunes@univ-paris-diderot.fr

Programmation système de commandes en C

Plan global. Programmation système II. Socket du domaine UNIX. Plan. Socket UNIX, Terminaux, Async IO, Mémoire, ELF.

Chapitre I. La couche réseau. 1. Couche réseau 1. Historique de l Internet

Introduction. Adresses

Le service de nom : DNS

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7

Conventions d écriture et outils de mise au point

OS Réseaux et Programmation Système - C5

II/ Le modèle OSI II.1/ Présentation du modèle OSI(Open Systems Interconnection)

Administration Système & Réseau. Domain Name System Historique & Concepts Fonctionnalités & Hiérarchie Requêtes & Base de donnée DNS

2. MAQUETTAGE DES SOLUTIONS CONSTRUCTIVES. 2.2 Architecture fonctionnelle d un système communicant.

Intérêt du NAT (Network Address Translation) Administration Réseau Niveau routage. Exemple d Intranet. Principe NAT

NOTIONS DE RESEAUX INFORMATIQUES

Installation Serveur DNS Bind9 Ubuntu LTS

Cours 6 : Programmation répartie

Résolution de noms. Résolution de noms

Le protocole ARP (Address Resolution Protocol) Résolution d adresses et autoconfiguration. Les protocoles ARP, RARP, TFTP, BOOTP, DHCP

Les clés d un réseau privé virtuel (VPN) fonctionnel

L3 informatique Réseaux : Configuration d une interface réseau

- FICHE DE PROCEDURE - Configurer un serveur DNS avec Bind9 sur Debian

Cisco Certified Network Associate

Année Universitaire session 1 d automne Parcours : CSB5 Licence 3 STS Informatique

Programmation Internet en Java

DIGITAL NETWORK. Le Idle Host Scan

Réseaux - Cours 4. Traduction d adresse (NAT/PAT) et Service de Nom de Domaine (DNS) Cyril Pain-Barre. IUT Informatique Aix-en-Provence

Couche application. La couche application est la plus élevée du modèle de référence.

Présentation du modèle OSI(Open Systems Interconnection)

Outils de l Internet

Réseaux IUP2 / 2005 DNS Système de Noms de Domaine

Administration réseau Résolution de noms et attribution d adresses IP

Sécurité des réseaux Firewalls

Dynamic Host Configuration Protocol

UFR de Mathématiques et Informatique Année 2009/2010. Réseaux Locaux TP 04 : ICMP, ARP, IP

1 DHCP sur Windows 2008 Server Introduction Installation du composant DHCP Autorisation d'un serveur DHCP...

Devoir Surveillé de Sécurité des Réseaux

DIFF AVANCÉE. Samy.

Internet Le service de noms - DNS

DNS Server RPC Interface buffer overflow. Céline COLLUMEAU Nicolas BODIN

INTERNET & RESEAUX. Dino LOPEZ PACHECO lopezpac@i3s.unice.fr

Plan. École Supérieure d Économie Électronique. Plan. Chap 9: Composants et systèmes de sécurité. Rhouma Rhouma. 21 Juillet 2014

Réseaux. DNS (Domaine Name System) Master Miage 1 Université de Nice - Sophia Antipolis. (second semestre )

TP2 - Conguration réseau et commandes utiles. 1 Généralités. 2 Conguration de la machine. 2.1 Commande hostname

le minimum pour communiquer par réseau (sans toutefois y comprendre grand chose)

Exercice sur les Dockers

Rappels réseaux TCP/IP

Service de noms des domaines (Domain Name System) Cours administration des services réseaux M.BOUABID,

Développement d un logiciel de messagerie instantanée avec Dotnet (version simplifiée)

Réseau - VirtualBox. Sommaire

Domain Name System. F. Nolot

Le Multicast. A Guyancourt le

Introduction au langage C

Algorithmique et langages du Web

Configuration automatique

PowerShield 3 fournit toutes les informations nécessaires pour un diagnostic de premier niveau.

Playing with ptrace() for fun and profit

TP 1 : LES COMMANDES RESEAUX Matière: RESEAUX LOCAUX

Le protocole TCP. Services de TCP

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Services Réseaux - Couche Application. TODARO Cédric

Couche Transport TCP et UDP

B1-4 Administration de réseaux

Cours de Système : Gestion de Fichiers

Haka : un langage orienté réseaux et sécurité

Les firewalls libres : netfilter, IP Filter et Packet Filter

Réseaux - Cours 3. BOOTP et DHCP : Amorçage et configuration automatique. Cyril Pain-Barre. IUT Informatique Aix-en-Provence

Bases de programmation. Cours 5. Structurer les données

SYSTEME DE GESTION DES ENERGIES EWTS EMBEDDED WIRELESS TELEMETRY SYSTEM

Réseaux. 1 Généralités. E. Jeandel

Internet Protocol. «La couche IP du réseau Internet»

UDP/TCP - Protocoles transport

Sécuriser son réseau. Sécuriser son réseau Philippe Weill (IPSL/LATMOS) Frédéric Bongat (SSI/GOUV/FR)

Réseaux. Moyens de sécurisation. Plan. Evolutions topologiques des réseaux locaux

L annuaire et le Service DNS

Outils d'analyse de la sécurité des réseaux. HADJALI Anis VESA Vlad

Nmap (Network Mapper) Outil d exploration réseau et scanneur de ports/sécurité

Programmation client-serveur sockets - RPC

Capture, Filtrage et Analyse de trames ETHERNET avec le logiciel Wireshark. Etape 1 : Lancement des machines virtuelles VMWARE et de Wireshark

Domain Name System ot ol F. N 1

Le modèle client-serveur

Cours de sécurité. Pare-feux ( Firewalls ) Gérard Florin -CNAM - - Laboratoire CEDRIC -

CONVERTISSEUR RS 232/485 NOTICE

M Architecture des réseaux

Internet - Outils. Nicolas Delestre. À partir des cours Outils réseaux de Paul Tavernier et Nicolas Prunier

Introduction à la Programmation Parallèle: MPI

7.3 : Ce qu IPv6 peut faire pour moi

Transcription:

Cours de Systèmes des Réseaux Master IST partie Linux T. Hérault herault@lri.fr Université Paris XI Cours de Systèmes des Réseaux p.1/40

Sockets et Réseau Sockets et Réseaux Cours de Systèmes des Réseaux p.2/40

Berkeley Sockets Premières implémentations de TCP/IP : BSD Unix, 1981 API Socket normalisée par Berkeley dans 4.1cBSD Unix Cette API est maintenant implantée partout (Un*x, Windows, Mac...) c est donc le standard de fait. Au coeur de cette API : la notion de socket, un objet du noyau qui relie un service réseau à un programme utilisateur, à la manière des descripteurs de fichiers Cours de Systèmes des Réseaux p.3/40

Comparaison avec les fichiers Fichiers : 6 appels systèmes principaux open, creat, close, read, write et lseek. Utilisent un descripteur de fichier (équivalent du Handle) Dans un monde idéal : les sockets fonctioneraient pareil (Credo UN*X: tout est un fichier) Ce n est pas complétement possible. Cours de Systèmes des Réseaux p.4/40

Comparaison avec les fichiers Relations client/serveur : asymétriques Communication réseau : peut être orientée connection ou pas. Open n a pas toujours de sens. Les noms sont plus important en réseau qu en fichiers : on doit pouvoir savoir à qui on s adresse à tout moment Une association réseau = (def) {protocol, local addr, local process, foreign addr, foreign process} : plus de paramètres qu un fichier Pour certaines communications, les frontières doivent être respectées (2 émissions = 2 réceptions de même tailles) Une même interface réseau peut supporter différents protocoles de communication : techniques génériques d adressage, un peu équivalent à avoir différentes techniques d accès pour les fichiers. Cours de Systèmes des Réseaux p.5/40

Adressage Berkeley : principe Adressage hierarchique Objet conçu à une époque où les langages à objets n étaient pas très populaires interface avec le système : C! Donc plein de void* et de cast Adresse de base : la struct sockaddr dans <sys/socket.h> struct sockaddr { u_short sa_family; /* address family : AF_xxx value * char sa_data[14]; /* up to 14 bytes of protocol-*/ /* specific address*/ }; bug de l an-200, ou des 640Kb qui seront toujours suffisant Le contenu de sa_data dépends du protocole. Cours de Systèmes des Réseaux p.6/40

Adressage Berkeley : Internet Pour IPv4, la structure spécifique d adresse est définie dans <netinet/in.h> : struct in_addr { u_long s_addr; /* 32-bit netid/hostid */ /* network byte orders */ }; struct sockaddr_in { short sin_family;/* AF_INET */ u_short sin_port; /* 16-bit port number (networ struct in_addr sin_addr; /* 32-bit netid/hostid (netwo char sin_zero[8]; /* unused */ }; int inet_aton(const char *cp, struct in_addr *inp); Cours de Systèmes des Réseaux p.7/40

Adressage Berkeley : Unix Sockets unix, dans <sys/un.h> : struct sockaddr_un { short sun_family; /* AF_UNIX */ char sun_path[108]; /* pathname */ }; dépassement de capacité de certaines fonctions (table de routage suppose 16 octets de données par exemple) sun_path n est pas forcément 0 terminé (spécification!) Comment indiquer la taille exacte du nom de fichier, et éviter les SEGFAULTS? chaque fois qu on passe une adresse sockaddr_xxx à une fonction, on doit lui passer aussi la taille de la structure en argument Cours de Systèmes des Réseaux p.8/40

Adressage Berkeley : Argument Pourquoi tous ces cast, et cet argument supplémentaire? Union : taille de l union = taille du plus grand des membres. Perte de place (110 octets même pour IPv4) sockaddr_un : devrait contenir son propre champs length... raisons historiques : inventées avant les autres IPC. Leur intégration s est fait avec compatibilité ascendante Solution choisie : solution de compromis. Taille minimum (16 octets), mais plus grand accepté pour certaines fonctions. cast au lieu d union pour implanter cela paramètre supplémentaire de taille Cours de Systèmes des Réseaux p.9/40

Création d une socket Pour s allouer une socket, on utilise l appel système socket. La socket obtenue n est connectée à rien (différence avec open pour les fichiers) c est juste un descripteur de fichier qu on peut utiliser pour les autres syscall il faut quand même s allouer la socket dans le bon espace. int socket(int family, int type, int protocol); family : la famille de protocoles utilisés : PF_UNIX Protocles IPC unix PF_INET Protocoles Internet PF_NS Xerox NS PF_IMPLINK IMP link PF_PACKET interface paquets à paquets Cours de Systèmes des Réseaux p.10/40

Création d une socket type : le type de communication parmis : SOCK_STREAM flux (orienté connection) SOCK_DGRAM datagram (orienté paquets) SOCK_RAW sockets raw SOCK_SEQPACKET paquets séquentiels Toutes les combinaisons ne sont pas possibles. On a notamment les combinaisons suivantes : PF_UNIX PF_INET PF_PACKET SOCK_STREAM Yes TCP SOCK_DGRAM Yes UDP IP SOCK_RAW Yes Eth Cours de Systèmes des Réseaux p.11/40

Création d une socket Les boîtes Yes sont des combinaisons possibles pour lesquelles il n existe pas d acronyme IP : intégralité du paquet, à partir de l en-tête IP Eth : intégralité du paquet, y compris l en-tête physique TCP/SOCK_RAW : ancienne combinaison pour obtenir le niveau physique (moins pratique) Cours de Systèmes des Réseaux p.12/40

Création d une socket protocol : sert à spécifier le protocole utilisé. On peut mettre à 0 (protocole par défaut pour la combinaison type/famille) dans la plupart des cas famille type identifiant de protocole Protocole réel PF_INET SOCK_DGRAM IPPROTO_UDP UDP PF_INET SOCK_STREAM IPPROTO_TCP TCP PF_INET SOCK_RAW IPPROTO_ICMP ICMP PF_INET SOCK_RAW IPPROTO_RAW (raw) PF_RAW SOCK_PACKET htons(eth_p_xxx) paquets du protocole ethernet XXX Cours de Systèmes des Réseaux p.13/40

Création d une socket solution alternative, pour le domaine UNIX uniquement : socketpair(int family, int type, int protocol, int sockvec[2]); Crée deux descripteurs de socket UNIX connectées et anonymes. similaire à pipe, mais les deux sockets sont accessible en lecture et écriture family doit être PF_UNIX type peut être SOCK_STREAM, ou SOCK_DGRAM protocol devrait être 0 Cours de Systèmes des Réseaux p.14/40

Associer : bind cas simple : protocole non connecté (UDP) Deux problèmes : si je suis serveur comment dire que je veux recevoir les messages sur le port 1024? si je suis client, comment dire que je veux recevoir des réponses à mes requêtes? Un appel système : bind bind associe le descripteur de socket à une adresse (de retour) dans la famille concernée les messages envoyés à cette adresse associée seront passés à la socket Cours de Systèmes des Réseaux p.15/40

UDP/IP Serveur (protocole sans connection) Client socket() bind() socket() bind() données (requête) recvfrom() sendto() données (réponse) sendto() recvfrom() Cours de Systèmes des Réseaux p.16/40

TCP/IP : rappels Cours de Systèmes des Réseaux p.17/40

TCP/IP Serveur (protocole avec connection) socket() bind() listen() Client socket() établissement de la connection accept() connect() read() recv() write() send() données (requête) données (réponse) write() send() read() recv() Cours de Systèmes des Réseaux p.18/40

Appels système : bind int bind(int sockf, struct sockaddr *myaddr, int addrlen) 1. Les serveurs enregistrent leur adresse auprès du système avec bind. 2. les clients peuvent enregistrer une adresse spécifique grace à bind 3. un client sans connection doit enregistrer (s allouer) une adresse pour recevoir des réponses à ses requêtes bind définis les paramètres local-addr et local-process du quintuplet associé à une communication réseau Cours de Systèmes des Réseaux p.19/40

Appels système : bind Pour la famille AF_INET, il existe deux valeurs particulières : 1. INADDR_ANY pour le champs sin_addr : associe le descripteur de fichiers à toutes les adresses IP. Sens : accepter un message de n importe qui sur l internet 2. 0 pour le champs sin_port. Sens : allouer un port libre, quelqu il soit. On se sert alors de getsockname pour connaitre le port alloué Peut échouer (renvoie alors -1). Erreur la plus probable : un autre processus est déjà associé à cette adresse sur la machine Cours de Systèmes des Réseaux p.20/40

Appels système : connect int connect(int sockfd, struct sockaddr *serveraddr, int addrlen) Pour les protocoles orientés connections (STREAM), connect établis la connection côté client si le bind n est pas fait avant (cas normal), connect associe le quadruplet local-addr, local-process, foreign-addr, foreign-process du client Pour les protocoles orientés sans connection (DGRAM), connect peut être utilisé Il ne crée pas de message de connection, mais associe à la socket une unique adresse de retour et d émission ainsi, un processus client peut ensuite faire du read/write ou send/recv sur la socket de plus, dans certaines implémentations, cela augmente le niveau d information fourni par les messages d erreur Cours de Systèmes des Réseaux p.21/40

Appels système : listen int listen(int sockfd, int backlog) Utilisé seulement par les protocoles orientés connections généralement juste après le bind, et de toute façon avant le premier accept signale que la socket sockfd est utilisée pour recevoir des connections entrantes backlog: nombre maximal de connections en attente que le noyau doit gérer avant de renvoyer automatiquement le connection refused Cours de Systèmes des Réseaux p.22/40

Appels système : accept int accept(int sockfd, struct sockaddr *peer, int *addrlen) Accept prends la première demande de connection de la queue de sockfd, et crée une nouvelle socket avec les mêmes propriétés que sockfd, mais connectée avec peer si aucune demande de connection ne se trouve dans la queue, bloque sockfd doit être en mode listen *addrlen doit être initialisé à la taille réelle de *peer, et contient à la sortie de accept la taille utilisée dans *peer Cours de Systèmes des Réseaux p.23/40

Appels système : accept *peer contient l adresse (au format dépendant de la famille de sockfd) de l hôte avec lequel la connection est établie *peer doit être initialisé à zéro (tous les champs sauf la famille) avant l appel accept définit les quatre paramètres du quintuplet de la communication réseau. foreign-addr, et foreign-process restent indéfinis dans sockfd, ce qui permet de le réutiliser tout de suite pour accepter une nouvelle connection Cours de Systèmes des Réseaux p.24/40

Appels système : send, sendto, recv, recvfrom int send(int sockfd, char *buf, int nbytes, int flags) int sendto(int sockfd, char *buf, int nbytes, int flags, struct sockaddr *to, int addrlen) int recv(int sockfd, char *buf, int nbytes, int flags) int recvfrom(int sockfd, char *buf, int nbytes, int flags, struct sockaddr *from, int *addrlen) Cours de Systèmes des Réseaux p.25/40

Appels système : send, sendto, recv, recvfrom sockfd, buf et nbytes fonctionnent exactement comme read et write flags est un ou logique des constantes suivantes (il y en a d autres qu on verra plus tard) : 1. MSG_OOB : emet ou recoit des données hors bande 2. MSG_PEEK : ne retire pas le message lu de la file des messages 3. MSG_DONTROUTE : envoie le paquet sans tenir compte des règles de routage (send ou sendto) Cours de Systèmes des Réseaux p.26/40

Appels système : close int close(int fd) int shutdown(int fd, int how) close libère la ressource allouée au descripteur de fichier. Pour les socket connectées : ferme une connection. Dans les deux sens pour close, selon how pour shutdown. how = SHUT_RD SHUT_WR SHUT_RDWR Les données restantes sont envoyées ou acknowledgées avant que le noyau ne libère complétement les ressources pour les protocoles fiables (TCP) il est cependant toujours préférable que le protocole applicatif ferme la connection à la two-way-handshake Cours de Systèmes des Réseaux p.27/40

Segmentation et fusion dans les flux Serveur char c[65536]; int i; for(i = 0; i < 65536; i+=1024) send(sockfd, c+i, 1024, 0); Client char r[65536]; int i; for(i = 0; i < 65536; i+=1024) recv(sockfd, r+i, 1024, 0) 1. send n emets pas forcément 1024 octets en une seule fois 2. recv ne reçoit pas forcément 1024 octets à chaque fois Cours de Systèmes des Réseaux p.28/40

Segmentation et fusion dans les flux fusions : deux sends peuvent se transformer en un seul recv (pas dans ce code) segementation : un send peut se transformer en plusieurs recv send : on emets de 1 à n octets recv : on reçoit de 1 à n octets ceci est vrai aussi pour read, write, sendto, recvfrom ce n est pas vrai pour les sockets en mode DGRAM : là, la décision est binaire toutes ces opérations sont de plus bloquantes! Cours de Systèmes des Réseaux p.29/40

Emission bloquante static int bsend(int sockfd, char *c, int tosend) { int sent, n; sent = 0; while(tosend > 0) { n = send(sockfd, c, tosend, 0); if( n == -1 ) { perror("bsend"); return sent; } sent += n; tosend -= n; c += n; } return sent; } Cours de Systèmes des Réseaux p.30/40

Reception bloquante static int brecv(int sockfd, char *c, int toreceive) { int received, n; received = 0; while(toreceive > 0) { n = recv(sockfd, c, toreceive, 0); if( n == -1 ) { perror("brecv"); return received; } received += n; toreceive -= n; c += n; } return received; } Cours de Systèmes des Réseaux p.31/40

Endian Ca dépends de la représentation interne de la machine On distingue 2 types : Big et Little Endian Big Endian (Sparc, IBM 370,...) : *((char *)&x) == 0xAA Little Endian (x86, VAX,...) : *((char *)&x) == 0xBB Et pour les entiers de 32 Bits? C est pire : certains systèmes de représentation échangent en plus les couples de bytes Et pour les flottants? Il y a presque autant de représentation que de constructeurs machines Cours de Systèmes des Réseaux p.32/40

Et alors? Le champs port du paquet UDP est un entier sur 16 bits. quand j envoie un paquet UDP depuis mon PC x86 vers mon serveur TFTP, je le contact sur le port TFTP : 69 = 0x0045. si mon serveur TFTP est un Sparc, il reçoit 0x4500 = 17664... Il faut donc se mettre d accord sur une norme lorsqu on communique sur le réseaux pour faire passer les valeurs qui ont un sens groupées C est ce qu on appelle l XDR : external Data Representation RFC 1014. Cours de Systèmes des Réseaux p.33/40

Faut-il coder la RFC à la main? Pour les entiers jusqu à 32 bits : non. En C : 5 formes d entiers : char, short, long, int, long long ntohl = Network TO Host Long htonl = Host TO Network Long ntohs = Network TO Host Short htons = Host TO Network Short et pour les char? Cours de Systèmes des Réseaux p.34/40

Gestion de l encapsulation en C struct iphdr { #if BYTE_ORDER == LITTLE_ENDIAN unsigned int ihl:4; unsigned int version:4; #elif BYTE_ORDER == BIG_ENDIAN unsigned int version:4; unsigned int ihl:4; #endif u_int8_t tos; u_int16_t tot_len; u_int16_t id; u_int16_t frag_off; u_int8_t ttl; u_int8_t protocol; u_int16_t check; u_int32_t saddr; u_int32_t daddr; /*The options start here. */ }; Cours de Systèmes des Réseaux p.35/40

Exemples de clients et serveurs Client UDP Serveur UDP Client TCP Serveur TCP multi process multi thread Cours de Systèmes des Réseaux p.36/40

DNS : résolution de noms #include <netdb.h> extern int h_errno; struct hostent *gethostbyname(const char *name); void herror(const char *s); const char *hstrerror(int err); DNS : Domain Name Service résouds une FQDN en adresse IP (Fully Qualified Domain Name) www.lri.fr => 129.175.15.10 Des fois pas si simple www.google.fr -> www.google.com -> www.l.google.com -> (216.239.59.147, 216.239.59.99, 216.239.59.103, 216.239.59.104) Cours de Systèmes des Réseaux p.37/40

DNS : résolution de noms 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 */ }; #define h_addr h_addr_list[0] /* for backward compatibility les tableaux sont zéro terminés tout est alloué par gethostbyname, et rien ne doit être désalloué deux appels consécutifs à gethostbyname écrasent les valeurs précédentes! Cours de Systèmes des Réseaux p.38/40

DNS : exemple struct hostent *h; char **a; struct in_addr addr; h = gethostbyname("www.google.fr"); if(!h ) { herror("www.google.fr"); exit(1); } printf("true name : %s\n", h->h_name); Cours de Systèmes des Réseaux p.39/40

DNS : exemple if( *(h->h_aliases) ) { printf("aliases :\n"); for(a = h->h_aliases; *a; a++) printf(" %s\n", *a); } assert( (h->h_addrtype == AF_INET) && (h->h_length == 4) ); printf("addresses :\n"); for(a = h->h_addr_list; *a; a++) { memcpy(&addr, *a, h->h_length); printf(" %s\n", inet_ntoa(addr)); } Cours de Systèmes des Réseaux p.40/40