A arma secreta de TCP: control de fluxo de rede e control de conxestión de rede

Transporte de fiabilidade TCP
Todos estamos familiarizados co protocolo TCP como un protocolo de transporte fiable, pero como garante a fiabilidade do transporte?

Para lograr unha transmisión fiable, cómpre ter en conta moitos factores, como a corrupción de datos, a perda, a duplicación e os fragmentos fóra de orde. Se non se poden resolver estes problemas, non se poderá lograr unha transmisión fiable.

Polo tanto, TCP emprega mecanismos como o número de secuencia, a resposta de confirmación, o control de reenvío, a xestión de conexións e o control de fiestras para lograr unha transmisión fiable.

Neste artigo, centrarémonos na xanela deslizante, no control de fluxo e no control de conxestión de TCP. O mecanismo de retransmisión trátase por separado na seguinte sección.

Control de fluxo de rede
O control de fluxo de rede ou coñecido como control de tráfico de rede é en realidade unha manifestación da sutil relación entre produtores e consumidores. Probablemente te atopaches con este escenario moitas veces no traballo ou en entrevistas. Se a capacidade do produtor para producir supera con creces a capacidade do consumidor para consumir, fará que a cola medre indefinidamente. Nun caso máis grave, pode que saibas que cando as mensaxes de RabbitMQ se acumulan demasiado, pode causar unha degradación do rendemento de todo o servidor MQ. O mesmo ocorre con TCP; se non se controla, colocaranse demasiadas mensaxes na rede e os consumidores superarán a súa capacidade, mentres que os produtores continuarán enviando mensaxes duplicadas, o que afectará en gran medida o rendemento da rede.

Para abordar este fenómeno, o TCP proporciona un mecanismo para que o emisor controle a cantidade de datos enviados en función da capacidade de recepción real do receptor, o que se coñece como control de fluxo. O receptor mantén unha xanela de recepción, mentres que o emisor mantén unha xanela de envío. Cómpre sinalar que estas xanelas son só para unha única conexión TCP e non todas as conexións comparten unha xanela.

TCP proporciona control de fluxo mediante o uso dunha variable para unha xanela de recepción. A xanela de recepción dálle ao emisor unha indicación de canto espazo na caché aínda está dispoñible. O emisor controla a cantidade de datos enviados segundo a capacidade de aceptación real do receptor.

O servidor receptor notifica ao emisor o tamaño dos datos que pode recibir, e o emisor envía ata este límite. Este límite é o tamaño da xanela, lembras a cabeceira TCP? Hai un campo da xanela de recepción, que se usa para indicar o número de bytes que o receptor pode ou quere recibir.

O servidor emisor enviará periodicamente un paquete de sonda de xanela, que se usa para detectar se o servidor receptor aínda pode aceptar datos. Cando o búfer do receptor corre perigo de desbordarse, o tamaño da xanela establécese nun valor menor para indicarlle ao emisor que controle a cantidade de datos enviados.

Aquí tes un diagrama de control de fluxo de rede:

Control de tráfico

Control de conxestión da rede
Antes de introducir o control de conxestión, debemos entender que, ademais da xanela de recepción e da xanela de envío, tamén existe unha xanela de conxestión, que se usa principalmente para resolver o problema da velocidade á que o emisor comeza a enviar datos á xanela de recepción. Polo tanto, a xanela de conxestión tamén a mantén o emisor TCP. Necesitamos un algoritmo para decidir cantos datos son axeitados para enviar, xa que enviar demasiados ou moi poucos datos non é o ideal, de aí o concepto de xanela de conxestión.

No control de fluxo de rede anterior, o que evitabamos era que o emisor enchese a caché do receptor con datos, pero non sabiamos o que estaba a suceder na rede. Normalmente, as redes informáticas están nun ambiente compartido. Como resultado, pode haber conxestión na rede debido á comunicación entre outros hosts.

Cando a rede está conxestionada, se se continúa enviando un gran número de paquetes, pode causar problemas como atrasos e perdas de paquetes. Neste punto, o TCP retransmitirá os datos, pero a retransmisión aumentará a carga da rede, o que provocará atrasos maiores e máis perdas de paquetes. Isto pode entrar nun círculo vicioso e seguir agravándose.

