Principais mistérios das conexões TCP do Network Packet Broker: desmistificando a necessidade do Triple Handshake

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 esses passos aparentemente pequenos que garantem uma comunicação estável entre nós e o servidor. Um dos passos mais importantes é a configuração da conexão TCP, e o cerne 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 a estabilidade e a confiabilidade da conexão e sua importância para a transferência de dados. Com uma compreensão mais aprofundada do handshake triplo, compreenderemos melhor os mecanismos subjacentes à comunicação em rede e teremos uma visão mais clara da confiabilidade das conexões TCP.

Processo de handshake triplo TCP e transições de estado
O TCP é um protocolo de transporte orientado à conexão, que requer o estabelecimento da conexão antes da transmissão de dados. Esse processo de estabelecimento da conexão é realizado por meio de um handshake triplo.

 Aperto de mão TCP triplo

Vamos dar uma olhada mais de perto nos pacotes TCP que são 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 precisa 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 para o servidor. Este pacote não contém dados da camada de aplicação (ou seja, dados enviados). Nesse 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 o insere 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. Por fim, o servidor envia o pacote ao cliente, que não contém dados da camada de aplicação (e nenhum dado para o servidor enviar). Nesse momento, o servidor está no estado SYN-RCVD.

Pacote ACK

Após o cliente receber 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"; por fim, o cliente envia o pacote ao servidor. Este pacote pode transportar dados do cliente para o servidor. Após a conclusão dessas operações, o cliente entrará no estado ESTABELECIDO.

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

Como você pode ver no processo acima, ao realizar um handshake triplo, o terceiro handshake pode transportar dados, mas os dois primeiros não. Esta é uma pergunta frequente em entrevistas. Uma vez concluído o handshake triplo, ambas as partes entram no estado ESTABELECIDO, 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 dois, quatro?
A resposta comum é: "Porque o aperto de mão triplo garante a capacidade de receber e enviar". Essa resposta está correta, mas é apenas a razão superficial, não apresenta a razão principal. A seguir, analisarei as razões para o aperto de mão triplo sob três aspectos para aprofundar nossa compreensão dessa questão.

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

Motivo 1: Evite junções duplicadas históricas
Em resumo, o principal motivo do handshake triplo é evitar confusões causadas pela inicialização de conexão duplicada antiga. Em um ambiente de rede complexo, a transmissão de pacotes de dados nem sempre é enviada ao host de destino no horário especificado, e pacotes de dados antigos podem chegar primeiro ao host de destino devido a congestionamentos na rede e outros motivos. Para evitar isso, o TCP utiliza um handshake triplo para estabelecer a conexão.

handshake triplo 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 é 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 é histórica. O handshake triplo permite que o cliente determine se a conexão atual é 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, o principal motivo pelo qual o TCP usa o handshake de três vias é que ele inicializa a conexão para evitar conexões históricas.

Motivo 2: Para sincronizar os números de sequência iniciais de ambas as partes
Ambas as partes 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 confiável de dados.

Portanto, ao estabelecer uma conexão TCP, o cliente envia pacotes SYN com o número de sequência inicial e solicita que o servidor responda com um pacote ACK, indicando o recebimento bem-sucedido 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 aguarda a resposta do cliente, de uma vez por todas, para garantir que os números de sequência iniciais estejam 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 de três vias é a melhor escolha para garantir a estabilidade e a confiabilidade das conexões TCP.

Razão 3: Evite o desperdício de recursos
Se houver apenas um "handshake duplo", quando a solicitação SYN do cliente for bloqueada na rede, o cliente não poderá receber o pacote ACK enviado pelo servidor, portanto, o SYN será reenviado. No entanto, como não há um terceiro handshake, o servidor não consegue 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 e 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 à ausência de um terceiro handshake, o servidor não tem como saber se o cliente recebeu corretamente a confirmação ACK para estabelecer a conexão. Como resultado, se as mensagens ficarem presas na rede, o cliente continuará enviando solicitações SYN repetidamente, fazendo com que o servidor estabeleça novas conexões constantemente. Isso aumentará o congestionamento e o atraso da rede, afetando negativamente o desempenho geral da rede.

Evite o desperdício de recursos

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

Resumo
OAgente de Pacotes de RedeO estabelecimento da conexão TCP é feito por meio de um handshake triplo. Durante o handshake triplo, o cliente primeiro envia um pacote com o sinalizador SYN ao servidor, indicando que deseja estabelecer uma conexão. Após receber a solicitação do cliente, o servidor responde ao cliente com um pacote com os sinalizadores SYN e ACK, indicando que a solicitação de conexão foi aceita, e envia seu próprio número de sequência inicial. Por fim, o cliente responde ao servidor com um sinalizador ACK, indicando que a conexão foi estabelecida com sucesso. Assim, as duas partes estão no estado ESTABLISHED e podem começar a enviar dados uma à outra.

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/01/2025