Transport de fiabilitat TCP
Tots coneixem el protocol TCP com un protocol de transport fiable, però com garanteix la fiabilitat del transport?
Per aconseguir una transmissió fiable, cal tenir en compte molts factors, com ara la corrupció de dades, la pèrdua, la duplicació i els fragments fora d'ordre. Si aquests problemes no es poden resoldre, no es pot aconseguir una transmissió fiable.
Per tant, TCP utilitza mecanismes com ara el número de seqüència, la resposta de confirmació, el control de reenviament, la gestió de connexions i el control de finestres per aconseguir una transmissió fiable.
En aquest article, ens centrarem en la finestra lliscant, el control de flux i el control de congestió de TCP. El mecanisme de retransmissió es tracta per separat a la següent secció.
Control de flux de xarxa
El control de flux de xarxa o conegut com a control de trànsit de xarxa és en realitat una manifestació de la subtil relació entre productors i consumidors. Probablement us heu trobat amb aquest escenari sovint a la feina o en entrevistes. Si la capacitat de producció del productor supera considerablement la capacitat de consum del consumidor, farà que la cua creixi indefinidament. En un cas més greu, és possible que sapigueu que quan els missatges de RabbitMQ s'acumulen massa, poden causar una degradació del rendiment de tot el servidor MQ. El mateix passa amb TCP; si no es controla, es posaran massa missatges a la xarxa i els consumidors hauran superat la seva capacitat, mentre que els productors continuaran enviant missatges duplicats, cosa que afectarà considerablement el rendiment de la xarxa.
Per abordar aquest fenomen, TCP proporciona un mecanisme perquè l'emissor controli la quantitat de dades enviades en funció de la capacitat de recepció real del receptor, cosa que es coneix com a control de flux. El receptor manté una finestra de recepció, mentre que l'emissor manté una finestra d'enviament. Cal tenir en compte que aquestes finestres només són per a una única connexió TCP i no totes les connexions comparteixen una finestra.
TCP proporciona control de flux mitjançant una variable per a una finestra de recepció. La finestra de recepció dóna a l'emissor una indicació de quant espai de memòria cau encara hi ha disponible. L'emissor controla la quantitat de dades enviades segons la capacitat d'acceptació real del receptor.
El receptor notifica a l'emissor la mida de les dades que pot rebre, i l'emissor envia fins a aquest límit. Aquest límit és la mida de la finestra, recordeu la capçalera TCP? Hi ha un camp de finestra de recepció, que s'utilitza per indicar el nombre de bytes que el receptor pot o vol rebre.
L'amfitrió emissor enviarà periòdicament un paquet de sonda de finestra, que s'utilitza per detectar si l'amfitrió receptor encara pot acceptar dades. Quan el buffer del receptor corre el perill de desbordar-se, la mida de la finestra s'estableix a un valor més petit per indicar a l'emissor que controli la quantitat de dades enviades.
Aquí teniu un diagrama de control de flux de xarxa:
Control de congestió de xarxa
Abans d'introduir el control de congestió, hem d'entendre que, a més de la finestra de recepció i la finestra d'enviament, també hi ha una finestra de congestió, que s'utilitza principalment per resoldre el problema de la velocitat a la qual l'emissor comença a enviar dades a la finestra de recepció. Per tant, la finestra de congestió també la manté l'emissor TCP. Necessitem un algoritme per decidir quantes dades són apropiades per enviar, ja que enviar massa poques o massa dades no és ideal, d'aquí el concepte de finestra de congestió.
En el control de flux de xarxa anterior, el que evitàvem era que l'emissor omplís la memòria cau del receptor amb dades, però no sabíem què passava a la xarxa. Normalment, les xarxes informàtiques es troben en un entorn compartit. Com a resultat, hi pot haver congestió de xarxa a causa de la comunicació entre altres hosts.
Quan la xarxa està congestionada, si es continua enviant un gran nombre de paquets, pot causar problemes com ara retards i pèrdues de paquets. En aquest punt, TCP retransmetrà les dades, però la retransmissió augmentarà la càrrega de la xarxa, cosa que provocarà retards més grans i més pèrdues de paquets. Això pot entrar en un cercle viciós i anar augmentant.
Per tant, TCP no pot ignorar el que passa a la xarxa. Quan la xarxa està congestionada, TCP es sacrifica reduint la quantitat de dades que envia.
Per tant, es proposa el control de congestió, que pretén evitar omplir tota la xarxa amb dades de l'emissor. Per regular la quantitat de dades que l'emissor ha d'enviar, TCP defineix un concepte anomenat finestra de congestió. L'algoritme de control de congestió ajustarà la mida de la finestra de congestió segons el grau de congestió de la xarxa, per tal de controlar la quantitat de dades enviades per l'emissor.
Què és una finestra de congestió? Què té a veure això amb la finestra d'enviament?
La finestra de congestió és una variable d'estat mantinguda per l'emissor que determina la quantitat de dades que l'emissor pot enviar. La finestra de congestió canvia dinàmicament segons el nivell de congestió de la xarxa.
La finestra d'enviament és una mida de finestra acordada entre l'emissor i el receptor que indica la quantitat de dades que el receptor pot rebre. La finestra de congestió i la finestra d'enviament estan relacionades; la finestra d'enviament sol ser igual al mínim de les finestres de congestió i recepció, és a dir, swnd = min(cwnd, rwnd).
La finestra de congestió cwnd canvia de la següent manera:
Si no hi ha congestió a la xarxa, és a dir, si no es produeix un temps d'espera de retransmissió, la finestra de congestió augmenta.
Si hi ha congestió a la xarxa, la finestra de congestió disminueix.
L'emissor determina si la xarxa està congestionada observant si el paquet de confirmació ACK es rep dins del temps especificat. Si l'emissor no rep el paquet de confirmació ACK dins del temps especificat, es considera que la xarxa està congestionada.
A més de la finestra de congestió, és hora de parlar de l'algoritme de control de congestió TCP. L'algoritme de control de congestió TCP consta de tres parts principals:
Inici lent:Inicialment, la finestra de congestió de cwnd és relativament petita i l'emissor augmenta la finestra de congestió exponencialment per adaptar-se ràpidament a la capacitat de la xarxa.
Evitació de la congestió:Després que la finestra de congestió superi un cert llindar, l'emissor augmenta la finestra de congestió de manera lineal per frenar la taxa de creixement de la finestra de congestió i evitar la sobrecàrrega de la xarxa.
Recuperació ràpida:Si es produeix congestió, l'emissor redueix a la meitat la finestra de congestió i entra en l'estat de recuperació ràpida per determinar la ubicació de la recuperació de la xarxa a través dels acks duplicats rebuts, i després continua augmentant la finestra de congestió.
Inici lent
Quan s'estableix una connexió TCP, la finestra de congestió cwnd s'estableix inicialment a un valor mínim de MSS (mida màxima del segment). D'aquesta manera, la velocitat d'enviament inicial és d'aproximadament MSS/RTT bytes/segon. L'amplada de banda real disponible sol ser molt més gran que MSS/RTT, de manera que TCP vol trobar la velocitat d'enviament òptima, que es pot aconseguir mitjançant un inici lent.
En el procés d'inici lent, el valor de la finestra de congestió cwnd s'inicialitzarà a 1 MSS, i cada vegada que es reconegui el segment de paquet transmès, el valor de cwnd augmentarà en un MSS, és a dir, el valor de cwnd esdevindrà 2 MSS. Després d'això, el valor de cwnd es duplica per cada transmissió correcta d'un segment de paquet, i així successivament. El procés de creixement específic es mostra a la figura següent.
Tanmateix, la taxa d'enviament no sempre pot créixer; el creixement ha d'acabar en algun moment. Aleshores, quan acaba l'augment de la taxa d'enviament? L'inici lent normalment acaba amb l'augment de la taxa d'enviament d'una de les diverses maneres següents:
La primera manera és el cas de la pèrdua de paquets durant el procés d'enviament d'inici lent. Quan es produeix una pèrdua de paquets, TCP estableix la finestra de congestió cwnd de l'emissor a 1 i reinicia el procés d'inici lent. En aquest punt, s'introdueix un concepte de llindar d'inici lent ssthresh, el valor inicial del qual és la meitat del valor de cwnd que genera la pèrdua de paquets. És a dir, quan es detecta congestió, el valor de ssthresh és la meitat del valor de la finestra.
La segona manera és correlacionar directament amb el valor del llindar d'inici lent ssthresh. Com que el valor de ssthresh és la meitat del valor de la finestra quan es detecta congestió, es pot produir una pèrdua de paquets amb cada duplicació quan cwnd és més gran que ssthresh. Per tant, és millor establir cwnd a ssthresh, cosa que farà que TCP canviï al mode de control de congestió i finalitzi l'inici lent.
L'última manera en què pot acabar un inici lent és si es detecten tres ACK redundants, TCP realitza una retransmissió ràpida i entra a l'estat de recuperació. (Si no està clar per què hi ha tres paquets ACK, s'explicarà per separat al mecanisme de retransmissió.)
Evitació de la congestió
Quan TCP entra en estat de control de congestió, cwnd s'estableix a la meitat del llindar de congestió ssthresh. Això significa que el valor de cwnd no es pot duplicar cada vegada que es rep un segment de paquet. En canvi, s'adopta un enfocament relativament conservador en què el valor de cwnd només augmenta en un MSS (longitud màxima del segment de paquet) després que es completi cada transmissió. Per exemple, fins i tot si es reconeixen 10 segments de paquet, el valor de cwnd només augmentarà en un MSS. Aquest és un model de creixement lineal i també té un límit superior de creixement. Quan es produeix una pèrdua de paquets, el valor de cwnd es canvia a un MSS i el valor de ssthresh s'estableix a la meitat de cwnd. O també aturarà el creixement de MSS quan es rebin 3 respostes ACK redundants. Si encara es reben tres ACK redundants després de reduir a la meitat el valor de cwnd, el valor de ssthresh es registra com la meitat del valor de cwnd i s'entra en l'estat de recuperació ràpida.
Recuperació ràpida
En l'estat de Recuperació Ràpida, el valor de la finestra de congestió cwnd augmenta en un MSS per cada ACK redundant rebut, és a dir, ACK que no arriba en seqüència. Això és per fer ús dels segments de paquets que s'han transmès correctament a la xarxa per millorar l'eficiència de la transmissió tant com sigui possible.
Quan arriba un ACK del segment de paquet perdut, TCP disminueix el valor de cwnd i després entra en l'estat d'evitació de congestió. Això serveix per controlar la mida de la finestra de congestió i evitar augmentar encara més la congestió de la xarxa.
Si es produeix un temps d'espera després de l'estat de control de congestió, la condició de la xarxa esdevé més greu i TCP migra de l'estat d'evitació de la congestió a l'estat d'inici lent. En aquest cas, el valor de la finestra de congestió cwnd s'estableix a 1 MSS, la longitud màxima del segment de paquet i el valor del llindar d'inici lent ssthresh s'estableix a la meitat de cwnd. L'objectiu d'això és augmentar gradualment la mida de la finestra de congestió després que la xarxa es recuperi per equilibrar la velocitat de transmissió i el grau de congestió de la xarxa.
Resum
Com a protocol de transport fiable, TCP implementa un transport fiable mitjançant el número de seqüència, el reconeixement, el control de retransmissió, la gestió de connexions i el control de finestres. Entre ells, el mecanisme de control de flux controla la quantitat de dades enviades per l'emissor segons la capacitat de recepció real del receptor, cosa que evita els problemes de congestió de la xarxa i la degradació del rendiment. El mecanisme de control de congestió evita que es produeixi congestió de la xarxa ajustant la quantitat de dades enviades per l'emissor. Els conceptes de finestra de congestió i finestra d'enviament estan relacionats entre si, i la quantitat de dades a l'emissor es controla ajustant dinàmicament la mida de la finestra de congestió. L'inici lent, l'evitació de la congestió i la recuperació ràpida són les tres parts principals de l'algoritme de control de congestió de TCP, que ajusten la mida de la finestra de congestió mitjançant diferents estratègies per adaptar-se a la capacitat i al grau de congestió de la xarxa.
A la següent secció, examinarem en detall el mecanisme de retransmissió de TCP. El mecanisme de retransmissió és una part important de TCP per aconseguir una transmissió fiable. Assegura la transmissió fiable de dades retransmetent dades perdudes, corruptes o retardades. El principi d'implementació i l'estratègia del mecanisme de retransmissió s'introduiran i analitzaran en detall a la següent secció. Estigueu atents!
Data de publicació: 24 de febrer de 2025