Configuração de conexão TCP
Ao navegar na internet, enviar um e-mail ou jogar 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 é o estabelecimento da conexão TCP, e o núcleo disso é o handshake de três vias.
Este artigo discutirá detalhadamente o princípio, o processo e a importância do handshake de três vias. Passo a passo, explicaremos por que o handshake de três vias é necessário, como ele garante a estabilidade e a confiabilidade da conexão e qual a sua importância para a transferência de dados. Com uma compreensão mais profunda do handshake de três vias, obteremos uma melhor compreensão dos mecanismos subjacentes à comunicação em rede e uma visão mais clara da confiabilidade das conexões TCP.
Processo de handshake de três vias TCP e transições de estado
O TCP é um protocolo de transporte orientado a conexão, que requer o estabelecimento de uma conexão antes da transmissão de dados. Esse processo de estabelecimento de conexão é realizado por meio de um handshake de três vias.
Vamos analisar mais detalhadamente os 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 precisa ser iniciado. Em seguida, o cliente está pronto para acessar a página da web. Ele precisa estabelecer uma conexão com o servidor. O formato do primeiro pacote de conexão é o seguinte:
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). Neste ponto, o status do cliente é marcado como SYN-SENT.
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. 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 enviar). Nesse momento, o servidor está no estado SYN-RCVD.
Assim 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 "Número de resposta de confirmação"; Finalmente, o cliente envia o pacote para o servidor. Este pacote pode transportar dados do cliente para o servidor. Após a conclusão dessas operações, o cliente entrará no estado ESTABLISHED.
Assim 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 de três vias, o terceiro handshake pode transmitir dados, mas os dois primeiros não. Essa é uma dúvida frequente em entrevistas. Assim que o handshake de três vias é 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 para o outro.
Por que três apertos de mão? E não dois, quatro?
A resposta comum é: "Porque o handshake triplo garante a capacidade de receber e enviar dados". Essa resposta está correta, mas é apenas a explicação superficial, não apresentando a razão principal. A seguir, analisarei as razões para o handshake triplo sob três perspectivas para aprofundar nossa compreensão sobre o assunto.
O handshake de três vias pode evitar eficazmente a inicialização de conexões historicamente repetidas (principal razão).
O aperto de mãos de três vias garante que ambas as partes receberam um número de sequência inicial confiável.
O aperto de mãos triplo evita o desperdício de recursos.
Motivo 1: Evitar junções duplicadas históricas
Em resumo, a principal razão para o handshake de três vias é evitar a confusão causada pela inicialização de conexões duplicadas antigas. 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 a congestionamento de rede e outros motivos. Para evitar isso, o TCP usa um handshake de três vias para estabelecer a conexão.
Quando um cliente envia vários pacotes de estabelecimento de conexão SYN em sequência, em situações como congestionamento de rede, o seguinte pode ocorrer:
1- Os pacotes SYN antigos chegam ao servidor antes dos pacotes SYN mais recentes.
2- O servidor enviará um pacote SYN + ACK ao cliente após receber o pacote SYN anterior.
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 tempo limite excedido) de acordo com seu próprio contexto e, em seguida, envia o pacote RST para o 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 de três vias 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 tempo limite atingido), o pacote enviado pelo terceiro handshake é um pacote RST para abortar a conexão histórica.
2- Se não se tratar de uma conexão histórica, o pacote enviado pela terceira vez é um pacote ACK, e as duas partes em comunicação estabelecem a conexão com sucesso.
Portanto, a principal razão pela qual o TCP usa o handshake de três vias é para inicializar a conexão e evitar conexões anteriores.
Motivo 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, fator essencial 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 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.
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, o segundo e o terceiro passos podem ser combinados em um único passo, resultando em um handshake de três vias. No entanto, os dois handshakes garantem apenas que o número de sequência inicial de uma das partes seja recebido com sucesso pela outra, mas não garantem a confirmação do número de sequência inicial de ambas as partes. Portanto, o handshake de três vias é a melhor opção para garantir a estabilidade e a confiabilidade das conexões TCP.
Motivo 3: Evitar o desperdício de recursos
Se houver apenas um "aperto de duas mãos", 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. No entanto, como não há um terceiro aperto de mãos, o servidor não pode determinar se o cliente recebeu um reconhecimento 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 múltiplos pacotes SYN, o servidor estabelecerá múltiplas conexões inválidas redundantes 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 o ACK (afirmação de confirmação) para estabelecer a conexão. Consequentemente, 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 mesma.
Portanto, para garantir a estabilidade e a confiabilidade da conexão de rede, o TCP utiliza o handshake de três vias para estabelecer a conexão e evitar a ocorrência desses problemas.
Resumo
OCorretor de Pacotes de RedeO estabelecimento de uma conexão TCP é feito por meio de um handshake de três vias. Durante o handshake, o cliente envia um pacote com o sinalizador SYN para o servidor, indicando que deseja estabelecer uma conexão. Após receber a solicitação do cliente, o servidor responde com um pacote contendo 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. Finalmente, o cliente responde com um sinalizador ACK para o servidor, indicando que a conexão foi estabelecida com sucesso. Dessa forma, as duas partes ficam no estado ESTABLISHED e podem começar a trocar dados.
De forma geral, o processo de handshake de três vias para o estabelecimento de uma conexão TCP visa garantir a estabilidade e a confiabilidade da conexão, evitar confusões e desperdício de recursos em conexões anteriores e assegurar que ambas as partes possam receber e enviar dados.
Data da publicação: 08/01/2025






