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