Aller au contenu principal

4. Protocole de connexion initiale (Initial Connection Protocol)

Un transfert est établi en envoyant une demande (WRQ pour écrire sur un système de fichiers étranger, ou RRQ pour lire depuis celui-ci), et en recevant une réponse positive, un paquet d'acquittement pour l'écriture, ou le premier paquet de données pour la lecture. En général, un paquet d'acquittement contiendra le numéro de bloc du paquet de données acquitté. Chaque paquet de données a un numéro de bloc associé ; les numéros de blocs sont consécutifs et commencent par un. Puisque la réponse positive à une demande d'écriture est un paquet d'acquittement, dans ce cas spécial, le numéro de bloc sera zéro. (Normalement, puisqu'un paquet d'acquittement acquitte un paquet de données, le paquet d'acquittement contiendra le numéro de bloc du paquet de données acquitté.) Si la réponse est un paquet d'erreur, alors la demande a été refusée.

Afin de créer une connexion, chaque extrémité de la connexion choisit un TID pour elle-même, à utiliser pendant la durée de cette connexion. Les TID choisis pour une connexion devraient être choisis aléatoirement, de sorte que la probabilité que le même numéro soit choisi deux fois dans une succession immédiate soit très faible. Chaque paquet a associé avec lui les deux TID des extrémités de la connexion, le TID source et le TID de destination. Ces TID sont transmis au UDP de support (ou autre protocole de datagramme) en tant que ports source et de destination. Un hôte demandeur choisit son TID source comme décrit ci-dessus, et envoie sa demande initiale au TID connu 69 décimal (105 octal) sur l'hôte serveur. La réponse à la demande, en fonctionnement normal, utilise un TID choisi par le serveur comme son TID source et le TID choisi pour le message précédent par le demandeur comme son TID de destination. Les deux TID choisis sont ensuite utilisés pour le reste du transfert.

À titre d'exemple, voici les étapes utilisées pour établir une connexion pour écrire un fichier. Notez que WRQ, ACK et DATA sont les noms des types de paquets de demande d'écriture, d'acquittement et de données respectivement. L'annexe contient un exemple similaire pour la lecture d'un fichier.

  1. L'hôte A envoie un « WRQ » à l'hôte B avec source= TID de A, destination= 69.
  2. L'hôte B envoie un « ACK » (avec numéro de bloc= 0) à l'hôte A avec source= TID de B, destination= TID de A.

À ce stade, la connexion a été établie et le premier paquet de données peut être envoyé par l'hôte A avec un numéro de séquence de 1. Dans l'étape suivante, et dans toutes les étapes suivantes, les hôtes doivent s'assurer que le TID source correspond à la valeur qui a été convenue aux étapes 1 et 2. Si un TID source ne correspond pas, le paquet doit être rejeté comme envoyé par erreur depuis ailleurs. Un paquet d'erreur doit être envoyé à la source du paquet incorrect, sans perturber le transfert. Cela ne peut être fait que si le TFTP reçoit en fait un paquet avec un TID incorrect. Si les protocoles de support ne le permettent pas, cette condition d'erreur particulière ne se produira pas.

L'exemple suivant démontre un fonctionnement correct du protocole dans lequel la situation ci-dessus peut se produire. L'hôte A envoie une demande à l'hôte B. Quelque part dans le réseau, le paquet de demande est dupliqué, et en conséquence deux acquittements sont renvoyés à l'hôte A, avec différents TID choisis sur l'hôte B en réponse aux deux demandes. Lorsque la première réponse arrive, l'hôte A continue la connexion. Lorsque la deuxième réponse à la demande arrive, elle devrait être rejetée, mais il n'y a aucune raison de terminer la première connexion. Par conséquent, si différents TID sont choisis pour les deux connexions sur l'hôte B et que l'hôte A vérifie les TID source des messages qu'il reçoit, la première connexion peut être maintenue tandis que la deuxième est rejetée en renvoyant un paquet d'erreur.