Transporte de Confiabilidade TCP
Todos nós conhecemos o protocolo TCP como um protocolo de transporte confiável, mas como ele garante a confiabilidade do transporte?
Para alcançar uma transmissão confiável, muitos fatores precisam ser considerados, como corrupção de dados, perda, duplicação e fragmentos fora de ordem. Se esses problemas não forem resolvidos, a transmissão confiável não poderá ser alcançada.
Portanto, o TCP emprega mecanismos como número de sequência, resposta de confirmação, controle de reenvio, gerenciamento de conexão e controle de janela para alcançar uma transmissão confiável.
Neste artigo, focaremos na janela deslizante, no controle de fluxo e no controle de congestionamento do TCP. O mecanismo de retransmissão será abordado separadamente na próxima seção.
Controle de fluxo de rede
O Controle de Fluxo de Rede, também conhecido como Controle de Tráfego de Rede, é na verdade uma manifestação da relação sutil entre produtores e consumidores. Você provavelmente já se deparou com esse cenário diversas vezes no trabalho ou em entrevistas. Se a capacidade de produção de um produtor exceder em muito a capacidade de consumo de um consumidor, a fila crescerá indefinidamente. Em um caso mais grave, você deve saber que, quando as mensagens do RabbitMQ se acumulam em excesso, isso pode causar degradação de desempenho em todo o servidor MQ. O mesmo acontece com o TCP; se não for controlado, muitas mensagens serão enviadas para a rede, os consumidores excederão sua capacidade, enquanto os produtores continuarão enviando mensagens duplicadas, o que afetará significativamente o desempenho da rede.
Para lidar com esse fenômeno, o TCP fornece um mecanismo para que o remetente controle a quantidade de dados enviados com base na capacidade real de recepção do receptor, conhecido como controle de fluxo. O receptor mantém uma janela de recepção, enquanto o remetente mantém uma janela de envio. Deve-se notar que essas janelas são válidas apenas para uma única conexão TCP e nem todas as conexões compartilham uma janela.
O TCP realiza o controle de fluxo utilizando uma variável para a janela de recepção. A janela de recepção indica ao remetente quanto espaço de cache ainda está disponível. O remetente controla a quantidade de dados enviados de acordo com a capacidade real de aceitação do receptor.
O host receptor notifica o remetente sobre o tamanho dos dados que pode receber, e o remetente envia até esse limite. Esse limite é o tamanho da janela, lembra-se do cabeçalho TCP? Existe um campo de janela de recebimento, que é usado para indicar o número de bytes que o receptor pode ou está disposto a receber.
O host remetente enviará periodicamente um pacote de sondagem de janela, usado para detectar se o host receptor ainda consegue aceitar dados. Quando o buffer do receptor estiver prestes a transbordar, o tamanho da janela será reduzido para instruir o remetente a controlar a quantidade de dados enviados.
Segue um diagrama de controle de fluxo em rede:
Controle de congestionamento de rede
Antes de introduzir o controle de congestionamento, precisamos entender que, além da janela de recepção e da janela de envio, existe também a janela de congestionamento, que é usada principalmente para resolver o problema da taxa na qual o remetente começa a enviar dados para a janela de recepção. Portanto, a janela de congestionamento também é gerenciada pelo remetente TCP. Precisamos de um algoritmo para decidir a quantidade adequada de dados a serem enviados, já que enviar dados em excesso ou em quantidade insuficiente não é o ideal; daí o conceito de janela de congestionamento.
No controle de fluxo de rede anterior, o que evitávamos era que o remetente preenchesse o cache do destinatário com dados, mas não sabíamos o que estava acontecendo na rede. Normalmente, as redes de computadores estão em um ambiente compartilhado. Como resultado, pode haver congestionamento de rede devido à comunicação entre outros hosts.
Quando a rede está congestionada, o envio contínuo de um grande número de pacotes pode causar problemas como atrasos e perda de pacotes. Nesse caso, o TCP retransmite os dados, mas a retransmissão aumenta a carga na rede, resultando em atrasos maiores e mais perdas de pacotes. Isso pode entrar em um ciclo vicioso que se agrava cada vez mais.
Assim, o TCP não pode ignorar o que está acontecendo na rede. Quando a rede está congestionada, o TCP se sacrifica reduzindo a quantidade de dados que envia.
Portanto, propõe-se o controle de congestionamento, que visa evitar o preenchimento de toda a rede com dados do remetente. Para regular a quantidade de dados que o remetente deve enviar, o TCP define um conceito chamado janela de congestionamento. O algoritmo de controle de congestionamento ajustará o tamanho da janela de congestionamento de acordo com o grau de congestionamento da rede, de forma a controlar a quantidade de dados enviados pelo remetente.
O que é uma janela de congestionamento? O que isso tem a ver com a janela de envio?
A janela de congestionamento é uma variável de estado mantida pelo remetente que determina a quantidade de dados que ele pode enviar. A janela de congestionamento muda dinamicamente de acordo com o nível de congestionamento da rede.
A janela de envio é um tamanho de janela acordado entre o remetente e o destinatário que indica a quantidade de dados que o destinatário pode receber. A janela de congestionamento e a janela de envio estão relacionadas; a janela de envio geralmente é igual ao menor valor entre a janela de congestionamento e a janela de recebimento, ou seja, swnd = min(cwnd, rwnd).
A janela de congestionamento (cwnd) muda da seguinte forma:
Se não houver congestionamento na rede, ou seja, se não ocorrer nenhum tempo limite de retransmissão, a janela de congestionamento aumenta.
Se houver congestionamento na rede, a janela de congestionamento diminui.
O remetente determina se a rede está congestionada observando se o pacote de confirmação ACK é recebido dentro do tempo especificado. Se o remetente não receber o pacote de confirmação ACK dentro do tempo especificado, considera-se que a rede está congestionada.
Além da janela de congestionamento, é hora de discutir o algoritmo de controle de congestionamento do TCP. O algoritmo de controle de congestionamento do TCP consiste em três partes principais:
Início lento:Inicialmente, a janela de congestionamento cwnd é relativamente pequena, e o remetente aumenta a janela de congestionamento exponencialmente para se adaptar rapidamente à capacidade da rede.
Prevenção de congestionamentos:Após a janela de congestionamento ultrapassar um determinado limite, o remetente aumenta a janela de congestionamento de forma linear para diminuir a taxa de crescimento da janela de congestionamento e evitar a sobrecarga da rede.
Recuperação rápida:Caso ocorra congestionamento, o remetente reduz pela metade a janela de congestionamento e entra no estado de recuperação rápida para determinar a localização da recuperação da rede por meio dos ACKs duplicados recebidos e, em seguida, continua a aumentar a janela de congestionamento.
Começo lento
Quando uma conexão TCP é estabelecida, a janela de congestionamento (cwnd) é inicialmente definida para um valor mínimo de MSS (tamanho máximo do segmento). Dessa forma, a taxa de envio inicial é de aproximadamente MSS/RTT bytes/segundo. A largura de banda disponível real geralmente é muito maior que MSS/RTT, então o TCP busca encontrar a taxa de envio ideal, o que pode ser alcançado por meio do início lento (slow-start).
No processo de inicialização lenta, o valor da janela de congestionamento (cwnd) será inicializado em 1 MSS e, a cada vez que um segmento de pacote transmitido for confirmado, o valor de cwnd será incrementado em um MSS, ou seja, o valor de cwnd passará a ser 2 MSS. Depois disso, o valor de cwnd será dobrado a cada transmissão bem-sucedida de um segmento de pacote, e assim por diante. O processo de crescimento específico é mostrado na figura a seguir.
No entanto, a taxa de envio nem sempre pode crescer; o crescimento tem que terminar em algum momento. Então, quando termina o aumento da taxa de envio? O início lento normalmente encerra o aumento da taxa de envio de uma das seguintes maneiras:
A primeira forma é o caso de perda de pacotes durante o processo de inicialização lenta (slow start). Quando ocorre uma perda de pacote, o TCP define a janela de congestionamento do remetente (cwnd) como 1 e reinicia o processo de inicialização lenta. Nesse ponto, introduz-se o conceito de limite de inicialização lenta (ssthresh), cujo valor inicial é metade do valor de cwnd que gera a perda de pacotes. Ou seja, quando o congestionamento é detectado, o valor de ssthresh é metade do valor da janela.
A segunda maneira é correlacionar diretamente com o valor do limite de inicialização lenta (ssthresh). Como o valor de ssthresh é metade do valor da janela quando o congestionamento é detectado, pode ocorrer perda de pacotes a cada duplicação quando cwnd for maior que ssthresh. Portanto, é melhor definir cwnd como ssthresh, o que fará com que o TCP mude para o modo de controle de congestionamento e encerre a inicialização lenta.
A última forma pela qual o início lento pode terminar é se três ACKs redundantes forem detectados; nesse caso, o TCP realiza uma retransmissão rápida e entra no estado de recuperação. (Caso não esteja claro o motivo da presença de três pacotes ACK, isso será explicado separadamente na seção sobre o mecanismo de retransmissão.)
Prevenção de congestionamentos
Quando o TCP entra no estado de controle de congestionamento, o parâmetro `cwnd` é definido como metade do limite de congestionamento `ssthresh`. Isso significa que o valor de `cwnd` não pode ser dobrado a cada vez que um segmento de pacote é recebido. Em vez disso, adota-se uma abordagem relativamente conservadora, na qual o valor de `cwnd` é aumentado em apenas um MSS (comprimento máximo do segmento de pacote) após cada transmissão ser concluída. Por exemplo, mesmo que 10 segmentos de pacote sejam confirmados, o valor de `cwnd` aumentará apenas em um MSS. Este é um modelo de crescimento linear e também possui um limite superior de crescimento. Quando ocorre perda de pacotes, o valor de `cwnd` é alterado para um MSS e o valor de `ssthresh` é definido como metade de `cwnd`. Ou o crescimento do MSS é interrompido quando 3 respostas ACK redundantes são recebidas. Se três ACKs redundantes ainda forem recebidos após a redução do valor de `cwnd` pela metade, o valor de `ssthresh` é registrado como metade do valor de `cwnd` e o estado de recuperação rápida é ativado.
Recuperação rápida
No estado de Recuperação Rápida, o valor da janela de congestionamento (cwnd) é incrementado em um MSS para cada ACK redundante recebido, ou seja, ACK que não chega em sequência. Isso visa aproveitar os segmentos de pacotes que foram transmitidos com sucesso na rede para melhorar ao máximo a eficiência da transmissão.
Quando um ACK do segmento de pacote perdido chega, o TCP diminui o valor de cwnd e entra no estado de prevenção de congestionamento. Isso serve para controlar o tamanho da janela de congestionamento e evitar o aumento do congestionamento da rede.
Se ocorrer um timeout após o estado de controle de congestionamento, a condição da rede se torna mais crítica e o TCP migra do estado de prevenção de congestionamento para o estado de inicialização lenta. Nesse caso, o valor da janela de congestionamento (cwnd) é definido como 1 MSS (comprimento máximo do segmento de pacote) e o valor do limite de inicialização lenta (ssthresh) é definido como metade de cwnd. O objetivo disso é aumentar gradualmente o tamanho da janela de congestionamento após a recuperação da rede, para equilibrar a taxa de transmissão e o grau de congestionamento da rede.
Resumo
Como um protocolo de transporte confiável, o TCP implementa transporte confiável por meio de número de sequência, confirmação (Knowledgement), controle de retransmissão (Retransmission Control), gerenciamento de conexão e controle de janela. Dentre esses mecanismos, o controle de fluxo regula a quantidade de dados enviados pelo remetente de acordo com a capacidade real de recebimento do receptor, evitando problemas de congestionamento de rede e degradação de desempenho. O controle de congestionamento evita a ocorrência de congestionamento na rede ajustando a quantidade de dados enviados pelo remetente. Os conceitos de janela de congestionamento e janela de envio estão relacionados, e a quantidade de dados no remetente é controlada pelo ajuste dinâmico do tamanho da janela de congestionamento. Início lento (Slow Start), prevenção de congestionamento (Congestion Avoidance) e recuperação rápida (Fast Recovery) são as três principais partes do algoritmo de controle de congestionamento do TCP, que ajustam o tamanho da janela de congestionamento por meio de diferentes estratégias para se adaptar à capacidade e ao grau de congestionamento da rede.
Na próxima seção, examinaremos detalhadamente o mecanismo de retransmissão do TCP. O mecanismo de retransmissão é uma parte importante do TCP para garantir uma transmissão confiável. Ele assegura a transmissão confiável de dados, retransmitindo dados perdidos, corrompidos ou atrasados. O princípio de implementação e a estratégia do mecanismo de retransmissão serão apresentados e analisados em detalhes na próxima seção. Continue lendo!
Data da publicação: 24/02/2025

