GIF 3001 : Réseaux de transmission de données Chapitre 2 - Couche Application Florent Parent Département de génie électrique et génie informatique Université Laval Automne 2014 GIF 3001 Automne 2014 1 / 138 Source du matériel de cours : http://www-net.cs.umass.edu/ kurose-ross-ppt-6e/ Matériel original : Material copyright 1996-2012 J.F Kurose and K.W. Ross, All Rights Reserved Traduction et matériel supplémentaire par Florent Parent ([email protected]) GIF 3001 Automne 2014 2 / 138 Première partie I Protocoles de la couche Application GIF 3001 Automne 2014 3 / 138 1 Principes des applications réseau 2 Utilitaires TCP/IP 3 Web et HTTP 4 Courrier électronique (SMTP, POP3, IMAP) 5 DNS 6 Applications poste-à-poste GIF 3001 Automne 2014 4 / 138 Principes des applications réseau Modèles d’architecture Client-Serveur Poste-à-poste (P2P) Hybride : entre client-serveur et poste-à-poste GIF 3001 Automne 2014 6 / 138 Principes des applications réseau Architecture client-server serveur Nœud toujours disponible Adresse IP «stable» Grappe de serveurs pour augmenter l’échelle client Communiquent avec le serveur Connexion peut être intermittente Adresse IP peut être dynamique Ne communiquent pas entre eux GIF 3001 Automne 2014 7 / 138 Principes des applications réseau Architecture P2P serveur Pas de serveur Communications poste-à-poste. Connexion intermittentes entre les postes Adresses IP dynamiques Fortement extensible, mais difficile à gérer. GIF 3001 Automne 2014 8 / 138 Principes des applications réseau Hybride entre client-serveur et P2P Skype Application P2P voix et vidéo sur IP Serveur centralisé : découverte de l’adresse du partenaire distant connexion directe client-client (pas de serveur centralisé) Messagerie instantanée Clavardage entre 2 utilisateurs est P2P Service centralisé : détection et localisation des clients utilisateur communique son adresse IP avec un serveur lorsqu’il est connecté utilisateur contacte le serveur central pour localiser (adresse IP) ses amis GIF 3001 Automne 2014 9 / 138 Principes des applications réseau Communication entre processus Définition Processus : programme actif sur un poste. Sur un même poste, deux processus communiquent par une communication inter-processus («IPC») gérée par le système d’exploitation. Les processus sur des postes différents communiquent par un échange de messages. Processus client : processus qui initie la communication Processus serveur : processus en attente d’une connexion GIF 3001 Automne 2014 10 / 138 Principes des applications réseau Sockets serveur Un processus reçoit et envoie des messages par socket Un socket est semblable à une porte Processus pousse des message par la porte Processus se fie sur l’infrastructure de transport de l’autre côté de la porte pour acheminer le message au bon destinataire (processus). API 1 2 Choix du protocole de transport ; Capacité d’établir quelques paramètres. GIF 3001 Automne 2014 11 / 138 Principes des applications réseau Adressage d’un processus Pour recevoir des messages, un processus doit posséder un identifiant Un poste possède un identifiant unique : adresse IP Question/Réponse Q : l’adresse IP est-elle suffisante pour identifier le processus ? R : Non, plusieurs processus peuvent être actifs sur le poste. L’adresse IP et le numéro de port associés au processus forment l’identifiant. Exemple de numéros de port : Serveur HTTP : 80 Serveur de courrier : 25 Pour envoyer un message HTTP vers le serveur web www.gel.ulaval.ca Adresse IPv4 : 132.203.14.11 Numéro de port : 80 GIF 3001 Automne 2014 12 / 138 Principes des applications réseau Protocole applicatif Type des messages échangés Requête, résponse Syntaxe des messages : Protocoles domaine public : Quels sont les champs dans les messages, etc. Spécifications dans les RFCs Permettent l’interoperabilité Ex : HTTP, SMTP Sémantique des messages Signification des informations dans les champs Règles sur quand et comment les processus envoient et répondent aux messages GIF 3001 Protocoles propriétaires : Ex : Skype Automne 2014 13 / 138 Principes des applications réseau Services de transport Besoins selon le type d’application Application Transfert de fichier Courriel Documents web Audio/vidéo temps réel Audio/vidéo différé Jeux interactifs Messagerie instantanée Tolère perte de données ? non non non oui oui oui non Débit Sensible au délai ? élastique élastique élastique audio : 5kbps-1Mbps ; vidéo : 10kbps-5Mbps même quelques kbps et+ élastique non non non oui, 100’s msec GIF 3001 oui, quelques secs oui, 100’s msec oui et non Automne 2014 14 / 138 Principes des applications réseau Services de transport des protocoles Internet Service TCP : Service avec connexion : Établissement de connexion nécessaire entre les processus client et serveur Service UDP : transport non-fiable entre les processus transport fiable entre les processus contrôle de flux : l’expéditeur ne submerge pas le destinataire n’offre aucun de ces services : connexion, fiabilité, contrôle de flux, contrôle de congestion, garantie de bande passante, etc. contrôle de congestion : expéditeur réduit la transmission lorsque surcharge sur le réseau GIF 3001 Automne 2014 15 / 138 Principes des applications réseau Applications Internet et protocole de transport Application Protocole applicatif Courriel Accès interactif à distance Web Transfert de fichier Données multimédia en continu Téléphonie IP SMTP[RFC 5321] Telnet [RFC 854] HTTP [RFC 2616] FTP [RFC 959] HTTP (ex. Youtube), RTP [RFC 3550] SIP, RTP, propriétaire (ex : Skype) GIF 3001 Protocole de sous-jacent TCP TCP TCP TCP TCP ou UDP transport typiquement UDP Automne 2014 16 / 138 Utilitaires TCP/IP ifconfig Affiche la configuration des interface réseau “ipconfig” sous Windows Plusieurs options ifconfig -a → Affiche toutes les interfaces Certaines variations entre plateformes MacOSX, et *BSD semblables Linux Solaris GIF 3001 Automne 2014 18 / 138 Utilitaires TCP/IP PING Application pour déterminer si un noœd est joignable Utilise ICMP : Internet Control Message Protocol Protocole important au bon fonctionnement de IP ICMP informe la source sur les erreurs rencontrés durant le traitement des paquets IP par les routeurs ou par la destination Le message ICMP Echo est une requête de réponse de la destination PING envoi des messages echo et un numéro de séquence Détermine si la destination et joignable et le temps aller-retour GIF 3001 Automne 2014 19 / 138 Utilitaires TCP/IP PING ICMP est souvent bloqué pour des motifs de sécurité. Mais un filtrage doit tenir compte des différents types de messages ICMP Certains messages d’erreurs doivent être acheminés à la source. GIF 3001 Automne 2014 20 / 138 Utilitaires TCP/IP Exemple de PING $ p i n g www . u l a v a l . c a PING www . u l a v a l . c a ( 1 3 2 . 2 0 3 . 2 5 0 . 2 6 ) 5 6 ( 8 4 ) b y t e s o f d a t a . 64 b y t e s f r o m d i o n y s o s . u l a v a l . c a ( 1 3 2 . 2 0 3 . 2 5 0 . 2 6 ) : icmp_seq=1 64 b y t e s f r o m d i o n y s o s . u l a v a l . c a ( 1 3 2 . 2 0 3 . 2 5 0 . 2 6 ) : icmp_seq=2 64 b y t e s f r o m d i o n y s o s . u l a v a l . c a ( 1 3 2 . 2 0 3 . 2 5 0 . 2 6 ) : icmp_seq=3 64 b y t e s f r o m d i o n y s o s . u l a v a l . c a ( 1 3 2 . 2 0 3 . 2 5 0 . 2 6 ) : icmp_seq=4 −−− www . u l a v a l . c a p i n g s t a t i s t i c s −−− 4 p a c k e t s t r a n s m i t t e d , 4 r e c e i v e d , 0% p a c k e t l o s s , t i m e 2998 ms t t l =61 t t l =61 t t l =61 t t l =61 t i m e =0.307 t i m e =0.300 t i m e =0.304 t i m e =0.287 ms ms ms ms r t t min / a v g /max/ mdev = 0 . 2 8 7 / 0 . 2 9 9 / 0 . 3 0 7 / 0 . 0 1 8 ms GIF 3001 Automne 2014 21 / 138 Utilitaires TCP/IP Traceroute Tracer la route entre la machine locale et une destination quelconque. Traceroute utilise le champ IP Time-to-Live (TTL) Les paquets IP ont un champ TTL spécifiant le nombre maximum de saut avant que le paquet doit être jeté Chaque routeur décrémente le TTL de 1 Lorsque le TTL est 0, le paquet et jeté et un message d’erreur est envoyé à la source. Traceroute Envoie un paquet (UDP ou ICMP) à la destination avec TTL=1 Le premier routeur envoi un message ICMP « time exceeded » Envoie un paquet (UDP ou ICMP) à la destination avec TTL=2 Le deuxième routeur envoi un message ICMP « time exceeded » Et ainsi de suite ... GIF 3001 Automne 2014 22 / 138 Utilitaires TCP/IP Netstat Statut TCP/IP État des « sockets » Statistiques d’interfaces (compteurs) Statistiques de protocoles (IPv4, IPv6, TCP, UDP, ICMP) Tables de routage netstat -rn Affiche les tables de routage netstat -an [-p] [-tu] Affiche l’état de tous les « sockets » -p permet d’afficher les processus associés (Linux) -u et -t afficher seulement les sockets TCP ou UDP respectivement (Linux) Recommandation : utilisez l’option -n pour éviter la résolution d’adresse vers le nom. GIF 3001 Automne 2014 23 / 138 Utilitaires TCP/IP Netstat : État des sockets $ n e t s t a t −an Active Internet c o n n e c t i o n s ( s e r v e r s and e s t a b l i s h e d ) P r o t o Recv−Q Send−Q tcp 0 0 tcp 0 0 tcp 0 0 tcp 0 0 tcp 0 0 tcp 0 0 tcp 0 0 tcp 0 0 tcp 0 0 tcp 0 0 tcp 0 0 tcp 0 0 tcp 0 0 tcp 0 0 tcp 0 0 tcp 0 0 tcp 0 0 tcp 0 0 tcp 0 0 tcp 1 0 tcp 0 0 tcp 0 0 tcp 0 0 tcp 1 0 Local Address 0.0.0.0:8192 0.0.0.0:711 0.0.0.0:199 0.0.0.0:3306 0.0.0.0:587 0.0.0.0:139 0.0.0.0:685 0.0.0.0:111 0.0.0.0:21 127.0.0.1:631 0.0.0.0:45560 0.0.0.0:25 0.0.0.0:445 132.203.14.74:54196 132.203.14.74:54197 132.203.14.74:54198 132.203.14.74:54199 132.203.14.74:54229 132.203.14.74:54230 132.203.14.74:53786 132.203.14.74:59054 132.203.14.74:58909 132.203.14.74:58898 132.203.14.74:59117 GIF 3001 Foreign Address 0.0.0.0:∗ 0.0.0.0:∗ 0.0.0.0:∗ 0.0.0.0:∗ 0.0.0.0:∗ 0.0.0.0:∗ 0.0.0.0:∗ 0.0.0.0:∗ 0.0.0.0:∗ 0.0.0.0:∗ 0.0.0.0:∗ 0.0.0.0:∗ 0.0.0.0:∗ 132.203.30.9:389 132.203.30.9:389 132.203.30.9:389 132.203.30.9:389 132.203.30.9:389 132.203.30.9:389 132.203.14.3:389 132.203.14.3:9393 132.203.14.3:389 132.203.14.3:389 132.203.14.3:389 State LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN LISTEN TIME_WAIT TIME_WAIT TIME_WAIT TIME_WAIT TIME_WAIT TIME_WAIT CLOSE_WAIT ESTABLISHED ESTABLISHED TIME_WAIT CLOSE_WAIT Automne 2014 24 / 138 Utilitaires TCP/IP dig, nslookup Permet d’interroger un serveur DNS. Envoie directement la requête au serveur de votre choix Utile pour valider un problème de configuration, vérifier un serveur DNS précis, etc. Plusieurs types de requête possible : A, AAAA, NS, SOA, MX, SRV, TXT, KEY, ANY ... dig [ @server ] [ name ] [ type ] [ queryopt... ] GIF 3001 Automne 2014 25 / 138 Utilitaires TCP/IP Exemple de dig $ dig g e l . u l a v a l . c a mx ; <<>> DiG 9 . 8 . 3 − P1 <<>> g e l . u l a v a l . c a mx ; ; g l o b a l o p t i o n s : +cmd ; ; Got a n s w e r : ; ; −>>HEADER<<− o p c o d e : QUERY, s t a t u s : NOERROR, i d : 43170 ; ; f l a g s : q r r d r a ; QUERY : 1 , ANSWER: 2 , AUTHORITY : 2 , ADDITIONAL : 4 ; ; QUESTION SECTION : ; g e l . u l a v a l . ca . IN MX ; ; ANSWER SECTION : g e l . u l a v a l . ca . g e l . u l a v a l . ca . 300 300 IN IN MX MX 10 e x c h−spam01 . u l a v a l . c a . 10 e x c h−spam02 . u l a v a l . c a . ; ; AUTHORITY SECTION : g e l . u l a v a l . ca . g e l . u l a v a l . ca . 297 297 IN IN NS NS magpie . g e l . u l a v a l . ca . s t l a u r e n t . g e l . u l a v a l . ca . IN IN IN IN A A A A 132.203.244.23 132.203.244.24 132.203.14.99 132.203.14.29 ; ; ADDITIONAL SECTION : e x c h−spam01 . u l a v a l . c a . 626 e x c h−spam02 . u l a v a l . c a . 2326 magpie . g e l . u l a v a l . ca . 1496 s t l a u r e n t . g e l . u l a v a l . c a . 1796 GIF 3001 Automne 2014 26 / 138 Utilitaires TCP/IP Exemple de nslookup $ nslookup > s e t t y p e=mx > g e l . u l a v a l . ca Server : 10.141.1.10 Address : 10.141.1.10#53 Non−a u t h o r i t a t i v e a n s w e r : g e l . u l a v a l . ca m a i l e x c h a n g e r = 10 e x c h−spam01 . u l a v a l . c a . g e l . u l a v a l . ca m a i l e x c h a n g e r = 10 e x c h−spam02 . u l a v a l . c a . A u t h o r i t a t i v e a n s w e r s c a n be f o u n d f r o m : g e l . u l a v a l . ca n a m e s e r v e r = magpie . g e l . u l a v a l . ca . g e l . u l a v a l . ca n a m e s e r v e r = s t l a u r e n t . g e l . u l a v a l . ca . e x c h−spam01 . u l a v a l . c a internet address = 132.203.244.23 e x c h−spam02 . u l a v a l . c a internet address = 132.203.244.24 magpie . g e l . u l a v a l . ca internet address = 132.203.14.99 s t l a u r e n t . g e l . u l a v a l . ca i n t e r n e t a d d r e s s = 1 3 2 . 2 0 3 . 1 4 . 2 9 GIF 3001 Automne 2014 27 / 138 Utilitaires TCP/IP Tcpdump et analyseur de protocoles tcpdump capture les paquets IP sur une interface réseau (ex : carte Ethernet) Filtrage possible pour capturer seulement des paquets spécifiques Permet de décoder et afficher les protocoles de couche supérieur Tcpdump utilise un pilote spécial pour accéder au paquets via le système d’exploitation (ex : /dev/bpf) Doit être ‘root’ «Wireshark» est un outil graphique de capture de paquets. Basé sur tcpdump. GIF 3001 Automne 2014 28 / 138 Utilitaires TCP/IP Tcpdump et analyseur de protocoles tcpdump (et autres) doit mettre l’interface réseau en mode « espion » (promiscuous) Toutes les trames Ethernet seront lues, pas seulement les trames qui sont destinées à votre adresse Ethernet. Peut générer beaucoup données GIF 3001 Automne 2014 29 / 138 Web et HTTP Web et HTTP Une page Web est composé d’objets Objet : fichier HTML, image JPEG, applet Java, fichier audio,... Une page web contient un fichier HTML avec des références sur plusieurs autres objets Chaque objet et adressable par un URL Exemple d’URL : GIF 3001 Automne 2014 31 / 138 Web et HTTP Survol d’HTTP HTTP : «hypertext transfer protocol» protocole applicatif du web modèle client/serveur client : navigateur qui envoie des requêtes, reçoit et affiche des objets web serveur : serveur web qui envoie des objets en réponse à des requêtes GIF 3001 Automne 2014 32 / 138 Web et HTTP Survol d’HTTP Utilise TCP : HTTP est sans-état Le serveur ne maintient pas Client initie une connexion, TCP d’information sur les requêtes (crée un socket) vers un serveur, passées des clients port 80 ' $ Serveur accepte une connexion Protocoles qui maintiennent un TCP du client «état» sont complexes... Messages HTTP (messages du Historique (état) doit être protocole applicatif) sont maintenu échangés entre le navigateur Si le serveur ou client plante, (client HTTP) et le serveur web les états doivent être (seveur HTTP) re-synchronisés Connexion TCP fermée & GIF 3001 % Automne 2014 33 / 138 Web et HTTP Connexions HTTP HTTP non persistent HTTP persistent Un objet est envoyé par connexion TCP. Plusieurs objets peuvent être envoyés sur une connexion TCP. GIF 3001 Automne 2014 34 / 138 Web et HTTP HTTP non persistent Utilisateur tape l’URL www.gel.ulaval.ca/accueil/index.html (Page contient du text, et références à 10 images jpeg) GIF 3001 Automne 2014 35 / 138 Web et HTTP HTTP non persistent (suite) GIF 3001 Automne 2014 36 / 138 Web et HTTP HTTP non persistent : Temps de réponse Définition du RTT : «round-trip time». Temps «aller-retour» entre deux nœuds. Temps de réponse : Un RTT pour l’établissement de la connexion TCP Un RTT pour la requête HTTP et les premiers quelques octets de la réponse HTTP Temps de transmission du fichier total = 2RTT+ temps de transmission du fichier. GIF 3001 Automne 2014 37 / 138 Web et HTTP HTTP persistent HTTP non persistent : HTTP persistent : Requiert 2 RTTs par objet Temps système pour chaque connexion TCP Serveur laisse la connexion ouverte après avoir envoyé la réponse Navigateur ouvrent souvent plusieurs connexion TCP en parallèle pour télécharger les objets référencés Messages HTTP subséquents entre le même client et serveur sont envoyés sur la connexion ouverte Un RTT pour tous les objets référencés GIF 3001 Automne 2014 38 / 138 Web et HTTP HTTP : Les RFCs RFC 7230 : HTTP/1.1 : Message Syntax and Routing RFC 7231 : HTTP/1.1 : Semantics and Content RFC 7232 : HTTP/1.1 : Conditional Requests RFC 7233 : HTTP/1.1 : Range Requests RFC 7234 : HTTP/1.1 : Caching RFC 7235 : HTTP/1.1 : Authentication GIF 3001 Automne 2014 39 / 138 Web et HTTP Deux types de messages HTTP : requête, réponse HTTP request message : ASCII (format lisible) GIF 3001 Automne 2014 40 / 138 Web et HTTP Message de requête HTTP GIF 3001 Automne 2014 41 / 138 Web et HTTP Types de méthodes HTTP HTTP/1.0 HTTP/1.1 GET GET, POST, HEAD PUT POST HEAD demande au serveur de ne pas envoyer l’objet dans sa réponse. télécharge un fichier dans le corps de la requête vers le chemin spéficié dans le champ URL DELETE supprime le fichier spécifié dans le champ URL GIF 3001 Automne 2014 42 / 138 Web et HTTP Message de réponse HTTP GIF 3001 Automne 2014 43 / 138 Web et HTTP Codes de statut de réponse HTTP serveur → client 200 OK → requête réussie, objet demandé dans le message 301 Moved Permanently → objet demandé déplacé, nouvelle localisation spécifiée dans ce message (Location :) 400 Bad Request → message de requête non-comprise par le serveur 404 Not Found → document demandé n’existe pas sur ce serveur 505 HTTP Version Not Supported GIF 3001 Automne 2014 44 / 138 Web et HTTP Essayez les commandes HTTP 1 Établissez une connexion avec telnet vers un serveur web : telnet www2.gel.ulaval.ca 80 Ouvre une connexion TCP sur le port 80 vers www.gel.ulaval.ca. Tout ce qui est tapé est envoyé sur le port 80 vers www.gel.ulaval.ca 2 Tapez une requête HTTP GET : GET / HTTP/1.1 Host : www2.gel.ulaval.ca 3 Regardez la réponse HTTP envoyée par le serveur GIF 3001 Automne 2014 45 / 138 Courrier électronique (SMTP, POP3, IMAP) Courrier électronique Trois composants : agents utilisateurs (MUA) serveur de courrier (MTA) protocole SMTP Agent utilisateur (MUA) logiciel de courrier composition, rédaction et envoie de messages ex., Eudora, Outlook, elm, Mozilla Thunderbird messages sortants et entrants sont stockés sur un serveur GIF 3001 Automne 2014 47 / 138 Courrier électronique (SMTP, POP3, IMAP) Courrier électronique : serveurs Serveurs de courrier (MTA) boîte aux lettres contient les messages entrants pour un utilisateur file de messages sortants Protocole SMTP entre les serveurs de courrier pour envoyer les messages client : serveur qui envoie le message «serveur» : serveur de courrier qui reçoit le message GIF 3001 Automne 2014 48 / 138 Courrier électronique (SMTP, POP3, IMAP) Courrier électronique : SMTP [RFC 5321] Utilise TCP pour transmettre les messages de façon fiable. Utilise le port 25. Trois phases durant le transfert : établissement de la liaison transfert de message fermeture Interaction command/réponse commandes : texte ASCII réponse : codes de statut et phrase messages doivent être en ASCII 7-bit GIF 3001 Automne 2014 49 / 138 Courrier électronique (SMTP, POP3, IMAP) Scénario : Alice envoie un message à Bob 1 2 3 Alice utilise un logiciel (agent) pour composer un message à [email protected] L’agent d’Alice envoie le message à son serveur de courrier ; message placé dans une file de message. Serveur ouvre une connexion SMTP (client SMTP) vers le GIF 3001 serveur de Bob 4 Le client SMTP envoie le message d’Alice via la connexion TCP 5 Le serveur de courrier de Bob enregistre le message dans la boîte aux lettres de Bob 6 Le logiciel de courrier (agent) de Bob reçoit le message Automne 2014 50 / 138 Courrier électronique (SMTP, POP3, IMAP) Exemple de transaction SMTP S: C: S: C: S: C: S: C: S: C: C: C: S: C: S: 220 hamburger . edu HELO c r e p e s . f r 250 H e l l o c r e p e s . f r , p l e a s e d t o meet you MAIL FROM: < a l i c e @ c r e p e s . f r > 250 a l i c e @ c r e p e s . f r . . . S e n d e r ok RCPT TO: <bob@hamburger . edu> 250 bob@hamburger . edu . . . R e c i p i e n t ok DATA 354 E n t e r m a i l , end w i t h " . " on a l i n e by i t s e l f Do you l i k e k e t c h u p ? How a b o u t p i c k l e s ? . 250 Message a c c e p t e d f o r d e l i v e r y QUIT 221 hamburger . edu c l o s i n g c o n n e c t i o n GIF 3001 Automne 2014 51 / 138 Courrier électronique (SMTP, POP3, IMAP) Expérimentez une interaction SMTP : telnet servername 25 observe réponse 220 du serveur utilisez les commandes HELO, MAIL FROM, RCPT TO, DATA, QUIT Ces commandes vous permettent d’envoyer du courrier électronique comme le ferait un logiciel de courrier. GIF 3001 Automne 2014 52 / 138 Courrier électronique (SMTP, POP3, IMAP) SMTP : conclusion Comparaison avec HTTP HTTP : pull SMTP : push SMTP utilise des connexions persistantes Commandes/réponses en ASCII dans les deux cas SMTP impose des messages (en-tête et corps) ASCII serveur SMTP utilise CRLF.CRLF pour déterminer la fin d’un message GIF 3001 HTTP : chaque objet encapsulé dans son propre message de réponse SMTP : plusieurs objets envoyés dans un message à plusieurs parties Automne 2014 53 / 138 Courrier électronique (SMTP, POP3, IMAP) Format d’un message de courrier SMTP : protocole pour l’échange de messages RFC 5322 : standard du format En-tête To : From : Subject : → Différents des commandes SMTP Corps Le message GIF 3001 Automne 2014 54 / 138 Courrier électronique (SMTP, POP3, IMAP) Format d’un message : extensions multimédia MIME : multimedia mail extension, RFC 2045, 2046 Lignes supplémentaires dans l’en-tête du message indiquent le type de contenu MIME GIF 3001 Automne 2014 55 / 138 Courrier électronique (SMTP, POP3, IMAP) Protocoles d’accès au courrier SMTP : Livraison et stockage au serveur de destination Protocole d’accès au courrier : récupération de messages POP : Post Office Protocol [RFC 1939] – authentification (agent ⇔ serveur) et téléchargement IMAP : Internet Mail Access Protocol [RFC 3501] – plus de fonctions (plus complexe) – manipulation des messages sur le serveur HTTP : gmail, Hotmail, Yahoo ! Mail, etc. GIF 3001 Automne 2014 56 / 138 Courrier électronique (SMTP, POP3, IMAP) Phase d’authentification Commandes client : user : username pass : password S: C: S: C: S: +OK POP3 s e r v e r r e a d y u s e r bob +OK pass hungry +OK u s e r s u c c e s s f u l l y l o g g e d on C: S: S: S: C: S: S: C: C: S: S: C: C: S: list 1 498 2 912 . retr 1 <m e s s a g e 1 c o n t e n t s > . dele 1 retr 2 <m e s s a g e 1 c o n t e n t s > . dele 2 quit +OK POP3 s e r v e r s i g n i n g o f f Réponses du serveur +OK −ERR Phase transactionnelle list : liste des numéros de message retr : récupère message del : supprime quit GIF 3001 Automne 2014 57 / 138 Courrier électronique (SMTP, POP3, IMAP) POP3 et IMAP POP3 IMAP Mode récupère et supprime Tous les messages sont conservés à un endroit : le serveur Ne peut pas récupérer les (mêmes) messages si on change de logiciel/poste. Permet d’organiser les messages dans différents dossiers Si on ne supprime pas les messages du serveur, possible de récupérer sur différents postes IMAP conserve l’état entre les sessions POP3 est sans état entre les sessions GIF 3001 Automne 2014 58 / 138 DNS DNS : Domain Name System Postes et routeurs Internet : Système de Noms de Domaines Base de données distribuée mis en oeuvre par une hiérarchie de serveurs DNS Un protocole applicatif est utilisé par les postes et les serveurs DNS pour résoudre les noms et adresses Internet. (traduction adresse/nom) Adresse IP (32/128 bit) utilisée pour l’adressage de datagrammes “nom”, ex., www.yahoo.com - pour les utilisateurs note : DNS est une fonction importante dans Internet. Implanté comme protocole applicatif complexité en périphérie du réseau GIF 3001 Automne 2014 60 / 138 DNS DNS Services DNS Traduction de nom/ adresse IP Pourquoi ne pas centraliser le DNS ? Alias de nom, raccourcis Point de défaillance unique Nom de serveur de courrier Partage de charge Volume de trafic Plusieurs adresses IP pour un seul nom. GIF 3001 Maintenance Automne 2014 61 / 138 DNS Base de données hiéarchique et distribuée Client désire l’adresse IP de www.amazon.com ; 1ère approx : client interroge un serveur racine pour trouver le serveur du domaine .com client interroge un serveur DNS de .com pour trouver le serveur DNS de amazon.com client interroge un serveur DNS de amazon.com pour trouver l’adresse IP de www.amazon.com GIF 3001 Automne 2014 62 / 138 DNS DNS : hiérarchie Racine CA UK FR US … ccTLD arpa gTLD d’infrastructure com AERO ASIA CAT COOP EDU JOBS MIL MOBI museu m TEL GIV INT TRAV EL xxx gTLD sponsorisé GIF 3001 org net info gTLD nike que bec … 300+ nouveaux gTLD Automne 2014 63 / 138 DNS DNS : Serveurs de nom racine GIF 3001 Automne 2014 64 / 138 DNS TLD et serveur d’autorité Serveurs «Top-level domain» (TLD) : Deux types : ccTLD (Country Code TLD) et gTLD (Generic TLD) ccTLD : Responsable des domaines de pays (ca, uk, fr, jp, au, ...) gTLD : Responsable des domaines génériques tels que com, org, net, edu, etc. Serveur DNS d’autorité : Serveur DNS d’une organisation, est autoritaire pour les noms et adresses IP de son domaine. Peut être hébergé par un fournisseur de service. Idéalement plusieurs serveurs distribués géographiquement (robustesse aux pannes locales). GIF 3001 Automne 2014 65 / 138 DNS Serveur DNS local Ne fait pas nécessairement partie de la hiérarchie des serveurs de nom Une organisation (FSI résidentiel, companie, université, ...) en possède un (ou plusieurs) Lorsqu’un poste émet une requête DNS, la requête est acheminée vers le serveur DNS local agit comme mandataire (proxy), réachemine la requête dans l’hiérarchie DNS GIF 3001 Automne 2014 66 / 138 DNS Exemple de résolution de nom DNS Poste cis.poly.edu envoie une requête pour la machine www.ulaval.ca requête itérative : Le serveur interrogé retourne la réponse “Je ne connais pas la réponse, mais je m’occupe de la trouver” GIF 3001 Automne 2014 67 / 138 DNS Exemple de résolution de nom DNS requête récursive : Le serveur de nom contacté effectue le travail de trouver la réponse Charge importante sur les serveurs Important : Les serveurs racine et les serveurs TLD n’offrent pas de service récursif Les serveurs DNS locaux sont récursifs GIF 3001 Automne 2014 68 / 138 DNS Structure d’un message DNS source : TCP/IP Illustrated, Volume 1, second edition GIF 3001 Automne 2014 69 / 138 DNS Record DNS («Resource Record» ou «RR») Format des réponses DNS Un serveur de nom met en mémoire cache les réponses reçues : TTL source : TCP/IP Illustrated, Volume 1, second edition GIF 3001 Automne 2014 70 / 138 DNS Différents types de record DNS source : TCP/IP Illustrated, Volume 1, second edition GIF 3001 Automne 2014 71 / 138 Applications poste-à-poste Architecture poste-à-poste Distribution de fichiers Recherche d’information Cas d’étude : Skype GIF 3001 Automne 2014 73 / 138 Applications poste-à-poste Distribution de fichier : client-serveur vs. poste-à-poste Question : Temps requis pour distribuer un fichier d’un serveur à N postes ? GIF 3001 Automne 2014 74 / 138 Applications poste-à-poste Temps de distribution de fichier : client-serveur Serveur envoie N copies séquentiellement : N×F us Poste i prends télécharger F di pour Temps requis pour distribuer fichier F à N postes dans une approche client-serveur : N ×F F dcs = max , (1) us dmin Note : dcs :augmentation linéaire avec N (lorsque N large) GIF 3001 Automne 2014 75 / 138 Applications poste-à-poste Temps de distribution de fichier : poste-à-poste Serveur doit envoyer une copie : temps uFs Poste i prends dFi en temps pour télécharger N × F bits doivent être téléchargés (agrégation) Taux de téléversement N X maximal : us + ui i=1 F F N ×F dp2p = max , , N us dmin P us + ui (2) i=1 GIF 3001 Automne 2014 76 / 138 Applications poste-à-poste Comparaison client-serveur et poste-à-poste Taux téléversement (poste) = u, Fu = 1heure, us = 10u, dmin ≥ us GIF 3001 Automne 2014 77 / 138 Applications poste-à-poste Distribution de fichier : BitTorrent Distribution de fichier P2P GIF 3001 Automne 2014 78 / 138 Applications poste-à-poste BitTorrent Fichier divisé en morceaux de 256KB. Poste se joint au torrent : N’a aucun morceau, mais en fera l’accumulation avec le temps S’enregistre avec un tracker pour obtenir une liste de postes. Se connecte à un sous-ensemble de postes «voisins». Pendant le téléchargement, un poste téléverse des morceaux vers d’autres postes. Les postes peuvent quitter, et de nouveaux postes peuvent s’ajouter. GIF 3001 Automne 2014 79 / 138 Applications poste-à-poste BitTorrent Pulling Chunks Sending Chunks : tit-for-tat Le noeud A envoie des morceaux À un temps donné, les noeuds à quatre de ses voisins (ceux ont différents sous-ensembles de dont le taux de transfert est le morceaux du fichier plus élevé) Le noeud A demande Ré-évalue les 4 voisins tous les périodiquement à ses voisins la 10 secondes liste des morceaux qu’ils À chaque 30 secs : choisi détiennent aléatoirement un autre voisin et envoie des morceaux Le noeud A demande à ses voisins pour ses morceaux Nouveau voisin peut rejoindre manquants la liste des top 4 “optimistically unchoke” Le plus «rare» en premier GIF 3001 Automne 2014 80 / 138 Applications poste-à-poste P2P : recherche d’information L’index d’un système P2P : correspondance entre information et localisation du poste (adresse IP & numéro de port) Messagerie instantanée Échange de fichiers (ex. e-mule) Index piste dynamiquement la localisation des fichiers partagés par les postes. Postes doivent indiquer ce qu’ils possèdent. Postes consultent l’index pour déterminer où se retrouve les fichiers recherchés. Index établi la correspondance entre le nom d’un utilisateur et sa localisation. Lorsqu’un utilisateur démarre son logiciel de messagerie instantanée, l’application informe l’index de sa localisation. Postes consultent l’index pour déterminer l’adresse IP d’un utilisateur. GIF 3001 Automne 2014 81 / 138 Applications poste-à-poste Cas d’étude P2P : Skype Protocole applicatif propriétaire (protocole expliqué par ingénierie inverse) Hiérarchie superposée avec les SN Index pour établir la correspondance entre le nom d’utilisateur et l’adresse IP ; distribué aux SN GIF 3001 Automne 2014 82 / 138 Applications poste-à-poste Skype : Poste de relai Problème lorsque Bob et Alice sont derrière un “NAT” NAT empêche un poste externe d’initier une connexion vers un poste interne. Solution : À l’aide du super-nœud d’Alice et Bob, un relai est choisi Chaque poste établi une session avec le relai Les postes peuvent maintenant communiquer à travers le “NAT” via le relai GIF 3001 Automne 2014 83 / 138 Deuxième partie II Programmation réseau GIF 3001 Automne 2014 84 / 138 7 Programmation TCP 8 Programmation UDP GIF 3001 Automne 2014 85 / 138 Programmation TCP API Socket API Socket de Berkeley UNIX (BSD) Introduit dans BSD4.1 UNIX, 1981 Abstraction des fonctions d’émission et réception de données. – Applications utilise un socket pour lire et écrire des données Un “socket” est un connecteur réseau – Permet d’exploiter les services d’un protocole réseau – Interface avec le système d’exploitation – Représenté sous la forme d’un descripteur de fichier Masque les détails des protocoles réseau – Facilite le développement d’applications réseau Disponible dans pratiquement tous les systèmes d’exploitation GIF 3001 Automne 2014 87 / 138 Programmation TCP Programmation socket Socket : «porte» entre l’application et le protocole de transport (UDP, TCP, SCTP) GIF 3001 Automne 2014 88 / 138 Programmation TCP Quelques fonctions de base (C) Fonction socket() connect() bind() listen() accept() read(), write(), recv(), send(), ... close() Description Crée un socket Initie une connexion (TCP) Lie le socket sur un adresse IP locale Place le socket en mode écoute pour recevoir des connexions client Accepte une connexion client Reçoit et envoie des données Ferme le socket GIF 3001 client ? oui oui opt serveur ? oui non oui non oui non oui oui oui oui oui Automne 2014 89 / 138 Programmation TCP Famille de socket int socket (int family, int type, int protocol) ; Famille AF_INET AF_INET6 AF_LOCAL AF_ROUTE AF_KEY Description IPv4 IPv6 Socket Unix Socket de routage Socket de clé (IPsec) GIF 3001 Automne 2014 90 / 138 Programmation TCP Types de socket int socket (int family, int type, int protocol) ; Famille SOCK_STREAM SOCK_DGRAM SOCK_SEQPACKET SOCK_RAW Description mode continu (avec connection) mode datagramme (sans connection) mode séquence de paquets mode “brut” GIF 3001 Automne 2014 91 / 138 Programmation TCP Protocoles d’un socket int socket (int family, int type, int protocol) ; Protocole IPPROTO_TCP IPPROTO_UDP IPPROTO_SCTP SOCK_STREAM SOCK_DGRAM SOCK_SEQPACKET SOCK_RAW Description TCP UDP SCTP AF_INET AF_INET6 AF_LOCAL AF_ROUTE AF_KEY TCP | SCTP UDP SCTP IPv4 TCP | SCTP UDP SCTP IPv6 oui oui oui X X X X oui X X X oui GIF 3001 Automne 2014 92 / 138 Programmation TCP Quelques Structures Socket struct sockaddr_in { __uint8_t sin_len ; sa_family_t sin_family ; in_port_t sin_port ; struct in_addr sin_addr ; char sin_zero [ 8 ] ; }; Structure utilisée pour définir et récupérer les paramètres d’un socket struct sockaddr_in6 { __uint8_t sin6_len ; sa_family_t sin6_family ; in_port_t sin6_port ; __uint32_t sin6_flowinfo ; s t r u c t in6_addr sin6_addr ; __uint32_t sin6_scope_id ; }; /∗ /∗ /∗ /∗ T r a n s p o r t l a y e r p o r t # ∗/ I P 6 f l o w i n f o r m a t i o n ∗/ I P 6 a d d r e s s ∗/ s c o p e z o n e i n d e x ∗/ GIF 3001 Automne 2014 93 / 138 Programmation TCP Différences entre Client et Serveur Serveur Le socket écoute sur un numéro de port connu (ex : 80 pour un service http) Peut écouter sur plusieurs adresses IP simultanément. Écoute passivement pour des requêtes client Client Est normalement assigné un numéro de port éphémère (choisi par le système) Initie la connexion au serveur Doit connaître l’adresse et le numéro de port du serveur – DNS utilisé pour la conversion de nom à adresse IP. GIF 3001 Automne 2014 94 / 138 Programmation TCP Programmation socket avec TCP Le client doit contacter le serveur Lorsque contacté par le client, le serveur TCP crée un nouveau socket pour permettre au processus serveur de communiquer avec le client Processus serveur doit être lancé en premier Serveur doit être en écoute d’une connexion client Client contacte le serveur : Création d’un socket TCP Indique l’adresse IP et numéro de port du processus serveur Lorsque le client crée et connecte le socket : client TCP établit une connexion TCP vers le serveur permet communication avec plusieurs clients numéro du port source permet de différencier les clients (détails au chapitre 3) vue de l’application TCP offre un transfert fiable et ordonné d’octets entre le client et serveur GIF 3001 Automne 2014 95 / 138 Programmation TCP Exemple client-serveur TCP GIF 3001 Automne 2014 96 / 138 Programmation TCP Exemple client-serveur TCP GIF 3001 Automne 2014 97 / 138 Programmation TCP Exemple client-serveur TCP GIF 3001 Automne 2014 98 / 138 Programmation TCP Exemple client-serveur TCP GIF 3001 Automne 2014 99 / 138 Programmation TCP Exemple client-serveur TCP GIF 3001 Automne 2014 100 / 138 Programmation TCP Exemple client-serveur TCP GIF 3001 Automne 2014 101 / 138 Programmation TCP Exemple client-serveur TCP GIF 3001 Automne 2014 102 / 138 Programmation TCP Exemple client-serveur TCP GIF 3001 Automne 2014 103 / 138 Programmation TCP Exemple client-serveur TCP GIF 3001 Automne 2014 104 / 138 Programmation TCP Exemple client-serveur TCP GIF 3001 Automne 2014 105 / 138 Programmation TCP Exemple serveur TCP int n , bytes_to_read ; int sd , new_sd , port ; struct sockaddr_in server , client ; socklen_t client_len ; char ∗ bp , buf [ BUFLEN ] ; /∗ C r e a t e a s t r e a m s o c k e t ∗/ if ( ( sd = socket ( AF_INET , SOCK_STREAM , 0 ) ) == −1) { fprintf ( stderr , "Can ’ t ␣ c r e a t e ␣ a ␣ s o c k e t \n" ) ; exit ( 1 ) ; } /∗ Bind an a d d r e s s t o t h e s o c k e t ∗/ memset ( ( char ∗)& server , 0 , sizeof ( struct sockaddr_in ) ) ; server . sin_family = AF_INET ; server . sin_port = htons ( port ) ; server . sin_addr . s_addr = htonl ( INADDR_ANY ) ; if ( bind ( sd , ( struct sockaddr ∗)& server , sizeof ( server ) ) == −1) { fprintf ( stderr , "Can ’ t ␣ b i n d ␣name␣ t o ␣ s o c k e t \n" ) ; exit ( 1 ) ; } /∗ q ue ue up t o 5 c o n n e c t r e q u e s t s ∗/ listen ( sd , 5 ) ; GIF 3001 Automne 2014 106 / 138 Programmation TCP Exemple serveur TCP while ( 1 ) { client_len = sizeof ( client ) ; if ( ( new_sd = accept ( sd , ( struct sockaddr ∗)& client , &client_len ) ) fprintf ( stderr , "Can ’ t ␣ a c c e p t ␣ c l i e n t \n" ) ; exit ( 1 ) ; } bp = buf ; bytes_to_read = BUFLEN ; while ( ( n = read ( new_sd , bp , bytes_to_read ) ) > 0 ) { bp += n ; bytes_to_read −= n ; } printf ( " Rec ’ d : ␣%s \n" , buf ) ; write ( new_sd , buf , BUFLEN ) ; printf ( " S e n t : ␣%s \n" , buf ) ; close ( new_sd ) ; } /∗ end w h i l e ∗/ GIF 3001 Automne 2014 107 / 138 Programmation TCP Exemple serveur TCP en Python import socket HOST = ’ ’ PORT = 3001 sd = socket . socket ( socket . AF_INET , socket . SOCK_STREAM ) sd . bind ( ( HOST , PORT ) ) sd . listen ( 1 ) new_sd , client_addr = sd . accept ( ) print ’ C o n n e c t e d ␣ by ’ , client_addr while 1 : data = new_sd . recv ( 2 0 4 8 ) if not data : break new_sd . sendall ( data ) new_sd . close ( ) http://docs.python.org/library/socket.html GIF 3001 Automne 2014 108 / 138 Programmation TCP Exemple client TCP struct sockaddr_in server ; host = argv [ 1 ] ; port = atoi ( argv [ 2 ] ) ; if ( ( sd = socket ( AF_INET , SOCK_STREAM , 0 ) ) == −1) { fprintf ( stderr , "Can ’ t ␣ c r e a t e ␣ a ␣ s o c k e t \n" ) ; exit ( 1 ) ; } memset (&server , 0 , sizeof ( struct sockaddr_in ) ) ; server . sin_family = AF_INET ; server . sin_port = htons ( port ) ; if ( ( hp = gethostbyname ( host ) ) == NULL ) { fprintf ( stderr , "Can ’ t ␣ g e t ␣ s e r v e r ’ s ␣ a d d r e s s \n" ) ; exit ( 1 ) ; } memcpy ( hp−>h_addr , &server . sin_addr , hp−>h_length ) ; GIF 3001 Automne 2014 109 / 138 Programmation TCP Exemple client TCP /∗ C o n n e c t i n g t o t h e s e r v e r ∗/ if ( connect ( sd , ( struct sockaddr ∗)& server , sizeof ( server ) ) == −1) { fprintf ( stderr , "Can ’ t ␣ c o n n e c t \n" ) ; exit ( 1 ) ; } printf ( " C o n n e c t e d : ␣ s e r v e r ’ s ␣ a d d r e s s ␣ i s ␣%s \n" , hp−>h_name ) ; printf ( " T r a n s m i t : \ n" ) ; gets ( sbuf ) ; write ( sd , sbuf , BUFLEN ) ; printf ( " R e c e i v e : \ n" ) ; bp = rbuf ; bytes_to_read = BUFLEN ; while ( ( n = read ( sd , bp , bytes_to_read ) ) > 0 ) { bp += n ; bytes_to_read −= n ; } printf ( "%s \n" , rbuf ) ; close ( sd ) ; GIF 3001 Automne 2014 110 / 138 Programmation TCP Exemple client TCP en Python import socket serverName = ’ 1 2 7 . 0 . 0 . 1 ’ serverPort = 3001 clientSocket = socket . socket ( socket . AF_INET , socket . SOCK_STREAM ) clientSocket . connect ( ( serverName , serverPort ) ) message = raw_input ( ’ I n p u t : ␣ ’ ) clientSocket . send ( message ) Response = clientSocket . recv ( 2 0 4 8 ) print ’ From␣ s e r v e r : ␣ ’ , Response clientSocket . close ( ) http://docs.python.org/library/socket.html GIF 3001 Automne 2014 111 / 138 Programmation UDP Programmation socket avec UDP UDP : pas de «connexion» entre le client et le serveur vue de l’application Pas d’établissement de liaison L’expéditeur doit spécifier l’adresse IP et le numéro de port de destination à chaque envoie de paquet UDP : Les données transmises peuvent être reçues désordonnées, ou perdues. vue de l’application UDP offre un transfert au-mieux de groupe d’octets («datagramme») entre un client et un serveur GIF 3001 Automne 2014 113 / 138 Programmation UDP Exemple client-serveur UDP GIF 3001 Automne 2014 114 / 138 Programmation UDP Exemple client-serveur UDP GIF 3001 Automne 2014 115 / 138 Programmation UDP Exemple client-serveur UDP GIF 3001 Automne 2014 116 / 138 Programmation UDP Exemple client-serveur UDP GIF 3001 Automne 2014 117 / 138 Programmation UDP Exemple client-serveur UDP GIF 3001 Automne 2014 118 / 138 Programmation UDP Exemple client-serveur UDP GIF 3001 Automne 2014 119 / 138 Programmation UDP Exemple : Serveur Echo UDP /∗ C r e a t e a d a t a g r a m s o c k e t ∗/ sd = socket ( AF_INET , SOCK_DGRAM , 0) /∗ B i n d an a d d r e s s t o t h e s o c k e t ∗/ b z e r o ( ( c h a r ∗)& s e r v e r , s i z e o f ( s e r v e r ) ) ; server . sin_family = AF_INET ; server . sin_port = htons ( port ) ; server . sin_addr . s_addr = htonl ( INADDR_ANY ) ; i f ( b i n d ( sd , ( s t r u c t s o c k a d d r ∗)& s e r v e r , s i z e o f ( s e r v e r ) ) == −1) { f p r i n t f ( s t d e r r , " Can ’ t ␣ b i n d ␣name␣ t o ␣ s o c k e t \ n " ) ; exit ( 1 ) ; while (1) { client_len = sizeof ( client ) ; i f ( ( n = r e c v f r o m ( sd , b u f , M A X L E N , 0 , ( s t r u c t s o c k a d d r ∗)& c l i e n t , &c l i e n t _ l e n ) ) < 0 ) { f p r i n t f ( s t d e r r , " Can ’ t ␣ r e c e i v e ␣ d a t a g r a m \ n " ) ; exit ( 1 ) ; } i f ( s e n d t o ( sd , b u f , n , 0 , ( s t r u c t s o c k a d d r ∗)& c l i e n t , c l i e n t _ l e n ) != n ) { f p r i n t f ( s t d e r r , " Can ’ t ␣ s e n d ␣ d a t a g r a m \ n " ) ; exit ( 1 ) ; } } close ( sd ) ; GIF 3001 Automne 2014 120 / 138 Programmation UDP Exemple : Client Echo UDP int data_size = DEFLEN , port = SERVER_UDP_PORT ; int i , j , sd ; char ∗ pname , ∗host , rbuf [ MAXLEN ] , sbuf [ MAXLEN ] ; struct hostent ∗hp ; struct sockaddr_in server ; socklen_t server_len ; struct timeval start , end ; i f ( ( s d = s o c k e t ( A F _ I N E T , S O C K _ D G R A M , 0 ) ) == −1) { f p r i n t f ( s t d e r r , " Can ’ t ␣ c r e a t e ␣ a ␣ s o c k e t \ n " ) ; exit ( 1 ) ; } b z e r o ( ( c h a r ∗)& s e r v e r , s i z e o f ( s e r v e r ) ) ; server . sin_family = AF_INET ; server . sin_port = htons ( port ) ; i f ( ( h p = g e t h o s t b y n a m e ( h o s t ) ) == N U L L ) { f p r i n t f ( s t d e r r , " Can ’ t ␣ g e t ␣ s e r v e r ’ s ␣ I P ␣ a d d r e s s \ n " ) ; exit ( 1 ) ; } b c o p y ( hp−>h _ a d d r , ( c h a r ∗)& s e r v e r . s i n _ a d d r , hp−>h _ l e n g t h ) ; if ( d a t a _ s i z e > MAXLEN ) { f p r i n t f ( s t d e r r , " Data ␣ i s ␣ t o o ␣ b i g \ n " ) ; exit ( 1 ) ; } f o r ( i = 0 ; i < d a t a _ s i z e ; i++) { j = ( i < 26) ? i : i % 26; sbuf [ i ] = ’ a ’ + j ; } GIF 3001 Automne 2014 121 / 138 Programmation UDP Exemple : Client Echo UDP server_len = sizeof ( server ) ; i f ( s e n d t o ( sd , s b u f , d a t a _ s i z e , 0 , ( s t r u c t s o c k a d d r ∗)& s e r v e r , s e r v e r _ l e n ) == −1) { f p r i n t f ( stderr , " s e n d t o ␣ e r r o r \n" ) ; exit ( 1 ) ; } i f ( r e c v f r o m ( sd , r b u f , M A X L E N , 0 , ( s t r u c t s o c k a d d r ∗)& s e r v e r , &s e r v e r _ l e n ) < 0 ) { f p r i n t f ( stderr , " r e c v f r o m ␣ e r r o r \n" ) ; exit ( 1 ) ; } close ( sd ) ; GIF 3001 Automne 2014 122 / 138 Programmation UDP API Indépendant du Protocole Les exemples donnés font tous une référence explicite à IPv4 Si nous voulons supporter IPv6, il faut ré-écrire l’application ... Mais pas idéal, car on créer une dépendance explicite à IPv6 ! GIF 3001 Automne 2014 123 / 138 Programmation UDP API Indépendant du Protocole Pourquoi est-il préférable d’écrire une application avec une indépendance sur le protocole réseau ? Si l’application a une dépendance sur IPv4, elle ne peux pas tirer avantage d’IPv6. Si l’application a une dépendance sur IPv6, elle ne fonctionnera pas sur une plateforme qui ne supporte pas IPv6. – Ou lorsque IPv6 n’est pas disponible sur le réseau d’accès. L’application a de meilleure chances d’évoluer lorsqu’un futur protocole sera introduit. GIF 3001 Automne 2014 124 / 138 Programmation UDP API Indépendant du Protocole Solution : utiliser l’API défini dans RFC 3493 POSIX (IEEE Std. 1003.1-2001) Les appels système pour les fonctions socket demeurent les mêmes socket(), bind(), connect(), listen() etc. Nouvelles structures : sockaddr_storage, addrinfo Nouvelles fonction de conversion nom/addresse getnameinfo(), getaddrinfo() GIF 3001 Automne 2014 125 / 138 Programmation UDP sockaddr_storage Structure générique pouvant contenir n’importe quel type de socket (IPv4, IPv6, unix, fichier, etc.) GIF 3001 Automne 2014 126 / 138 Programmation UDP sockaddr_storage Structure retournée par getaddrinfo() Liste chaînée Contient une référence (pointeur) à une structure socket Contient les paramètres nécessaires pour les fonctions socket – socket(), bind(), connect(). struct addrinfo { int ai_flags ; int ai_family ; int ai_socktype ; int ai_protocol ; socklen_t ai_addrlen ; struct sockaddr ∗ ai_addr ; char ∗ ai_canonname ; struct addrinfo ∗ ai_next ; }; /∗ /∗ /∗ /∗ /∗ /∗ /∗ /∗ i n p u t f l a g s ∗/ p r o t o c o l f a m i l y f o r s o c k e t ∗/ s o c k e t t y p e ∗/ p r o t o c o l f o r s o c k e t ∗/ l e n g t h o f s o c k e t −a d d r e s s ∗/ s o c k e t −a d d r e s s f o r s o c k e t ∗/ c a n o n i c a l name f o r s e r v i c e l o c a t p o i n t e r t o n e x t i n l i s t ∗/ GIF 3001 Automne 2014 127 / 138 Programmation UDP Fonctions de résolution de nom et adresse IPv4 seulement gethostbyname() getservbyname() inet_aton() inet_addr() gethostbyaddr() getservbyport() inet_ntoa() Dépendance sur la famille d’adresse Indépendant de la famille d’adresse gethostbyname2() getaddrinfo() inet_pton() getnameinfo() inet_ntop() GIF 3001 Automne 2014 128 / 138 Programmation UDP getaddrinfo() Conversion nom → adresse Prépare les structures à utiliser pour les fonctions socket(), bind(), connect(), etc. Retourne une liste chaînée (struct addrinfo) de toutes les adresses et protocoles possible : une ou plusieurs adresses IPv6 une ou plusieurs adresses IPv4 TCP ou/et UDP L’application utilise le premier élément pour établir une connexion. Si échec, on essaye le suivant. GIF 3001 Automne 2014 129 / 138 Programmation UDP Résolution de nom et service Puisque getaddrinfo retourne les paramètres pour socket(), l’ordre d’appel des fonctions est important ! GIF 3001 Automne 2014 130 / 138 Programmation UDP getaddrinfo() GIF 3001 Automne 2014 131 / 138 Programmation UDP getnameinfo() Conversion adresse → nom Prend une structure sockaddr_* et retourne nom de la machine et le service (numéro de port). man 3 getnameinfo GIF 3001 Automne 2014 132 / 138 Programmation UDP Exemple : Serveur TCP GIF 3001 Automne 2014 133 / 138 Programmation UDP Exemple : Serveur TCP GIF 3001 Automne 2014 134 / 138 Programmation UDP Exemple : Serveur TCP GIF 3001 Automne 2014 135 / 138 Programmation UDP Exemple : Serveur TCP GIF 3001 Automne 2014 136 / 138 Programmation UDP Exemple : Serveur TCP GIF 3001 Automne 2014 137 / 138 Programmation UDP Exemple : Serveur TCP GIF 3001 Automne 2014 138 / 138
© Copyright 2024 ExpyDoc