Polo tanto, TCP non pode ignorar o que está a suceder na rede. Cando a rede está conxestionada, TCP sacrifícase a si mesmo reducindo a cantidade de datos que envía.

Polo tanto, proponse o control de conxestión, que ten como obxectivo evitar encher toda a rede con datos do emisor. Para regular a cantidade de datos que o emisor debe enviar, TCP define un concepto chamado xanela de conxestión. O algoritmo de control de conxestión axustará o tamaño da xanela de conxestión segundo o grao de conxestión da rede, para controlar a cantidade de datos enviados polo emisor.

Que é unha xanela de conxestión? Que ten que ver isto coa xanela de envío?

A xanela de conxestión é unha variable de estado mantida polo emisor que determina a cantidade de datos que este pode enviar. A xanela de conxestión cambia dinamicamente segundo o nivel de conxestión da rede.

A xanela de envío é un tamaño de xanela acordado entre o emisor e o receptor que indica a cantidade de datos que o receptor pode recibir. A xanela de conxestión e a xanela de envío están relacionadas; a xanela de envío adoita ser igual ao mínimo das xanelas de conxestión e recepción, é dicir, swnd = min(cwnd, rwnd).

A xanela de conxestión cwnd cambia do seguinte xeito:

Se non hai conxestión na rede, é dicir, se non se produce un tempo de espera de retransmisión, a xanela de conxestión aumenta.

Se hai conxestión na rede, a xanela de conxestión diminúe.

O emisor determina se a rede está conxestionada observando se o paquete de confirmación ACK se recibe dentro do tempo especificado. Se o emisor non recibe o paquete de confirmación ACK dentro do tempo especificado, considérase que a rede está conxestionada.

Ademais da xanela de conxestión, é hora de falar do algoritmo de control de conxestión TCP. O algoritmo de control de conxestión TCP consta de tres partes principais:

Arranque lento:Inicialmente, a xanela de conxestión de cwnd é relativamente pequena e o emisor aumenta a xanela de conxestión exponencialmente para adaptarse rapidamente á capacidade da rede.
Evitación da conxestión:Despois de que a xanela de conxestión supere un certo limiar, o emisor aumenta a xanela de conxestión de maneira lineal para frear a taxa de crecemento da xanela de conxestión e evitar a sobrecarga da rede.
Recuperación rápida:Se se produce conxestión, o remitente reduce á metade a xanela de conxestión e entra no estado de recuperación rápida para determinar a localización da recuperación da rede a través dos acks duplicados recibidos e, a continuación, continúa aumentando a xanela de conxestión.

Arranque lento
Cando se establece unha conexión TCP, a xanela de conxestión cwnd establécese inicialmente nun valor mínimo de MSS (tamaño máximo do segmento). Deste xeito, a taxa de envío inicial é duns MSS/RTT bytes/segundo. O ancho de banda real dispoñible adoita ser moito maior que o de MSS/RTT, polo que TCP quere atopar a taxa de envío óptima, que se pode conseguir mediante un arranque lento.

No proceso de inicio lento, o valor da xanela de conxestión cwnd inicializarase a 1 MSS e, cada vez que se recoñeza o segmento de paquete transmitido, o valor de cwnd aumentará nun MSS, é dicir, o valor de cwnd converterase en 2 MSS. Despois diso, o valor de cwnd duplícase por cada transmisión exitosa dun segmento de paquete e así sucesivamente. O proceso de crecemento específico móstrase na seguinte figura.

 Control da conxestión da rede

Non obstante, a taxa de envío non sempre pode medrar; o crecemento ten que rematar nalgún momento. Entón, cando remata o aumento da taxa de envío? O inicio lento normalmente remata o aumento da taxa de envío dunha destas varias maneiras:

A primeira forma é o caso da perda de paquetes durante o proceso de envío de inicio lento. Cando se produce unha perda de paquetes, TCP establece a xanela de conxestión cwnd do remitente en 1 e reinicia o proceso de inicio lento. Neste punto, introdúcese un concepto de limiar de inicio lento ssthresh, cuxo valor inicial é a metade do valor de cwnd que xera a perda de paquetes. É dicir, cando se detecta conxestión, o valor de ssthresh é a metade do valor da xanela.

