Réseaux

Transcription

Réseaux
M1 Informatique
Réseaux
Cours 6 – Couche Transport : TCP et UDP
Notes de Cours
L
A COUCHE TRANSPORT CONTRÔLE LE FLOT DE DONNEES TRANSMISES par la couche Ré-
seau dans le but d’offrir des garanties de service aux couches supérieures. Ce contrôle
s’opère uniquement en bord de réseau, au niveau des correspondants.
1
1.a
1.b
Introduction
"Vous êtes Ici"
OSI
TCP/IP
7
Application
Application
6
Presentation
5
Session
4
Transport
Transport
3
Network
Internet
2
Data link
Host-to-network
1
Physical
Not present
in the model
Objectifs
En se basant sur la couche réseau (transmission de datagramme d’un point à l’autre du
réseau) offrir une certaine qualité de service.
Pour IP
— Sans connexion : Ex : UDP/IP
E. Godard
http://www.lif.univ-mrs.fr/~egodard/ens/reseaux/
M1 Informatique
R ÉSEAUX
Réseaux : Cours 6
— Orienté connexion : Ex : TCP/IP
1.c
Espace de Nommage : les Ports
Pour pouvoir gérer ( = distinguer au niveau application) plusieurs envois simultanés
entre deux même machines, il faut augmenter l’espace de nommage.
=> les ports : entiers sur 16 bits
L’espace de nommage ajoute ses ports aux noms IP.
Ex : 147.64.94.233 :9000
Une connexion TCP est donc identifiée par quatre paramètres :
— adresse IP et port d’origine
— adresse IP et port de destination
1.d
Ports Classiques
Traditionnellement, on associe un numéro de port particulier pour chaque type de serveurs :
20
21
22
23
25
80
110
194
443
993
6667
ftp-data
ftp
ssh
telnet
smtp
http
pop3
irc
https
imaps
ircd
transfert de fichier
connexion à distance encryptée
connexion à distance
envoi de courrier électronique
serveur web
consultation de courrier électronique
discussion
connexion sécurisé à un serveur web
Dans /etc/services : “standardisation” IANA.
NB les ports < 1024 ne peuvent être utilisés que par le super-utilisateur.
1.e
UDP
User Datagram Protocol
Envoi de datagramme :
— pas d’assurance que le paquet sera reçu
— pas d’accusé de réception
— vérification d’intégrité
1.f
Entete UDP
32 Bits
Source port
Destination port
UDP length
UDP checksum
2
1.g
M1 Informatique
R ÉSEAUX
Réseaux : Cours 6
Utilisation d’UDP
UDP est utilisé pour
— des protocoles ayant des exigences très spécifiques
qui délèguent la “qualité de service” à une couche supérieure
— des protocoles simples
par exemple, interrogation de “base de données” très simples
— NTP : Network Time Protocol ( synchronisation fine d’horloge)
— RTP : Real Time Protocol
— DNS : Domain Name Server
1.h
Utilisation d’UDP : DNS
Rappel : Résolution des noms IANA en adresses IP (v4 **et* v6)
— Table locale
— Interrogation d’une base de données distante :
— RFCs
— 1983 : RFC 882 - RFC 883
— 1987 : RFC 1034 - RFC 1035
— 1994 : RFC 1591
— 2011 : RFC 6195
— port : 53
— format : pas plus de 512 octets (sinon passer en TCP)
— requête
— réponse
1.i
Utilisation d’UDP : RTP
Protocole utilisé par les applications temps réels
Ex : flux vidéo
User
space
Multimedia application
Ethernet
header
IP
UDP
RTP
header header header
RTP
RTP payload
Socket interface
UDP
OS
Kernel
UDP payload
IP
IP payload
Ethernet
Ethernet payload
(a)
1.j
(b)
TCP
Transmission Control Protocol
envoi et réception de données en mode connecté :
3
M1 Informatique
R ÉSEAUX
Réseaux : Cours 6
— contrôle de la connexion : synchronisation
— vérification d’intégrité
Remarques Ces vérifications d’intégrités ne sont-elles pas superflues étant donnés les
CRCs de la couche liaison ?
=> Non ! certaines erreurs subsistent : When The CRC and TCP Checksum Disagree Jonathan Stone, Craig Partridge – SIGCOMM 2000
1.k
Entête TCP
32 Bits
Source port
Destination port
Sequence number
Acknowledgement number
U A P R S F
R C S S Y I
G K H T N N
TCP
header
length
Checksum
Window size
Urgent pointer
Options (0 or more 32-bit words)
Data (optional)
Signification des champs :
Port source Valeur du port source
Port destination Valeur du port destination
Numéro de séquence Numéro de séquence du premier octet de ce segment
Numéro d’acquittement Numéro de séquence du prochain octet attendu
Taille de l’en-tête Taille de l’en-tête en mots de 32 bits (les options font partie de l’en-tête)
Drapeaux Réservé Réservé pour un usage futur
ECN Signale la présence de congestion, voir RFC 3168
URG Signale la présence de données urgentes (cf Pointeur d’urgence)
ACK Le paquet est un accusé de réception
PSH Données à passer immédiatement à la couche supérieure/l’application (vs tampons)
RST Rupture de la connexion (anormal, pas une terminaison propre)
SYN Etablissement de connexion
FIN Demande la fin de la connexion (dans ce sens)
Fenêtre Taille de fenêtre demandée
Checksum Somme de contrôle calculée sur l’ensemble de l’en-tête TCP et des données, mais
aussi sur un pseudo en-tête (extrait de l’en-tête IP) (=> TCP/IP)
4
Réseaux : Cours 6
R ÉSEAUX
M1 Informatique
Pointeur de données urgentes Position relative des dernières données urgentes
Options Facultatif
Remplissage : Zéros ajoutés, si nécessaire, pour aligner les champs suivants du paquet sur
32 bits
Données Données transmises par l’application
1.l
Fonctionnement de TCP
Rappelons ce que doit assurer TCP :
— Établissement de la connexion :
— Poignée de main en trois temps
— Transport fiable des données
— Tout paquet doit arriver
=> accusé de réception, retransmission
— Tout paquet doit arriver dans l’ordre
=> numérotation des segments
— Gestion de la déconnexion :
— Poignée de main de déconnexion
1.m
Poignée de main
Avant de pouvoir émettre des données, il faut "synchroniser" (les paramètres) des client
et serveur.
— client : Envoi d’un segment SYN
— serveur : Accusé de réception et mise en place de la session SYN,ACK
— client : Accusé de réception du segment émis par le serveur : ACK
5
1.n
M1 Informatique
R ÉSEAUX
Réseaux : Cours 6
Transmissions des Données
— Numéro de segments : SEQ
— Accusé de réception pour chaque segment reçu
— lourd
— fenêtre d’accusés de réception
— Gestion des tampons avec des fenêtres : WIN
1.o
Fenêtres d’Emissions
Sender
Receiver's
buffer
Receiver
Application
does a 2K
write
0
4K
Empty
2K S
EQ =
0
2K
ACK = 2048 WIN = 2048
Application
does a 2K
write
2K
SEQ = 2048
Full
Sender is
blocked
IN
4096 W
ACK =
96 WIN
40
ACK =
Application
reads 2K
=0
= 2048
2K
Sender may
send up to 2K
1K
SEQ =
4096
1K
2K
La poignée de main ayant été effectuée, la transmission de données peut commencer.
Celle-ci peut être à l’initiative du serveur ou bien du client (cela dépend du protocole applicatif).
1. l’émetteur envoie 2 ko de données issues de la couche application,
2. le récepteur les stocke dans un tampon du système d’exploitation de taille 4 ko,
3. le récepteur envoie un accusé de réception avec l’indication qu’il possède encore 2 ko
de libre dans son tampon,
4. l’émetteur reçoit encore 2 ko depuis son application, comme cela est inférieure (ou
égal) à la valeur de WIN, il les envoie.
5. le récepteur stocke ces données dans le tampon, qui est maintenant rempli,
6
M1 Informatique
R ÉSEAUX
Réseaux : Cours 6
6. le récepteur envoie un accusé de réception avec l’indication qu’il ne possède plus de
mémoire libre dans son tampon,
7. depuis l’émission précédente, l’émetteur ne doit plus rien émettre
8. Quand l’émetteur reçoit une indication de fenêtre de 2 ko (suite à une lecture (partielle)
du tampon par l’application côté récepteur), il peut de nouveau émettre (mais pas plus
de 2 ko).
9. l’émetteur envoie 1 ko.
1.p
Terminaison d’une Session
Comme la poignée de main :
— Envoi de : FIN
— Accusé de réception : FIN,ACK
— Accusé de réception de l’accusé précédent : ACK
1.q
Etats d’une Connexion TCP
(Start)
CONNECT/SYN (Step 1 of the 3-way handshake)
CLOSED
CLOSE/–
CLOSE/–
LISTEN/–
SYN/SYN + ACK
(Step 2
LISTEN
of the 3-way handshake)
SYN
RCVD
RST/–
SEND/SYN
SYN/SYN + ACK
(simultaneous open)
SYN
SENT
(Data transfer state)
ACK/–
ESTABLISHED
SYN + ACK/ACK
(Step 3 of the 3-way handshake)
CLOSE/FIN
CLOSE/FIN
FIN/ACK
(Active close)
(Passive close)
FIN/ACK
FIN
WAIT 1
CLOSE
WAIT
CLOSING
ACK/–
ACK/–
CLOSE/FIN
FIN + ACK/ACK
FIN
WAIT 2
FIN/ACK
LAST
ACK
TIME
WAIT
(Timeout/)
CLOSED
ACK/–
(Go back to start)
7
Réseaux : Cours 6
R ÉSEAUX
M1 Informatique
Les états des sockets (cf sous-section 2.a) sont visibles avec netstat.
1.r
Sécurité de TCP
De nombreux problèmes de sécurité sont connus :
— écoute
— usurpation de connexion
— vol de session ( prédictibilité de SEQ )
— dénis de service
— ...
1.s
Déni de Service
Un déni de service est une attaque qui consiste à rendre indisponible un service réseau.
Exemple : inondation de paquet SYN.
Un protocole est susceptible de déni de service en général si celui-ci est très dissymétrique (en puissance de calcul, en allocation mémoire, ...).
Rq : Les dénis de service distribués sont différents : faire “sauter” le standard.
1.t
Retour sur le NAT/PAT
La translation d’adresse d’un réseau privé vers Internet se fait par association de
— couple adresse privée / port local
— avec un port de la passerelle.
Cette association peut se faire dynamiquement (à l’envoi du paquet SYN en TCP).
(figures “wikipedia commons“)
8
Réseaux : Cours 6
R ÉSEAUX
M1 Informatique
Cela pose problème pour deux clients derrière leur NAT respectifs, et qui souhaite établir
une communication.
— En UDP : technique STUN pour connaître l’IP routée
— En TCP : bien plus problématique
— nombreuses “solutions”.
— standardisation en cours.
1.u
Conclusion Provisoire
Deux moyens important de communiquer :
— non fiable : UDP/IP
— connecté et fiable : TCP/IP
— presque tout le trafic internet
— mais
— pénurie adresses IPv4
— technique NAT résoud en partie le problème précédent mais impose de sérieux problèmes de connectivité de bout en bout
1.v
Problèmes et Evolutions
Ces protocoles de transport sont déployés depuis plus de 25 ans, certaines évolutions
sont cependant proposées :
TCP sur des réseaux sans fil la perte de paquet en TCP est imputée à la congestion, et un
mécanisme de diminution de la fenêtre d’envoi est mis en place dans ce cas. Or sur les
réseaux sans-fil, des pertes se produisent pour des raisons toutes autres. Cela conduit
à une sous-utilisation de ces réseaux. De nombreuses solutions ont été proposées (intervenant sur différentes couches).
TCP Fast Open accélérer les communications TCP en ne refaisant pas de poignée de main
en cas de communication successives (utilisation d’un cookie cryptographique).
2
Programmation Réseaux
2.a
L’Interface de Programmation socket
Créée pour Unix BSD
— Orienté client-serveur
— Interface unifiée et multi-protocoles
— Appels systèmes bloquants ou non-bloquants
— Fonctionnement :
9
M1 Informatique
R ÉSEAUX
Réseaux : Cours 6
Serveur
bind
listen
accept
send
recv
..
.
Client
connect
recv
send
..
.
shutdown
shutdown
— A voir en TP
2.b
Bibliothèques C
#include
#include
#include
#include
2.c
<sys/types.h>
<sys/socket.h>
<netinet/in.h>
<arpa/inet.h>
Créateur
int socket(int domaine, int type, int protocole)
— renvoie : descripteur de la socket, -1 en cas d’erreur
— domaine : PF_UNIX, PF_INET, PF_INET6, PF_IPX, PF_X25, PF_PACKET, ...
— type : SOCK_DGRAM, SOCK_STREAM, SOCK_RAW, ...
— protocole : ..., 0 pour le protocole par défaut de domaine/type
2.d
Fermetures
— int close(int sockfd)
en TCP, vide le tampon d’émission
— int shutdown(int sockfd, int sens)
ferme la socket de type SOCK_STREAM dans le sens
— SHUT_RD : réception
— SHUT_RW : envoi
— SHUT_RDRW : réception et envoi
2.e
Attachement à Une Adresse
int bind(int sockfd, const struct sockaddr *adresse, socklen_t taille)
— sockfd est associée à adresse codée sur taille octets (dans un struct idoine)
— pseudo-programmation orientée objet
— Renvoie : -1 en cas d’erreur
10
Réseaux : Cours 6
2.f
R ÉSEAUX
M1 Informatique
Ouverture de la Socket
int listen(int sockfd, int attente)
— ouverture de sockfd vers l’extérieur
— attente définit la taille de la file d’attente de gestion des connexions. Parfois limitée
par le système à
— SOMAXLOG=128, LINUX
— 5, BSDs
— Renvoie : -1 en cas d’erreur
2.g
Gestion des Connexions Clientes
int accept(int sockfd, struct sockaddr *adresse, socklen_t *taille)
— Renvoie : le nouveau descripteur de socket correspondant à le première connexion de
la file d’attente de sockfd (de type SOCK_STREAM).
-1 en cas d’erreur, et errno contient le code d’erreur correspondant.
— adresse contient l’adresse du client, stockée sur taille octets. Au retour, taille
vaut le nombre d’octets réellement utilisés.
— Si adresse vaut NULL, la structure n’est pas renseignée.
— bloquant, sauf indication contraire.
2.h
Connection à un Serveur
int connect(int sockfd, const struct sockaddr *adresse_s, socklen_t
taille)
— tente de connecter sockfd à adresse_s, stockée sur taille octets.
— en non connecté, adresse_s contient l’adresse de réception par défaut et l’adresse
d’émission. L’association peut être renouvelée.
— en connecté, établit la connexion avec le serveur nommé adresse_s
— Renvoie : -1 en cas d’erreur
2.i
Options de la Socket
int getsockopt(int s, int level, int optname, void *optval, socklen_t
optlen)
*
int setsockopt(int s, int level, int optname, const void *optval,
socklen_t optlen)
— Niveau socket (SOL_SOCKET)
— SO_BROADCAST : autorise l’envoi sur des adresses de diffusion (interdit par défaut)
— SO_KEEPALIVE : maintenir une connexion
11
Réseaux : Cours 6
R ÉSEAUX
M1 Informatique
— SO_REUSEADDR : suppression d’un délai d’attente pour réutilisation rapide d’un
port (risqué)
— SO_RECVBUF : taille maximale du tampon de réception
— SO_SENDBUF : taille maximale du tampon d’émission
— Niveau TCP (IPPROTO_TCP)
— TCP_NODELAY : envoi des données sans mise en tampon
— TCP_MAXSEG : taille maximale des segments TCP
2.j
Rappel : Appels Système
— Un descripteur de socket est un descripteur de fichier classique,
— ssize_t write(int fd, const void *tamp, size_t taille)
— ssize_t read(int fd, void *tamp, size_t taille)
utilisation de tampons
— int send(int s, const void *msg, size_t len, int drapx)
— int recv(int s, void *msg, int len, unsigned int drapx)
— drapx (en général 0) peut être :
— MSG_OOB : pour les messages hors bandes
— MSG_PEEK : lire les données sans les enlever de la file
— MSG_WAITALL : demande que l’opération de lecture soit bloquée jusqu’à ce que
la requête complète soit satisfaite.
— MSG_DONTROUTE : est utilisé pour empêcher la transmission d’un paquet vers
une passerelle
— ...
2.k
Utilitaires : Conversion de Noms et Adresses
struct hostent* gethostbyname(char* nomICANN)
struct hostent * gethostbyaddr(const void *adresse, int longueur,
int type)
=> obsolètes (POSIX 2001)
Il faut désormais utiliser int getaddrinfo(const char * noeud, const char
* service, const struct addrinfo *indic, struct addrinfo ** reso);
int getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host,
size_t hostlen, char *serv, size_t servlen, int flags);
2.l
struc addrinfo
12
M1 Informatique
R ÉSEAUX
Réseaux : Cours 6
struct addrinfo {
int
ai_flags; /* drapeaux */
int
ai_family; /* Internet, ATM, ... */
int
ai_socktype; /* avec ou sans connexion */
int
ai_protocol; /* TCP, UDP, ... */
size_t ai_addrlen; /* taille struct sockaddr */
struct sockaddr *ai_addr; /* adresse socket */
char
*ai_canonname; /* nom canonique */
struct addrinfo *ai_next; /* enregistrement suivant */
};
Cf exemples.
2.m
Utilitaires : Conversion d’Implémentation des Entiers
Sur un hôte, les entiers peuvent être implémentés de manières différentes (en fonction
de l’architecture du processeur) :
— grand-boutiste
— petit-boutiste
Sur le réseau, les entiers sont toujours transmis de la même manière.
Pour être portable, il faut utiliser des fonctions de conversions hôte/réseau :
— short htons(short) et long htonl(long)
— short ntohs(short) et long ntohl(long)
2.n
IPv6
Il faut une (nouvelle) structure de données adaptée :
struct sockaddr_in6
sa_family_t
in_port_t
uint32_t
struct in6_addr
uint32_t
};
2.o
{
sin6_family;
sin6_port;
sin6_flowinfo;
sin6_addr;
sin6_scope_id;
/*
/*
/*
/*
/*
AF_INET6 */
port number */
IPv6 flow information */
IPv6 address */
Scope ID (new in 2.4) */
Double Compatibilité
Comment écrire un serveur qui écoue en IPv4 et en IPv6 ?
— deux processus (un par protocole)
— un seul processus
bloquant vs non-bloquant
=> double pile
13
Réseaux : Cours 6
2.p
R ÉSEAUX
M1 Informatique
Implémentation Double pile
il est possible d’utiliser une double pile avec in6addr_any
struct sockaddr_in6 sa6;
sa6.sin6_addr = in6addr_any;
//ecoute en IPv6 et IPv4
Les adresses IPV4 apparaissent en ::ffff:<adr. IPv4>
NB. N’existe pas pour tous les systèmes d’exploitation. Et peut-être contrôlé par l’option
IPV6_V6ONLY
2.q
Documentation
man
man
man
man
man
man
...
socket
2 ...
7 socket
unix
ip
tcp
2.r
Programmation Réseau IP en Java
— Classes et Interfaces :
— java.net
— javax.net (avec ssl )
— adresse IPv4 : InetAddress
— socket TCP : Socket, ServerSocket
— socket UDP : DatagramSocket, DatagramPacket
— couche application :
URL,URI, URLConnection,HttpURLConnection,...
14
Réseaux : Cours 6
2.s
R ÉSEAUX
M1 Informatique
Classe InetAddress
La classe InetAddress représente les adresses IPs v4 ou v6.
— Inet4Address
— Inet6Address
2.t
Classe Inet4Address
— String getHostAddress() : retourne la représentation textuelle (pointée) d’une
adresse,
— static InetAddress getByAddress(byte[] addr) : retourne un objet InetAddress
correspondant à l’adresse addr,
— static InetAddress getByName(String host) : adresse IP après résolution
du nom host,
— String getHostName() : nom de l’hôte
2.u
Classes Socket, ServerSocket
Rappel : TCP/IP est orientée connexion. Une connexion est caractérisée par adresses et
ports.
— ServerSocket est la classe des flux socket côté serveur (ie en attente de la connexion).
— Socket est la classe des flux socket côté client (ie initiateur de la connexion).
Rq. Ces classes concernent IPv4 mais l’implémentation peut être complètement surchargée...
2.v
Classe ServerSocket
— ServerSocket(int port) : crée une socket écoutant sur le port port
— ServerSocket(int port, int backlog) : crée une socket écoutant sur le port
port, avec une file d’attente de taille backlog.
— ServerSocket(int port, int backlog, InetAddress bindAddr), idem, la
socket n’écoute que sur l’interface correspondant à bindAddr.
— Socket accept() : attend une connexion entrante et renvoie une Socket lorsque
celle-ci arrive
— public void setReuseAddress(boolean on) : active/désactive l’option
SO_REUSEADDR
— close() : fermer la socket.
ces méthodes peuvent provoquer des SocketException ou des IOException
2.w
Classe Socket
— Socket(InetAddress address, int port)
se connecter à l’adresse address et au port port,
— Socket(String host, int port) : se connecter à l’hôte de nom host et au port
port,
15
Réseaux : Cours 6
R ÉSEAUX
M1 Informatique
— InetAddress getInetAddress() : renvoie l’adresse à laquelle est connectée cette
socket,
— int getPort() : renvoie le port auquel est connectée cette socket,
— InputStream getInputStream() : renvoie le flux émis par l’autre extrémité de la
socket,
— OutputStream getOutputStream() : renvoie le flux permettant de communiquer
vers l’autre extrémité de la socket,
— close() : fermer la socket.
2.x
Classe Socket (Exceptions)
ces méthodes peuvent provoquer des SocketException ou des IOException
Rq. Lectures et écritures se font de manière classique avec BufferedWriter, BufferedReader,
par exemple.
2.y
Classes DatagramSocket, PacketDatagram
— DatagramSocket() : crée une socket UDP sur le premier port disponible,
— DatagramSocket(int port) : crée une socket UDP sur le port port,
— void connect(InetAddress address, int port), “se connecter” à l’adresse
adresse et au port port,
— void send(DatagramPacket p) : envoyer le datagramme p,
— void receive(DatagramPacket p) : recevoir le datagramme p,
— void close() : fermer cette socket,
— byte[] getData() : obtenir la “charge utile” du datagramme,
— byte[] setData() : définir la “charge utile” du datagramme.
16

Documents pareils