headerIcone

Patinaud.org


Le système d'information dans toute sa définition

Documentaires
Technologies
Législation
Normes et bonnes pratiques
 
Architecture applicative
 
 
Composants réseau
 
 
Encodage binaire
 
 
Protocoles réseau
 
A propos de Patinaud.org

TCP, Transmission Control Protocol

Le protocole TCP est un protocole réseau dont la version actuellement utilisée est documentée par la RFC 739 de l'IETF. Cette version a été rédigée par Jon Postel en septembre 1981 dans le cadre militaire de la DARPA et repose sur la base des neufs précédentes spécifications rédigées par de nombreux contributeurs. Les systèmes d'informations, encore balbutiant à cette époque mais acquérant un rôle de plus en plus important au sein de l'armée, du gouvernement et du civil, la robustesse dans les échanges d'information numériques devenait de ce fait un enjeu crucial pour accompagner la croissance de ces nouveaux systèmes de communication. Le protocole TCP fut donc créé pour répondre à ce besoin de robustesse. TCP a la particularité d'être un protocole de communication dit fiable (assurant la bonne réception des données envoyées). Appartenant à la couche transport du modèle OSI, il se base sur le protocole IP de la couche réseau et permet de transporter des données de protocoles de couches supérieures tels que HTTP, SSH, XML, JSON, ...En tant que protocole de la couche transport, TCP apporte une caractéristique importante qui permet d'échanger des données entre plusieurs applications située sur la même machine : les ports. En effet si les adresses IP permettent d'identifier deux machines entre elle sur un réseau, les ports permettent d'identifier les applications situées sur chaque machine. Ainsi plusieurs applications peuvent communiquer en même temps sur le même réseau et en utilisant la même adresse IP (adresse de la machine). Les ports TCP sont libres et n'importe applications peut théoriquement dialoguer sur n'importe quel port. Cependant certains ports sont liés à des protocoles fréquemment utilisé (mais ces ports toujours exploitables pour d'autres usages) tel que le port 80 pour HTTP, 443 pour HTTPS, 25 pour SMTP, 3306 pour la base de données MySQL... Les échanges d'informations via le protocole TCP s'effectuent en trois étapes qui sont : - La connexion : permet d'initialiser un transfert de donnée et créant une session - Le transfert de données : moment où les données sont transférées entre les deux machines  - La déconnexion : arrête le transfert de données et ferme la session

Composition d'une trame TCP

AdresseTailleNomInformations supplémentaires
1er octet1 octetPort sourcePort du terminal ayant envoyé la trame TCP, si une réponse doit avoir lieu elle sera envoyée à ce port.
2ème octet1 octetPort destinationPort de la machine réceptrice au quel est envoyé la trame TCP.
3ème et 4ème octet2 octetsNuméro de séquenceLe numéro de séquence permet d'identifier la trame et correspond à la valeur d'acquittement de la précédente trame reçue
4ème et 5ème octet2 octetsNuméro d'acquittementLe numéro d'acquittement correspond à la valeur du numéro de séquence de la précédente trame plus le nombre d'octets de données que celle-ci comportée. Ce mécanisme permet d'assurer que le nombre d'octets de donnée envoyé a bien été reçu.
6ème octet, 4 premiers bits4 bitsNombre de groupes de 4 octets de l'entête (offset)Le nombre de mots de 32 bits (groupe de 4 octets) composant l'entête TCP (hors pseudo entête). Par conséquent cela indique l'emplacement où commence les données de la trame.  Tous les entêtes TCP y compris ceux possédant des options ont une taille équivalente un multiple entier de 4 octets.
6ème octet, du 4ème au 8ème bit et les deux premiers bits du 7ème octet6 bitsRéservéCette espace est réservé pour une utilisation future et doit être valorisé à 0.
7ème octet, 3ème bit1 bitIndicateur d'urgenceIndique si cette trame est urgente (0 : Non; 1 : Oui)
7ème octet, 4ème bit1 bitIndicateur d'acquittement de réceptionSi ce top est valorisé à 1 alors cette trame est un acquitté de réception.
7ème octet, 5ème bit1 bitIndicateur de méthode PushSi ce top est valorisé à 1, la trame fonctionne selon la méthode Push
7ème octet, 6ème bit1 bitIndicateur de réinitialisationSi ce top est valorisé à 1 la connexion doit être réinitialisée
7ème octet, 7ème bit1 bitIndicateur de connexionSi ce top est valorisé à 1, il s'agit d'une demande de connexion
7ème octet, 8ème bit1 bitIndicateur de déconnexionSi ce top est valorisé à 1, la connexion s'interrompt
8ème et 9ème octet2 octetsNombre d'octets pouvant être envoyés sans acquittementNombre d'octets que l'émetteur peut envoyer sans avoir reçu d'acquitté de réception en retour. Cette option permet notamment d'envoyer plusieurs trames TCP en parallèle ce qui accèlere les envois.
9ème et 10ème octet2 octetsSomme de contrôle (checksum)Ce champ de contrôle permet de contrôler que la trame n'a pas été altérée lors de sa transmission sur le support physique (cable de cuivre, onde radio, ...). Le calcul du check sum s'effectue en découpant le pseudo entête (pseudo header), l'entête (header) et les données par bloc de deux octets. Sachant que le pseudo entête est de taille fixe de 12 octets et que l'entête est impérativement d'une longueur multiple de 4 octets, seul la longueur des données peut ne pas être d'une taille multiple de 2 octets. Dans ce cas là un octet valorisé à 0x00 est ajoutés à la fin (droite) du dernier bloque de données pour le calcul du checksum. Le détail du calcul du checksum est indiqué après ce tableau.
11ème et 12ème octet2 octetsPointeur d'urgenceSi le bit d'indicateur d'urgence est valorisé à 1 ce champ correspond à l'offset des données urgentes. Sinon ce champs n'est pas exploité.
13ème à X octetsx octetsChamps d'option (facultatif)Ce champ de taille variable permet d'indiquer des options supplémentaires. Sa taille est déduite de la taille de l'offset et peut ne pas exister.
De la fin du champs d'option jusqu'à obtenir une longueur de trame multiple de 4 octetx octetsBourrageComplète l'entête d'octets valorisés à 0x00 jusqu'à obtenir une longueur d'entête multiple de 4 octets.

Calcul du checksum

Le checksum est calculé en découpant le pseudo entête, l'entête et le bloque de données en groupe de deux octets. Seuls les bloque de données peuvent éventuellement être d'une taille impaire. Dans ce cas un octet valorisé à 0x00 est ajouté à la droite du dernier bloque de donnée pour les calculs. Le pseudo entête correspond à des éléments extraits de la trame IP. Il ne sont pas recopiés dans la trame TCP et ne sont pas non plus pris en compte pour le calcul de la longueur de la trame TCP. Les éléments du pseudo entête sont juste utilisés pour s'assurer calculer le checksum. Ces éléments sont dans l'ordre : - L'adresse IP source - L'adresse IP de destination - Un octet à 0x00 - Le PTCL - La longueur de la trame TCP (entête + données) Chaque groupe de deux bloques est additionné bit à bit. L'exemple ci-dessous démontre un checksum sur les trois groupes d'octets : 0x1D 3A, 0x6C 71, 0x3B 23 0 0 0 1 1 1 0 1 0 0 1 1 1 0 1 0 : 0x 1D 3A 0 1 1 0 1 1 0 0 0 1 1 1 0 0 0 1 : 0x 6C 71 0 0 1 1 1 0 1 1 0 0 1 0 0 0 1 1 : 0x 3B 23 ======================= 1 1 0 0 0 1 0 0 1 1 0 0 1 1 1 0 (résultat de l'addition) Puis un complément à 1 est effectué sur le résultat de l'addition. Cela revient à transformé tous les 0 en 1 et inversement. Le checksum de ces trois groupes d'octets est donc : 0 0 1 1 1 0 1 1 0 0 1 1 0 0 0 1 (0x C4 CE)

Initialisation de la connexion

Pour qu'une communication TCP ai lieu, il faut qu'une application du serveur ai ouvert un port TCP en écoute. Par exemple un seveur Apache va ouvrir le port 80 pour recevoir les trames HTTP qui lui seront envoyées. Pour illustrer l'initialisation d'une connexion TCP l'exemple ci-dessous se basera sur une connexion d'un client SSH depuis le poste ayant l'IP 192.168.1.38 au serveur ayant l'IP 51.210.11.103. Comme il est possible de le voir sur la capture d'écran ci-dessous se basant sur l'outil Wireshark, la connexion s'effectue en trois temps. Capture Initialisation de la connection avec la trame SYN : Cette trame est envoyée par le client à la destination du serveur. 60 35 c0 b9 97 a8 a0 af bd 7f 1b 7e 08 00 45 00 00 34 e0 8b 40 00 80 06 19 31 c0 a8 01 26 33 d2 0b 67 cb 37 00 16 76 59 6d aa 00 00 00 00 80 02 fa f0 c3 c6 00 00 02 04 05 b4 01 03 03 08 01 01 04 02                                            Trame SYN + ACK : Le serveur acquitte la demande de synchronisation et demande à son tour une synchronisation vers le client. a0 af bd 7f 1b 7e 60 35 c0 b9 97 a8 08 00 45 00 00 34 00 00 40 00 33 06 46 bd 33 d2 0b 67 c0 a8 01 26 00 16 cb 37 8e 19 03 c1 76 59 6d ab 80 12 72 10 ba bc 00 00 02 04 05 b4 01 01 04 02 01 03 03 07 Trame ACK : Le client acquitte la demande de synchronisation du serveur. 60 35 c0 b9 97 a8 a0 af bd 7f 1b 7e 08 00 45 00 00 28 e0 8c 40 00 80 06 19 3c c0 a8 01 26 33 d2 0b 67 cb 37 00 16 76 59 6d ab 8e 19 03 c2 50 10 02 01 6b 9e 00 00 Sources : RFC 793 de l'IEFT