Configuração de conexão TCP
Quando navegamos na web, enviamos um email ou jogamos um jogo on -line, geralmente não pensamos na conexão de rede complexa por trás dele. No entanto, são esses passos aparentemente pequenos que garantem 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 aperto de mão de três vias.
Este artigo discutirá o princípio, processo e importância do aperto de mão de três vias em detalhes. Passo a passo, explicaremos por que o aperto de mão de três vias é necessário, como garante estabilidade e confiabilidade da conexão e quão importante é para a transferência de dados. Com um entendimento mais profundo do aperto de mão de três vias, obteremos uma melhor compreensão dos mecanismos subjacentes da comunicação de rede e uma visão mais clara da confiabilidade das conexões TCP.
Processo de aperto de mão de três vias TCP e transições de estado
O TCP é um protocolo de transporte orientado a conexão, que requer estabelecimento de conexão antes da transmissão de dados. Este processo de estabelecimento de conexão é feito por um aperto de mão de três vias.
Vamos dar uma olhada nos pacotes TCP que são enviados em cada conexão.
Inicialmente, o cliente e o servidor estão fechados. Primeiro, o servidor ouve ativamente em uma porta e está no estado de escuta, o que significa que o servidor deve ser iniciado. Em seguida, o cliente está pronto para começar a acessar a página da web. 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 da sequência" do cabeçalho do 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 aplicativo (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 inicialmente inicialmente seu próprio número de série (Server_isn) e depois coloca esse número no campo "Número de série" do cabeçalho TCP. Em seguida, o servidor entra no campo client_isn + 1 no "número de reconhecimento" 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 aplicativo (e nenhum dado para o servidor enviar). No momento, o servidor está no estado Syn-RCVD.
Depois que o cliente recebe o pacote do servidor, ele precisa executar 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 para 1; Segundo, o cliente insere o valor server_isn + 1 no campo "Confirmar número de resposta"; 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 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 executar um aperto de mão de três vias, o terceiro aperto de mão pode transportar dados, mas os dois primeiros apertos de mão não são. Esta é uma pergunta que geralmente é feita em entrevistas. Uma vez concluído o aperto de mão de três vias, 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 para o outro.
Por que três apertos de mão? Não duas vezes, quatro vezes?
A resposta comum é: "Como o aperto de mão de três vias garante a capacidade de receber e enviar". Esta resposta está correta, mas é apenas a razão da superfície, não apresenta o principal motivo. A seguir, analisarei os motivos do traseiro de mão triplo de três aspectos para aprofundar nossa compreensão dessa questão.
O aperto de mão de três vias pode evitar efetivamente a inicialização de conexões repetidas historicamente (o principal motivo)
O aperto de mão de três vias garante que ambas as partes receberam um número de sequência inicial confiável.
O aperto de mão de três vias evita desperdiçar recursos.
Razão 1: Evite a duplicata histórica se une
Em poucas palavras, o principal motivo do aperto de mão de três vias é 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 os 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 aperto de mão de três vias para estabelecer a conexão.
Quando um cliente envia vários pacotes de estabelecimento de conexão SYN em sucessão, em situações como o congestionamento da rede, podem 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 depois de 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 expirou ou tempo limite) de acordo com seu próprio contexto e envia o pacote RST ao servidor para abortar a conexão.
Com uma conexão de duas mãos, não há como determinar se a conexão atual é uma conexão histórica. O aperto de mão 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 expirou ou tempo limite), o pacote enviado pelo terceiro aperto de mão é um pacote de 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 de comunicação estabelecem com sucesso a conexão.
Portanto, a principal razão pela qual o TCP usa o aperto de mão de três vias é que ele inicializa a conexão para evitar conexões históricas.
Razão 2: Para sincronizar os números de sequência inicial 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 do 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 da sequência para garantir a integridade dos dados.
● O número da sequência pode identificar o pacote de dados que foi recebido pela outra parte, permitindo transmissão de dados confiável.
Portanto, ao estabelecer uma conexão TCP, o cliente envia pacotes Syn com o número da sequência inicial e exige que o servidor responda com um pacote ACK indicando uma recepção bem -sucedida do pacote Syn do cliente. Em seguida, o servidor envia o pacote Syn com o número da sequência inicial para o cliente e aguarda o cliente responder, de uma vez por todas, para garantir que os números iniciais de sequência sejam sincronizados com segurança.
Embora um aperto de mão de quatro vias também seja possível sincronizar de forma confiável os números de sequência inicial de ambas as partes, a segunda e a terceira etapas podem ser combinadas em uma única etapa, resultando em um aperto de mão de três vias. No entanto, os dois apertos de mão 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 inicial de sequência de ambas as partes possa ser confirmado. Portanto, o aperto de mão de três vias é a melhor opção a ser tomada para garantir a estabilidade e a confiabilidade das conexões TCP.
Razão 3: Evite desperdiçar recursos
Se houver apenas um "aperto de duas mãos", quando a solicitação SYN do cliente estiver bloqueada na rede, o cliente não poderá receber o pacote ACK enviado pelo servidor, para que o SYN seja ressentido. No entanto, como não há terceiro aperto de mão, o servidor não pode determinar se o cliente recebeu um reconhecimento da ACK para estabelecer a conexão. Portanto, o servidor pode estabelecer apenas uma conexão proativa após o recebimento de cada solicitação SYN. Isso leva ao seguinte:
Desperdício de recursos: se a solicitação SIN do cliente estiver bloqueada, resultando em transmissão repetida de vários pacotes SYN, o servidor estabelecerá várias conexões inválidas redundantes após o recebimento da solicitação. Isso leva a um desperdício desnecessário de recursos do servidor.
Retenção de mensagens: Devido à falta de um terceiro aperto de mão, o servidor não tem como saber se o cliente recebeu corretamente o reconhecimento da 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 constantemente novas conexões. Isso aumentará o congestionamento da rede e o atraso e afetará negativamente o desempenho geral da rede.
Portanto, para garantir a estabilidade e a confiabilidade da conexão de rede, o TCP usa o aperto de mão de três vias para estabelecer a conexão para evitar a ocorrência desses problemas.
Resumo
OCorretor de pacotes de redeO estabelecimento de conexão TCP é feito com um aperto de mão de três vias. Durante o aperto de mão de três vias, o cliente envia primeiro um pacote com o sinalizador Syn para o servidor, indicando que deseja estabelecer uma conexão. Depois de receber a solicitação do cliente, o servidor responde um pacote com sinalizadores Syn e ACK ao cliente, indicando que a solicitação de conexão é aceita e envia seu próprio número de sequência inicial. Por fim, o cliente responde com um sinalizador ACK ao servidor para indicar que a conexão foi estabelecida com sucesso. Assim, as duas partes estão no estado estabelecido e podem começar a enviar dados um para o outro.
Em geral, o processo de handshake de três vias para o estabelecimento de conexão TCP foi projetado para garantir a estabilidade e a confiabilidade da conexão, evitar confusão e desperdício de recursos sobre conexões históricas e garantir que ambas as partes possam receber e enviar dados.
Hora de postagem: Jan-08-2025