INF431 Le protocole TCP COIGÉ Version: 4:523M 1 Contexte On se propose d étudier une version simplifiée du protocole Transmission Control Protocol (TCP) qui permet de contrôler les volumes et les débits échangés entre deux terminaux sur internet. Le protocole TCP a été introduit dans les années quatre-vingt pour permettre aux connexions de s établir par dessus des portions de réseaux aux capacités variées (FC 793, DAPA Internet Program Protocol Specification). Les capacités des liens intermédiaires sont supposées inconnues des deux terminaux et les seules informations dont ces derniers disposent concernent les pertes de paquets dues aux congestions temporaires des liens intermédiaires. Le protocole TCP est du type à fenêtre coulissante à la différence qu on considère une connexion asymétrique entre le terminal serveur S et le terminal client C, l objectif étant de transmettre un fichier de S vers C (par exemple un téléchargement FTP). La particularité du protocole TCP est que la taille de la fenêtre elle aussi varie au cours du temps. On verra que plus la fenêtre sera grande plus le débit sera élevé. La dynamique du protocole TCP lui permet de s adapter à une plage de capacité située entre quelques bits par seconde jusqu à plusieurs térabits par seconde. Le protocole de transmission est constitué de trois phases : (1) ouverture de la connexion, (2) transfert des données, (3) fermeture de la connexion, la plus intéressante étant naturellement la phase (2). 2 Phase d ouverture et de fermeture, hypothèses sur le canal La phase d ouverture est constituée des échanges de messages suivants : C S : C envoie un message SYN vers S ; C S : S répond par un message ACK-SYN vers C ; C S : C confirme par un message ACK(1) vers S. Afin d identifier de manière unique la connexion, le terminal client C y associe un entier x (en général pris au hasard) qu il transmet avec son message SYN et le serveur choisit de même un entier y et précise x et y dans sont message ACK-SYN : plus généralement dans la suite tous les messages contiennent x et y dans leur entête pour bien identifier la connexion. La transmission commence en fait dès cette phase : en recevant le message SYN le terminal S démarre son processus de transmission de données en incluant dans son message ACK-SYN un premier bloc de données. Le terminal C a donc commencé son processus de réception de données lorsqu il envoie son premier message ACK(1). Si le terminal C n a pas reçu le message ACK-SYN au bout d un temps d attente estimant le temps d aller et retour, il réémettra son packet SYN et attendra de nouveau. De même, si le terminal S ne reçoit pas le message ACK(1) au bout de après avoir répondu, il relancera son message ACK-SYN. Autrement dit, on se place dans une hypothèse de terminaux obstinés, c est-à-dire qu ils vont répéter autant de fois que nécessaire leurs messages pour recevoir la réponse attendue de l autre terminal. Dans la réalité le nombre de retransmissions est borné afin de pouvoir abandonner le processus si l autre terminal est déconnecté (ou en panne). On fait aussi l hypothèse dite du canal fini, c est-à-dire qu un message répété sur le canal finit par passer au bout d un nombre fini de retransmissions. Il s agit d une sorte d hypothèse d équité du canal envers les différents utilisateurs/messages : il n est pas admis qu un message particulier soit systématiquement perdu. 1
Question 1 Montrer qu une session TCP finit toujours par s ouvrir entre le terminal C et le terminal S. Solution. Comme le terminal C est obstiné et le canal fini le message SYN finira par arriver au terminal S. Celui ci commencera donc à émettre son message ACK-SYN au bout d un temps fini et comme il est lui aussi obstiné, ce message finira par arriver à C. Le terminal C commencera alors à émettre ACK(1) obstinément et au bout d un temps fini la communication sera établie. La phase de fermeture consiste pour le terminal S à envoyer un message FIN qui sera aussi acquitté par le terminal C. 3 Phase de transmission de données 3.1 2 type de messages, DATA et ACK Comme on l a déjà dit, le terminal S se met en phase de transmission de données, mode émetteur, à l émission du message ACK-SYN, tandis que le terminal C se met en phase de transmission de données, mode récepteur, à l émission du paquet ACK(1). On suppose que les paquets de données à émettre sont pris dans un tableau m 1, m 2,..., m k,... auquel le terminal S a accès. Celui ci maintient aussi une mémoire tampon qui contient tous les derniers paquets de données qu il a envoyé et qui sont en attente d acquittement (afin de pouvoir les réémettre facilement si nécessaire). Lors de la phase de transmission de données, le protocole fonctionne comme un protocole à fenêtre variable : S C : quand le terminal S envoie le paquet DATA(i), celui-ci contient le paquet m i (en plus de l entête qui contient notamment les identifiants x et y et le numéro de séquence i). S C : A chaque réception d un paquet DATA(i) le terminal C renvoie un message ACK(j +1) où j est le plus grand entier tel que tous les messages m k pour k j ont été reçus correctement. Ou, de manière équivalente, j + 1 est le rang du premier paquet de données qui n a pas encore été reçu par le terminal C. Ainsi, le terminal C signifie au terminal S qu il attend le paquet de numéro de séquence j + 1. 3.2 Les événements sur le serveur On représente la succession des évenements au niveau du terminal S par une séquence d évènements (s 0, s 1,..., s i,...). Un événement s i est soit un acquittement : s i est un entier j + 1 qui signifie que le terminal reçoit ACK(j + 1) ; soit une expiration d un délai : s i est un symbole b qui signifie l expiration du délai d attente d acquittement d un paquet de données dans la mémoire tampon. On va voir que les paquets sont toujours transmis ou retransmis dans l ordre, de sorte que le délai d attente qui expire est toujours celui du paquet de plus petit indice dans la mémoire tampon. On appelle W (i) la longueur de la fenêtre coulissante juste après l évenement s i. On appelle a(i) le compteur d acquittement à l événement s i qui donne le plus grand entier tel que tous les paquets d indice compris entre 0 et a(i) ont été acquittés (a(i) compris). Question 2 Que signifie la succession d événements (1, 2, 3, 4, 5, 6, 7...)? Que signifie la succession d événements (1, 2, 4, 3, 5, 6,...)? Solution. la première succession signifie qu aucune erreur n a eu lieu : tous les messages DATA ont été acquittés dans l ordre. La seconde succession signifie que les messages DATA sont arrivés dans l ordre mais le message ACK(3) et ACK(4) se sont inversés pendant le transfert. Question 3 Que signifie la succession d événements (1, 2, 3, b, 3, 3, 3,...)? Que signifie la succession d événements (1, 2, 3, 5, 6, 7,...)? Solution. La première succession signifie que le paquet m 3 n a pas été reçu et que d autres paquets ont été reçus après et qui ne font pas avancer le compteur d acquittement. La deuxième signifie que les paquets jusqu à l indice 6 ont été reçus mais l acquittement du paquet m 3 a été perdu. 2
3.3 La gestion des retransmissions À chaque instant, les paquets en attente d acquittement sont exactement ceux dont l indice est compris entre a(i)+1 et a(i)+w (i). À la reception du message ACK(1), le terminal S transmet les paquets d indice compris entre 1 et W (0). Ensuite les transmissions sont gérées en fonction des événements : Si s i est du type int, s i = j : si j a(i 1) + 1 alors a(i) = j 1, sinon a(i) = a(i 1). Si a(i) > a(i 1), les paquets d indices inférieurs ou égal à j sont retirés de la mémoire tampon, puis le terminal S recomplète la mémoire tampon en y rangeant et en transmettant les paquets d indices compris entre a(i 1) + W (i 1) + 1 et a(i) + W (i). Si s i = b, alors le terminal S retire tous les paquets de la mémoire tampon, il retransmet les paquets compris entre a(i) + 1 et a(i) + W (i) et les met dans la mémoire tampon (il se peut que W (i) W (i 1)). Le tableau suivant donne un exemple du déroulement des opérations en fonction des événements sur une séquence de dix paquets de données (entre 0 et 9). Les indices marqués en gras signifient que le paquet correspondant est juste (re)transmis. On suppose que, pour tout i, W (i) est égal à 2. s i 1 2 3 4 5 6 7 8 9 10 mémoire tampon 1 2 3 4 5 6 7 8 9 2 3 4 5 6 7 8 9 Dans le précédent tableau on suppose qu il n y a pas de perte. Ce n est pas le cas de l exemple suivant : s i 1 2 3 b 3 4 5 6 7 8 9 10 mémoire tampon 1 2 3 3 3 4 5 6 7 8 9 2 3 4 4 4 5 6 7 8 9 Le paquet 3 a été perdu, le dépassement de l échéance (événement b) a provoqué la retransmission de toute la mémoire tampon {3, 4}. Le prochain acquittement est un doublon dû probablement à la réception correcte du paquet 4 (avant le paquet 3). La suite des transmissions se fait sans erreur. Question 4 Toujours en supposant que i : W (i) = 2, donner l évolution de la mémoire tampon du terminal S correspondant à la succession d événements (1, 2, 3, b, 5, 6, b, 7, 8), puis celle correspondant à la succession d événements (1, 2, 3, b, b, b, b, b, b). Solution. s i 1 2 3 b 5 6 b 7 8 mémoire tampon 1 2 3 3 5 6 6 7 8 2 3 4 4 6 7 7 8 9 s i 1 2 3 b b b b b b mémoire tampon 1 2 3 3 3 3 3 3 3 2 3 4 4 4 4 4 4 4 Question 5 Commentez le pseudo-code de la figure 1. On suppose que la taille de la fenêtre W (i) = W ne varie pas au cours du temps. La fonction SEQ(p) donne le numéro de séquence du paquet p. On suppose une implémentation séquentielle où il n y a pas de tâches parallèles à part celles de réception et de transmission, et le déroulement des timers. eception est une séquence de paquets rangée dans l ordre des arrivées. Solution. Comme il est important de transmettre et retransmettre les paquets dans l ordre, l ensemble des paquets en attente d acquittement, la structure Buffer, est une file ordonnée de paquets. Top désigne toujours le premier paquet de Buffer et Bottom, le dernier paquet. La fonction HEAD(Objet) retourne et retire le premier élément de la structure Objet. La procédure ENQUEUE(p) insère le paquet p à la fin de Buffer. La fonction NEXT(p) désigne le paquet suivant du paquet dans Buffer. La grande difficulté de cette implémentation est la gestion des timers. 3
procédure SLIDINGWINDOW(FileToTransmit) CurrentSeq 0 Buffer nil Timeout faux Passe à vrai quand un timer expire tant que Buffer nil ou FileToTransmit nil FILLBUFFE() tant que eception nil si Timeout { = vrai ETANSMIT() alors Timeout faux { Ack HEAD(eception) DELETEACKED(SEQ(Ack)) procédure FILLBUFFE() tant que (Buffer = nil ou SEQ(Bottom) SEQ(Top) < W) et FileToTransmit nil Data HEAD(FileToTransmit) etire et retourne le prochain bloc de données Packet (CurrentSeq, Data) ENQUEUE(Packet, Buffer) TANSMIT(Packet) SETTIME(CurrentSeq) Initialise le timer pour le paquet CurrentSeq CurrentSeq + 1 procédure DELETEACKED(s) tant que Buffer nil et SEQ(Top) < s { Packet HEAD(Buffer) CANCELTIME(SEQ(Packet)) procédure ETANSMIT() pour chaque { Packet Buffer TANSMIT(Packet) SETTIME(SEQ(Packet)) Annule le timer associé au paquet FIG. 1 Pseudo-code de l émetteur 4
3.4 Les événements sur le client Le terminal C voit les événements suivants (c 0, c 1,..., ). Les événements sont de type int et c i = j signifie que le client reçoit le paquet de données m j. La réponse du client est ACK(d(i) + 1) où d(i) désigne le plus grand entier tel que tous les paquets de données d indice situé entre 0 et d(i) ont été correctement reçus. Le tableau suivant donne un exemple de succession des indices d acquittement en fonction de la successsion des événements : c i 0 1 2 3 4 5 6 7 8 9 acquittement renvoyé 1 2 3 4 5 6 7 8 9 10 Question 6 Donner les indices d acquittement renvoyés par le client lors de la succession d événements (0, 1, 2, 3, 3, 4, 5,...). Même question à propos de la succession d événements (0, 1, 2, 4, 5, 6, 7,...). Solution. La première succession signifie que le serveur a renvoyé deux fois le paquet m 3, donc le client répète son acquittement : c i 0 1 2 3 3 4 5 acquittements renvoyés 1 2 3 4 4 5 6 La seconde succession correspond à la perte du paquet m 3, donc l acquittement reste gelé à l indice 2. c i 0 1 2 4 5 6 7 acquittements renvoyés 1 2 3 3 3 3 3 La remise en séquence des paquets de données peut être consommatrice de ressources sur le client. Le client peut donc être implémenté en mode paresseux. Dans ce mode le client rejette tous les paquets arrivés hors séquence et les considère comme non reçus. Dans ce cas le compteur d(i) recommence à être incrémenté à la réception correcte du paquet m d(i)+1 et n évolue qu en fonction des événements qui suivent. Question 7 Donner l évolution du compteur d acquittement en mode normal et en mode paresseux pour la succession d évenements (0, 1, 2, 4, 5, 6, 3, 4,...) Solution. c i 0 1 2 4 5 6 3 4 mode normal 1 2 3 3 3 3 7 7 mode paresseux 1 2 3 3 3 3 4 5 4 Débit et performances 4.1 Terminaison Question 8 Montrer que, sous les hypothèses de terminaux obstinés et de canal fini, si, pour tout i, W (i) 1, alors tous les paquets finissent par être reçus correctement et acquittés. (On pourra remarquer que si un message était envoyé une infinité de fois sur un canal fini, il serait reçu une infinité de fois). Solution. aisonnons par l absurde, et supposons qu un paquet soit envoyé, mais jamais acquitté. Soit j le plus petit indice pour lequel le paquet m j ait été envoyé sans jamais avoir été acquitté, même implicitement par un indice d acquittement supérieur à j. Donc le compteur a(i) reste gelé à la valeur j 1. Donc à partir de ce moment, la fenêtre contiendra toujours le paquet m j et comme il ne sera pas acquitté ce dernier sera retransmis à chaque expiration du délai d attente. Comme les terminaux sont obstinés, le paquet m j sera retransmis un nombre infini de fois, donc reçu un nombre infini de fois par le terminal C qui l acquittera un nombre infini de fois. Un de ces acquittements finira par parvenir à S et contiendra un indice supérieur ou égal à j, ce qui fera progresser le compteur a(i). Contradiction. 5
4.2 Débit Dans cette section on suppose que le temps d aller et retour entre l émission d un paquet et la réception de son acquittement est exactement de secondes. Autrement dit on suppose que lors d un événement de perte, tous les paquets sont retransmis instantanément et les acquittements de ceux de ces paquets qui sont reçus sans retard le sont exactement secondes plus tard, instantanément. On fixe également un délai d expiration b >. Avec ces hypothèses simplificatrices, on modélise un client et un serveur parfait, avec des interfaces réseau capables de traîter un nombre quelconque de messages instantanément, et on s intéresse à l effet des retards et pertes qui ont éventuellement lieu dans les canaux de communication (le cœur du réseau) où la bande passante est limitée. On appelle débit brut le nombre de paquets émis par le serveur par seconde, y compris les transmissions et retransmissions. Nous allons maintenant démontrer que le débit brut d une fenêtre de retransmission est supérieur ou égal à W (i), et est égal à cette quantité en dehors de tout événement de type b. Question 9 Considérant un intervalle I = [t, t + [, montrer que le nombre de paquets émis dans l intervalle I est supérieur ou égal à la taille W (i) de la fenêtre à la fin de l intervalle. Solution. La quantité W (i) indique le nombre de messages qui sont dans la mémoire tampon à l instant t +. Pour entrer dans la mémoire tampon ces messages ont dus être émis avant l instant t +. Les messages sortent de la mémoire tampon quand ils sont acquittés ou quand ils sont déclarés perdus, c est à dire au plus secondes après leur émission compte tenu de l hypothèse ci-dessus. Donc la mémoire tampon ne peut pas contenir de messages émis il y a plus de secondes. Autrement dit les W (i) messages contenus dans la mémoire tampon à l instant t + ont été émis dans l intervalle I. Question 10 Considérant un intervalle I = [t, t + [ où il n y a pas d évenement de type b, montrer que le nombre de paquets émis dans l intervalle I est égal à la taille W (i) de la fenêtre à la fin de l intervalle. Solution. Tous les messages qui ont été émis dans l intervalle I sont dans la mémoire tampon, puisque (i) ils n ont pas encore été acquittés, (ii) la mémoire tampon n a pas été vidée dans l intervalle par un événement de type b. 4.3 Adaptation dynamique de la fenêtre Le terminal serveur adapte le paramètre W (i) en fonction des événements qu il observe. Cette adaptation se fait suivant deux modes, la montée en régime et le régime de croisière. 4.3.1 La montée en régime Le terminal S commence la transmission des données en mode montée en régime. L évolution de la taille de la fenêtre se fait en fonction des évènements sur le serveur, de la manière suivante : W (0) = 1 ; si s i est de type int alors W (i) = W (i 1) + 1 ; si s i = b alors W (i) = W (i 1) 2 et le terminal passe en régime de croisière. La notation x signifie "partie entière de x". On voit donc que la première perte de paquet entraîne la division par deux de la fenêtre, donc la division par deux du débit instantané. Question 11 En mode de montée en régime, donner l évolution de la mémoire tampon correspondant à la succession des événements (1, 2, 3, 4, 5, b,...). Solution. s i 1 2 3 4 5 b mémoire tampon 1 2 3 4 5 5 3 4 5 6 6 5 6 7 7 7 8 9 6
A partir de maintenant, on suppose que le tableau de paquets de données n a pas de fin, ce qui correspond par exemple au cas d un flux vidéo continu. Question 12 En mode de montée en régime, partant d une mémoire tampon avec W (i) paquets, quelle sera la taille de la mémoire tampon quand tous ces paquets initiaux auront été acquittés (en l absence de perte et de doublon)? Solution. Chaque acquittement entraîne la transmission de deux paquets, donc la taille aura doublé. 4.3.2 Le régime de croisière En passant au régime de croisière le terminal S initialise un scalaire ω(i) à la valeur courante W (i). Ensuite le terminal fera toujours W (i) = ω(i). L évolution du paramètre ω(i) se fait en fonction des évènements sur le serveur, suivant l algorithme suivant : si s i est de type int : ω(i) = ω(i 1) + 1 W (i 1) ; si s i = b : ω(i) = W (i 1) 2. On voit donc la encore que la perte de paquet entraîne la division par deux de la fenêtre, donc la division par deux du débit instantané. Question 13 En régime de croisière, supposant qu à l événement d indice i le paramètre ω(i) soit entier, quelle sera la taille de la fenêtre, quand tous les paquets présents dans la mémoire tampon à l évenement i auront été acquittés (en l absence de perte et de doublon)? 1 Solution. Chaque acquittement augmente le paramètre ω d un montant W (i) donc lorsque les W (i) paquets auront été acquittés ω aura la valeur ω(i) + 1 et la taille de la fenêtre aura augmenté d une unité. 4.4 Performance du régime de croisière Dans cette section on suppose que le temps d aller et retour entre l émission d un paquet et la réception de son acquittement est exactement de secondes. On suppose aussi que le canal est sans erreur sauf quand le débit brut excède une valeur λ max, c est à dire quand la fenêtre excède une taille limite de W m = λ max pour laquelle tout les paquets transmis dans la mémoire tampon seront systématiquement perdus. Question 14 En mode de montée en régime, combien de paquets sont-ils émis avant d atteindre la taille maximum de la fenêtre? Combien de temps cela nécessite-t-il? Solution. Il faut W m paquets, mais la taille de la fenêtre doublant après chaque période, il ne faut que log 2 W m secondes. Question 15 Calculer le débit moyen brut en mode régime de croisière. Calculer le débit net moyen (c est-à-dire en omettant les retransmissions). Solution. Quand le terminal S entre en régime de croisière il a une fenêtre de taille W l = Wm 2. Comme il n y a pas de perte tant que W (i) < W m, cette fenêtre augmente d une unité quand tous ces paquets ont été acquittés, c est-à-dire après secondes. Elle augmente encore d une unité après, donc tous les secondes, la fenêtre passe de la taille W l à la taille W l + 1, puis à la taille W l + 2, etc. Quand elle atteint la taille W m, les W m nouveaux paquets sont perdus après secondes et le terminal S repart de nouveau avec une fenêtre de taille W l. La phase de montée entre les tailles W l et W m prend (W m W l + 1) secondes, pendant laquelle (W l ) + (W l + 1) + + W m = 1 2 (W l + W m )(W m W l + 1) paquets sont émis. Donc le débit brut W m+w l 3 4 W m. est 1 2 1 Les W m derniers paquets sont perdus donc le débit net est 2 (W m + W l ) 1 W m 1 4 (3W m 4). Ce qui est relativement correct par rapport au débit maximal qui est de Wm 1 l on aurait eu avec une connaissance parfaite des performances du réseau. W m W l +1 que 7
éférences [1] Srinivasan Keshav. An Engineering Approach to Computer Networking : ATM Networks, the Internet and the Telephone Network. Addison-Wesley, 1997. [2] Wikipedia. Transmission control protocol. [3] Larry L. Peterson et Bruce S. Davie. Computer Networks : A Systems Approach. Morgan Kaufmann, 2007. 8