Chapitre 2 - Université Laval

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