Principais mistérios das conexões TCP do Network Packet Broker: desmistificou a necessidade do aperto de mão triplo

Configuração de conexão TCP
Quando navegamos na web, enviamos um e-mail ou jogamos um jogo online, muitas vezes não pensamos na complexa conexão de rede por trás disso. No entanto, são estes passos aparentemente pequenos que garantem uma comunicação estável entre nós e o servidor. Uma das etapas mais importantes é a configuração da conexão TCP, e o núcleo disso é o handshake triplo.

Este artigo discutirá detalhadamente o princípio, o processo e a importância do handshake triplo. Passo a passo, explicaremos por que o handshake triplo é necessário, como ele garante estabilidade e confiabilidade da conexão e qual a sua importância para a transferência de dados. Com uma compreensão mais profunda do handshake triplo, obteremos uma melhor compreensão dos mecanismos subjacentes à comunicação de rede e uma visão mais clara da confiabilidade das conexões TCP.

Processo de handshake triplo TCP e transições de estado
TCP é um protocolo de transporte orientado a conexão, que requer o estabelecimento de uma conexão antes da transmissão de dados. Este processo de estabelecimento de conexão é feito por meio de um handshake triplo.

 Aperto de mão triplo TCP

Vamos dar uma olhada mais de perto nos pacotes TCP enviados em cada conexão.

Inicialmente, tanto o cliente quanto o servidor estão FECHADOS. Primeiro, o servidor escuta ativamente em uma porta e está no estado LISTEN, o que significa que o servidor deve ser iniciado. Em seguida, o cliente está pronto para começar a acessar a página web. Ele precisa estabelecer uma conexão com o servidor. O formato do primeiro pacote de conexão é o seguinte:

 Pacote SYN

Quando um cliente inicia uma conexão, ele gera um número de sequência inicial aleatório (client_isn) e o coloca no campo "Número de sequência" do cabeçalho TCP. Ao mesmo tempo, o cliente define a posição do sinalizador SYN como 1 para indicar que o pacote de saída é um pacote SYN. O cliente indica que deseja estabelecer uma conexão com o servidor enviando o primeiro pacote SYN ao servidor. Este pacote não contém dados da camada de aplicação (ou seja, dados enviados). Neste ponto, o status do cliente é marcado como SYN-SENT.

Pacote SYN+ACK

Quando um servidor recebe um pacote SYN de um cliente, ele inicializa aleatoriamente seu próprio número de série (server_isn) e então coloca esse número no campo “Número de série” do cabeçalho TCP. Em seguida, o servidor insere client_isn + 1 no campo "Número de confirmação" e define os bits SYN e ACK como 1. Finalmente, o servidor envia o pacote para o cliente, que não contém dados da camada de aplicação (e nenhum dado para o servidor para enviar). Neste momento, o servidor está no estado SYN-RCVD.

Pacote ACK

Depois que o cliente recebe o pacote do servidor, ele precisa realizar as seguintes otimizações para responder ao pacote de resposta final: Primeiro, o cliente define o bit ACK do cabeçalho TCP do pacote de resposta como 1; Segundo, o cliente insere o valor server_isn + 1 no campo “Confirmar número de resposta”; Finalmente, o cliente envia o pacote ao servidor. Este pacote pode transportar dados do cliente para o servidor. Após a conclusão destas operações, o cliente entrará no estado ESTABELECIDO.

Assim que o servidor recebe o pacote de resposta do cliente, ele também muda para o estado ESTABLISHED.

Como você pode ver no processo acima, ao realizar um handshake de três vias, o terceiro handshake pode transportar dados, mas os dois primeiros handshakes não. Esta é uma pergunta frequentemente feita em entrevistas. Assim que o handshake triplo for concluído, ambas as partes entram no estado ESTABLISHED, indicando que a conexão foi estabelecida com sucesso, momento em que o cliente e o servidor podem começar a enviar dados um ao outro.

Por que três apertos de mão? Não duas vezes, quatro vezes?
A resposta comum é: “Porque o handshake triplo garante a capacidade de receber e enviar”. Esta resposta está correta, mas é apenas a razão superficial, não apresenta a razão principal. A seguir, analisarei as razões do aperto de mão triplo a partir de três aspectos para aprofundar nossa compreensão desta questão.

O handshake de três vias pode efetivamente evitar a inicialização de conexões historicamente repetidas (o principal motivo)
O handshake triplo garante que ambas as partes tenham recebido um número de sequência inicial confiável.
O handshake triplo evita o desperdício de recursos.

Razão 1: Evite junções duplicadas históricas
Resumindo, o principal motivo do handshake triplo é evitar confusão causada pela antiga inicialização da conexão duplicada. Em um ambiente de rede complexo, a transmissão de pacotes de dados nem sempre é enviada ao host de destino de acordo com o tempo especificado, e pacotes de dados antigos podem chegar primeiro ao host de destino devido ao congestionamento da rede e outros motivos. Para evitar isso, o TCP usa um handshake triplo para estabelecer a conexão.

handshake de três vias evita conexões duplicadas históricas

Quando um cliente envia vários pacotes de estabelecimento de conexão SYN em sucessão, em situações como congestionamento de rede, pode ocorrer o seguinte:

