TCP & UDP

De Justine's wiki
Aller à la navigation Aller à la recherche

 

UDP : User Datagram Protocol

Défini dans la RFC 768 le 28/8/1980, qui n'as pas été modifiée depuis, contrairement à tous les autres protocoles qui ont reçu beaucoup de correctifs.

Avec IP, on dialogue entre machines... Avec UDP, on dialogue entre processus : on ajoute un port source et un port de destination.

La notion de port introduit la notion de "service réseau" : Il peut y avoir plusieurs services réseau par équipement. Chaque service réseau écoute sur un port différent, et les services peuvent être totalement différent, et chacun écoute sur un port spécifique. UDP se place au-dessus d'IP, et son format de datagramme est le suivant:

UDPHeader.png

  • Un port source optionnel (0 par défaut)
  • Un port de destination
  • Une longueur de datagramme (en-tête + Données)
  • Un checksum
  • Des données.

Les données utiles sont générées par l'application; elles sont encapsulées dans UDP. On voit apparaître la notion d'extrémité de communication. Une extrémité de communication est : un tuple (@IP, Port UDP) (un socket, quoi...). Un port est l'équivalent d'une porte dans une maison; on peut avoir plusieurs portes sur un bâtiment.

Un serveur UDP est un tuple "@IP + port UDP" côté serveur, et la même chose pour un client UDP. Le client va ouvrir un port UDP (ou pas, c'est optionnel : il ne le fait que si il veut un réponse; si il n'ouvre pas de port le port source sera à 0) et envoyer des datagrammes au serveur UDP, qui répondra sur le port que le client a ouvert.

Le checksum (ou somme de contrôle) est réalisé lors de l'envoi et de la réception du datagramme. Si le checksum présent est différent du checksum fait à l'arrivée, la trame est détruite. Il est réalisé sur l'en-tête UDP + une pseudo-en-tête IP ainsi que les données, ce qui ne colle pas trop au modèle OSI. À noter : si le checkzsum est optionnel en IPv4, il est obligatoire en IPv6, car IPv6 n'as lui-même pas de checksum.

Lorsqu'une trame UDP est émise, on a pas d'A/R, cela doit être contrôlé par les couches d'au-dessus. On a pas de réémission en cas de perte ni de gestion de la congestion. UDP est utilisé lorsque l'on a peu de données à transporter, et avec peu d'échanges.

Les protocoles UDP les plus connus sont :

  • DHCP
  • DNS
  • SNMP
  • TFTP
  • Les jeux en réseau
  • SIP

TCP (Transmission Control Protocol)

Tcp est un protocole complexe, avec beaucoup de choses à voir. Il a été devisé la première fois dans la RFC 793. Il se place au-dessus d'IP; Il envoie ses données à IP et se place à côté d'UDP.

Les points communs avec UDP :

  • Les extremités de connexion : IP:PORT (source et destination)
    • Un port TCP et un port UDP sont différents !
  • Checksum : toujours sur une partie de l'en-tête IP+En-tête TCP+Données TCP. Il est mis dans une case et la destination revérifie le checksum à la réception.
  • Encapsulation

Les différences essentielles:

  • Mode connecté, avec différents statuts de la connexion
    • 1e phase : établissement de la connexion
    • 2e phase : Échange de données
    • 3e phase : Terminaison de la connexion
  • Gestion des pertes de données
  • Gestion de l'ordre des segments
  • Contrôle de flux
  • Contrôle de congestion

On voit que le header est plus complexe qu'UDP, mais on a des élements communs : les ports, taille, checksum.

Établissement d'une connexion TCP

TCP utilise le three-way-handshake : connexion en 3 temps. Le serveur doit d'abord ouvrir un port TCP; le client passera ensuite par différents statuts. Il est important de comprendre le three-way-handshake pour pouvoir comprendre les liaisons qui ne s'établissent pas à cause d'un problème de filtrage réseau/sécurité (VPN, obligation d'utiliser un proxy pour https...).

On voit bien le SYN, SYNACK, ACK, ainsi que les changements d'états du client et du serveur au niveau des sockets.

Cependant, il faut des choses avant ce handshake :

  • Le serveur ouvre un port (bind)
  • Le serveur écoute sur ce port(listen)
  • Le serveur accepte les connexions sur ce port(accept)

Sinon, le client aura droit à "connection refused".

On a donc trois échanges de synchronisation : aucune donnée n'est envoyée pendant le handshake (contrairement à UDP où on envoie les données tout de suite).

Avec un filtrage intermédiraire, on peut avoir:

  • SYN envoyé mais pas reçu
  • synack envoyé mais pas reçu (plus compliqué...)
  • ACK non reçu.

Les flags TCP (ou drapeaux)

TCP SYN, ACK... sont en fait des flags. Positionné = 1.

Un drapeau est un bit de l'en-tête, actif si il est à 1 ("Drapeau x positionné") inactif si il est à 0 ("Drapeau X non positionné"). Les drapeaux sont utilisés pour gérer la connexion; plusieurs drapeaux peuvent être actifs en même temps (exemple : SYN + ACK). Un paquet peut transporter des données et avoir des flags à 1 : on a qu'un seul canal pour les données et la synchronisation. 

Les drapeaux:

  • U : Urgent, paquet prioritaire
  • A : ACK, pour acquitter des paquets reçus précédemment
  • P: PUSH, envoyer les données immédiatement à la couche supérieure sans attendre le reste des données dans le buffer. Par exemple, cela aide dans telnet à éviter la latence.
  • R : RESET, coupure de connexion (ou refus) : connection closed, R est immédiat!
  • F : FIN, demande de fin de connexion (plus "sympa" que R)