A segunda forma é correlacionar directamente co valor do limiar de inicio lento ssthresh. Dado que o valor de ssthresh é a metade do valor da xanela cando se detecta conxestión, pode producirse perda de paquetes con cada duplicación cando cwnd sexa maior que ssthresh. Polo tanto, é mellor configurar cwnd en ssthresh, o que fará que TCP cambie ao modo de control de conxestión e finalice o inicio lento.

A última maneira en que pode rematar un inicio lento é se se detectan tres ACK redundantes, TCP realiza unha retransmisión rápida e entra no estado de recuperación. (Se non está claro por que hai tres paquetes ACK, explicarase por separado no mecanismo de retransmisión).

Evitación da conxestión
Cando o TCP entra no estado de control de conxestión, cwnd establécese na metade do limiar de conxestión ssthresh. Isto significa que o valor de cwnd non se pode duplicar cada vez que se recibe un segmento de paquete. No seu lugar, adóptase unha estratexia relativamente conservadora na que o valor de cwnd aumenta só nun MSS (lonxitude máxima do segmento de paquete) despois de que se complete cada transmisión. Por exemplo, mesmo se se recoñecen 10 segmentos de paquete, o valor de cwnd só aumentará nun MSS. Este é un modelo de crecemento lineal e tamén ten un límite superior de crecemento. Cando se produce unha perda de paquetes, o valor de cwnd cámbiase a un MSS e o valor de ssthresh establécese na metade de cwnd. Ou tamén deterá o crecemento de MSS cando se reciban 3 respostas ACK redundantes. Se aínda se reciben tres ACK redundantes despois de reducir á metade o valor de cwnd, o valor de ssthresh rexístrase como a metade do valor de cwnd e entra no estado de recuperación rápida.

Recuperación rápida
No estado de Recuperación Rápida, o valor da xanela de conxestión cwnd aumenta nun MSS por cada ACK redundante recibido, é dicir, ACK que non chega en secuencia. Isto faise para aproveitar os segmentos de paquetes que se transmitiron correctamente na rede para mellorar a eficiencia da transmisión tanto como sexa posible.

Cando chega un ACK do segmento de paquete perdido, TCP reduce o valor de cwnd e logo entra no estado de evitar a conxestión. Isto é para controlar o tamaño da xanela de conxestión e evitar un aumento adicional da conxestión da rede.

Se se produce un tempo de espera despois do estado de control de conxestión, a condición da rede empeora e TCP migra do estado para evitar a conxestión ao estado de inicio lento. Neste caso, o valor da xanela de conxestión cwnd establécese en 1 MSS, a lonxitude máxima do segmento de paquete e o valor do limiar de inicio lento ssthresh establécese na metade de cwnd. O propósito disto é aumentar gradualmente o tamaño da xanela de conxestión despois de que a rede se recupere para equilibrar a velocidade de transmisión e o grao de conxestión da rede.

Resumo
Como protocolo de transporte fiable, TCP implementa transporte fiable mediante número de secuencia, confirmación, control de retransmisión, xestión de conexións e control de xanelas. Entre eles, o mecanismo de control de fluxo controla a cantidade de datos enviados polo emisor segundo a capacidade de recepción real do receptor, o que evita os problemas de conxestión da rede e degradación do rendemento. O mecanismo de control de conxestión evita a aparición de conxestión na rede axustando a cantidade de datos enviados polo emisor. Os conceptos de xanela de conxestión e xanela de envío están relacionados entre si, e a cantidade de datos no emisor contrólase axustando dinamicamente o tamaño da xanela de conxestión. O inicio lento, a evitación da conxestión e a recuperación rápida son as tres partes principais do algoritmo de control de conxestión de TCP, que axustan o tamaño da xanela de conxestión a través de diferentes estratexias para adaptarse á capacidade e ao grao de conxestión da rede.

Na seguinte sección, examinaremos en detalle o mecanismo de retransmisión de TCP. O mecanismo de retransmisión é unha parte importante de TCP para lograr unha transmisión fiable. Garante a transmisión fiable de datos ao retransmitir datos perdidos, corruptos ou atrasados. O principio de implementación e a estratexia do mecanismo de retransmisión presentaranse e analizaranse en detalle na seguinte sección. Permanecede atentos!


Data de publicación: 24 de febreiro de 2025