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 obter uma transmissão confiável.
Neste artigo, vamos nos concentrar 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, ou 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 com frequência no trabalho ou em entrevistas. Se a capacidade de produção do produtor exceder em muito a capacidade de consumo do consumidor, a fila crescerá indefinidamente. Em um caso mais sério, você pode saber que, quando as mensagens RabbitMQ se acumulam demais, isso pode causar degradação do desempenho de todo o servidor MQ. O mesmo se aplica ao TCP; se não for controlado, muitas mensagens serão enviadas para a rede e 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 destinatário, o que é conhecido como controle de fluxo. O destinatário mantém uma janela de recepção, enquanto o remetente mantém uma janela de envio. Vale ressaltar que essas janelas são válidas apenas para uma única conexão TCP e que nem todas as conexões compartilham uma janela.
O TCP fornece controle de fluxo usando uma variável para uma janela de recebimento. A janela de recebimento fornece ao remetente uma indicação de 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 destinatário.
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 do cabeçalho TCP? Há um campo de janela de recebimento, que é usado para indicar o número de bytes que o destinatário pode ou está disposto a receber.
O host remetente enviará periodicamente um pacote de sondagem de janela, usado para detectar se o host destinatário ainda consegue aceitar dados. Quando o buffer do destinatário corre o risco de estouro, o tamanho da janela é definido para um valor menor para instruir o remetente a controlar a quantidade de dados enviados.
Aqui está um diagrama de controle de fluxo de rede:
Controle de congestionamento de rede
Antes de introduzir o controle de congestionamento, precisamos entender que, além da janela de recebimento e da janela de envio, existe também uma janela de congestionamento, que é usada principalmente para resolver o problema da taxa de envio de dados pelo remetente para a janela de recebimento. Portanto, a janela de congestionamento também é mantida pelo remetente TCP. Precisamos de um algoritmo para decidir a quantidade de dados apropriada para envio, já que enviar dados em excesso ou em falta 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, redes de computadores estão em um ambiente compartilhado. Como resultado, pode haver congestionamento na 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 perdas de pacotes. Nesse ponto, o TCP retransmite os dados, mas a retransmissão sobrecarrega a rede, resultando em atrasos maiores e mais perdas de pacotes. Isso pode entrar em um ciclo vicioso e se agravar cada vez mais.
Portanto, 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 que toda a rede seja preenchida 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 modo 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 o remetente 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 mínimo das janelas de congestionamento e 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, não ocorrer 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 congestionamento:Após a janela de congestionamento exceder um certo limite, o remetente aumenta a janela de congestionamento de maneira linear para diminuir a taxa de crescimento da janela de congestionamento e evitar sobrecarregar a rede.
Recuperação rápida:Se ocorrer congestionamento, o remetente reduz pela metade a janela de congestionamento e entra no estado de recuperação rápida para determinar o local da recuperação da rede por meio dos acks duplicados recebidos e, então, continua a aumentar a janela de congestionamento.
Início 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 cerca de MSS/RTT bytes/segundo. A largura de banda disponível geralmente é muito maior que MSS/RTT, portanto, o TCP precisa encontrar a taxa de envio ideal, que pode ser alcançada por meio de inicialização lenta.
No processo de inicialização lenta, o valor da janela de congestionamento cwnd será inicializado em 1 MSS e, cada vez que o segmento de pacote transmitido for reconhecido, o valor de cwnd será aumentado em um MSS, ou seja, o valor de cwnd se tornará 2 MSS. Depois disso, o valor de cwnd será dobrado para 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 precisa parar em algum momento. Então, quando o aumento da taxa de envio termina? O início lento geralmente encerra o aumento na taxa de envio de uma das seguintes maneiras:
A primeira situação é o caso de perda de pacotes durante o processo de envio de início lento. Quando ocorre uma perda de pacotes, o TCP define a janela de congestionamento cwnd do remetente como 1 e reinicia o processo de início lento. Nesse ponto, é introduzido o conceito de limite de início lento 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 início lento 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 alterne para o modo de controle de congestionamento e encerre o início lento.
A última maneira pela qual o início lento pode terminar é se três ACKs redundantes forem detectados, o TCP executa uma retransmissão rápida e entra no estado de recuperação. (Se não estiver claro o motivo de haver três pacotes ACK, isso será explicado separadamente no mecanismo de retransmissão.)
Prevenção de congestionamento
Quando o TCP entra no estado de controle de congestionamento, cwnd é definido como metade do limite de congestionamento ssthresh. Isso significa que o valor de cwnd não pode ser duplicado sempre 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 a conclusão de cada transmissão. Por exemplo, mesmo que 10 segmentos de pacote sejam confirmados, o valor de cwnd aumentará apenas um MSS. Este é um modelo de crescimento linear e também possui um limite superior para o 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 também interrompe o crescimento de MSS quando três respostas ACK redundantes são recebidas. Se três ACKs redundantes ainda forem recebidos após a redução pela metade do valor de cwnd, o valor de ssthresh é registrado como metade do valor de cwnd e o estado de recuperação rápida é inserido.
Recuperação rápida
No estado de Recuperação Rápida, o valor da janela de congestionamento cwnd é aumentado em um MSS para cada ACK redundante recebido, ou seja, ACK que não chega em sequência. Isso serve para aproveitar os segmentos de pacotes que foram transmitidos com sucesso na rede e melhorar a eficiência da transmissão o máximo possível.
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 agrava e o TCP migra do estado de prevenção de congestionamento para o estado de início lento. Nesse caso, o valor da janela de congestionamento cwnd é definido como 1 MSS, o comprimento máximo do segmento de pacote, e o valor do limite de início lento 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 número de sequência, reconhecimento, controle de retransmissão, gerenciamento de conexão e controle de janela. Entre eles, o mecanismo de controle de fluxo controla a quantidade de dados enviados pelo remetente de acordo com a capacidade real de recebimento do destinatário, o que evita os problemas de congestionamento da rede e degradação do desempenho. O mecanismo de 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 entre si, e a quantidade de dados no remetente é controlada ajustando dinamicamente o tamanho da janela de congestionamento. Início lento, prevenção de congestionamento e recuperação rápida são as três partes principais 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 o mecanismo de retransmissão do TCP em detalhes. O mecanismo de retransmissão é uma parte importante do TCP para garantir uma transmissão confiável. Ele garante 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. Fique ligado!
Horário da publicação: 24 de fevereiro de 2025