1- Os pacotes SYN antigos chegam ao servidor antes dos pacotes SYN mais recentes.
2- O servidor responderá um pacote SYN + ACK ao cliente após receber o pacote SYN antigo.
3- Quando o cliente recebe o pacote SYN + ACK, ele determina que a conexão é uma conexão histórica (número de sequência expirado ou timeout) de acordo com seu próprio contexto, e então envia o pacote RST ao servidor para abortar a conexão.

Com uma conexão de dois handshakes, não há como determinar se a conexão atual é uma conexão histórica. O handshake triplo permite que o cliente determine se a conexão atual é uma conexão histórica com base no contexto quando estiver pronto para enviar o terceiro pacote:

1- Se for uma conexão histórica (número de sequência expirado ou timeout), o pacote enviado pelo terceiro handshake é um pacote RST para abortar a conexão histórica.
2- Se não for uma conexão histórica, o pacote enviado pela terceira vez é um pacote ACK e as duas partes comunicantes estabelecem a conexão com sucesso.

Portanto, a principal razão pela qual o TCP usa o handshake triplo é que ele inicializa a conexão para evitar conexões históricas.

Razão 2: Para sincronizar os números de sequência iniciais de ambas as partes
Ambos os lados do protocolo TCP devem manter um número de sequência, que é um fator chave para garantir uma transmissão confiável. Os números de sequência desempenham um papel importante nas conexões TCP. Eles fazem o seguinte:

O receptor pode eliminar dados duplicados e garantir a precisão dos dados.

O receptor pode receber pacotes na ordem do número de sequência para garantir a integridade dos dados.

● O número de sequência pode identificar o pacote de dados que foi recebido pela outra parte, permitindo uma transmissão de dados confiável.

Portanto, ao estabelecer uma conexão TCP, o cliente envia pacotes SYN com o número de sequência inicial e exige que o servidor responda com um pacote ACK indicando a recepção bem-sucedida do pacote SYN do cliente. Em seguida, o servidor envia o pacote SYN com o número de sequência inicial para o cliente e espera que o cliente responda, de uma vez por todas, para garantir que os números de sequência iniciais sejam sincronizados de forma confiável.

Sincronize os números de série iniciais de ambas as partes

Embora um handshake de quatro vias também seja possível para sincronizar de forma confiável os números de sequência iniciais de ambas as partes, a segunda e a terceira etapas podem ser combinadas em uma única etapa, resultando em um handshake de três vias. No entanto, os dois handshakes só podem garantir que o número de sequência inicial de uma parte seja recebido com sucesso pela outra parte, mas não há garantia de que o número de sequência inicial de ambas as partes possa ser confirmado. Portanto, o handshake triplo é a melhor escolha para garantir a estabilidade e confiabilidade das conexões TCP.

Razão 3: Evite desperdiçar recursos
Se houver apenas um “two-handshake”, quando a solicitação SYN do cliente for bloqueada na rede, o cliente não poderá receber o pacote ACK enviado pelo servidor, então o SYN será reenviado. Entretanto, como não há um terceiro handshake, o servidor não pode determinar se o cliente recebeu uma confirmação ACK para estabelecer a conexão. Portanto, o servidor só pode estabelecer uma conexão proativamente após receber cada solicitação SYN. Isso leva ao seguinte:

Desperdício de recursos: Se a solicitação SYN do cliente for bloqueada, resultando na transmissão repetida de vários pacotes SYN, o servidor estabelecerá várias conexões redundantes inválidas após receber a solicitação. Isso leva a um desperdício desnecessário de recursos do servidor.

Retenção de mensagens: Devido à falta de um terceiro handshake, o servidor não tem como saber se o cliente recebeu corretamente o reconhecimento ACK para estabelecer a conexão. Como resultado, se as mensagens ficarem presas na rede, o cliente continuará enviando solicitações SYN continuamente, fazendo com que o servidor estabeleça constantemente novas conexões. Isto aumentará o congestionamento e o atraso da rede e afetará negativamente o desempenho geral da rede.

Evite desperdiçar recursos

Portanto, para garantir a estabilidade e confiabilidade da conexão de rede, o TCP utiliza o handshake triplo para estabelecer a conexão e evitar a ocorrência desses problemas.

Resumo
OCorretor de pacotes de redeO estabelecimento da conexão TCP é feito com um handshake triplo. Durante o handshake triplo, o cliente primeiro envia um pacote com a flag SYN ao servidor, indicando que deseja estabelecer uma conexão. Após receber a solicitação do cliente, o servidor responde ao cliente um pacote com flags SYN e ACK, indicando que a solicitação de conexão foi aceita, e envia seu próprio número de sequência inicial. Finalmente, o cliente responde com um sinalizador ACK ao servidor para indicar que a conexão foi estabelecida com sucesso. Assim, as duas partes ficam no estado ESTABELECIDO e podem começar a enviar dados entre si.

Em geral, o processo de handshake triplo para estabelecimento de conexão TCP é projetado para garantir estabilidade e confiabilidade da conexão, evitar confusão e desperdício de recursos em conexões históricas e garantir que ambas as partes sejam capazes de receber e enviar dados.


Horário da postagem: 08 de janeiro de 2025