Eu estudei pela primeira vez as comunicações. Após a formatura, meus colegas de classe seguiram maneiras separadas de perseguir seus sonhos e viajaram entre canteiros de obras de todos os tamanhos. Haha, apenas brincando, também existem pessoas incríveis que entraram em um certo instituto de pesquisa, hein? Seu pai não é o diretor, então ele não deve estar muito escuro por dentro. Lembro que havia um curso de alto nível chamado Rede de Computadores (provavelmente esse nome). Há um conceito sobre aperto de mão e agora revise -o.
Vamos dar uma olhada no esquema primeiro:
O TCP é orientado para a conexão. Independentemente da direção a outra parte envia dados, uma conexão deve ser estabelecida entre as duas partes. No protocolo TCP/IP, o protocolo TCP fornece serviços de conexão confiáveis e a conexão é inicializada por meio de três apertos de mão. O objetivo do aperto de mão de três vias é sincronizar o número de série e o número de confirmação de ambas as partes e trocar informações de tamanho de janela TCP.
1. Primeiro aperto de mão: estabeleça uma conexão. O cliente envia um segmento de mensagem de solicitação de conexão, define a posição SYN como 1 e o número da sequência é x; Em seguida, o cliente entra no estado syn_send e aguarda o servidor confirmar;
2. Segundo aperto de mão: o servidor recebe o segmento de mensagem SYN. Quando o servidor recebe o segmento de mensagem SYN do cliente, ele precisa confirmar o segmento de mensagem SYN e definir o número de reconhecimento como x+1 (número de sequência+1); Ao mesmo tempo, ele também precisa enviar as informações de solicitação SYN, definir a posição SYN como 1 e o número da sequência como y; O servidor coloca todas as informações acima em um segmento de pacotes (ou seja, o segmento de mensagens Syn+ACK) e o envia para o cliente juntos. No momento, o servidor entra no estado Syn_recv;
3. O terceiro aperto de mão: o cliente recebe o segmento de pacotes Syn+ACK do servidor. Em seguida, defina o número de reconhecimento como y+1 e envie um segmento de mensagem ACK para o servidor. Depois que o segmento de mensagens é enviado, o cliente e o servidor entram no estado estabelecido e preenchem o aperto de mão três vezes do TCP.
Depois de concluir três apertos de mão, o cliente e o servidor podem começar a transmitir dados. O exposto acima é a introdução geral ao tricô de mão três vezes do TCP.
E essas quatro ondas?
Depois que o cliente e o servidor estabelecem uma conexão TCP através de três apertos de mão, quando a transmissão de dados é concluída, a conexão TCP deve ser desconectada. Depois, há uma misteriosa "quatro ondas" aqui para a desconexão do TCP.
1. A primeira onda: Host 1 (pode ser usada como cliente ou servidor), defina o número da sequência e o número de reconhecimento e envie um segmento de mensagem FIN para o host 2; No momento, o host 1 entra no estado fin_wait_1; Isso significa que o host 1 não tem dados a serem enviados ao host 2;
2. A segunda onda: o host 2 recebeu o segmento de mensagem FIN enviado pelo Host 1 e retornou um segmento de mensagem ACK ao host 1. O número de reconhecimento é o número da sequência mais 1; Host 1 entra no estado fin_wait_2; O host 2 diz ao Host 1 que não tenho dados para enviar, para que eu possa fechar a conexão;
3. A terceira onda: o host 2 envia um segmento de mensagem FIN para o host 1, solicitando fechar a conexão e, ao mesmo tempo, o host 2 entra no estado close_wait;
4. A quarta onda: o host 1 recebe o segmento de mensagens da FIN enviado pelo Host 2, envia o segmento de mensagens ACK para o host 2 e, em seguida, o host 1 entra no estado time_wait; Depois que o host 2 recebe o segmento de mensagens ACK do host 1, ele fecha a conexão; No momento, o host 1 ainda não recebe uma resposta depois de esperar por 2msl, prova que o lado do servidor foi fechado normalmente, por isso tudo bem, o host 1 também pode fechar a conexão.
Nesse ponto, as quatro ondas do TCP foram concluídas felizes. Quando você vê isso, você terá muitas perguntas em sua mente, muitas não entendem, e parece confuso; Tudo bem, vamos continuar resumindo.
Por que você precisa apertar as mãos três vezes?
O chamado aperto de mão de três vias significa estabelecer uma conexão TCP, o que significa que, ao estabelecer uma conexão TCP, o cliente e o servidor precisam enviar um total de 3 pacotes para confirmar o estabelecimento da conexão. Na programação do soquete, esse processo é acionado pelo cliente em execução Connect.
Desde que resumimos os três apertos de mão do TCP, por que temos que fazer três vezes? Por que achamos que podemos concluí -lo em duas vezes? Então, por que o TCP tem que fazer três conexões? Foi o que Xie Xiren disse em "Rede de computadores":
Para impedir que o segmento de solicitação de conexão com falha seja repentinamente transmitido ao servidor, ocorre um erro.
No livro, um exemplo é dado da seguinte forma:
A geração de "segmento de solicitação de conexão com falha" está nesse caso: o primeiro segmento de solicitação de conexão enviado pelo cliente não é perdido.
Em vez disso, ele permanece em um determinado nó de rede por um longo tempo, resultando em atrasos até um certo tempo após a liberação da conexão antes de chegar ao servidor. Isso era originalmente um
Há muito tempo, falhou o segmento de mensagens. No entanto, depois que o servidor recebeu este segmento de mensagem de solicitação de conexão inválida, ele pensou erroneamente que era um novo enviado pelo cliente novamente
solicitação de conexão. Portanto, o segmento de reconhecimento foi enviado ao cliente e concordou em estabelecer a conexão. Supondo que "aperto de mão três vezes" não seja adotado, apenas o servidor
Emitir uma confirmação e a nova conexão é estabelecida. Como o cliente não emitiu uma solicitação para estabelecer uma conexão, a confirmação do servidor não será ignorada.
Nenhum dados será enviado ao servidor também. Mas o servidor achou que a nova conexão de transporte havia sido estabelecida e estava esperando o cliente enviar dados. então,
Muitos dos recursos do servidor são desperdiçados. O fenômeno acima pode ser impedido de acontecer usando o "aperto de mão três vezes". Por exemplo, a situação agora,
O cliente não emitirá reconhecimento ao reconhecimento do servidor. Como o servidor não pode receber a confirmação, sabe que o cliente não exige que a conexão seja estabelecida. "
Isso é muito claro, o que impede que o servidor espera e desperdiçando recursos.
Por que você tem que acenar quatro vezes?
Por que você acena quatro vezes?
O chamado Hand de Wave de quatro vias é encerrar a conexão TCP, o que significa que, quando uma conexão TCP está desconectada, o cliente e o servidor precisam enviar um total de 4 pacotes para confirmar a desconexão da conexão. Na programação do soquete, esse processo é acionado pelo cliente ou pelo servidor executando o fechamento.
O protocolo TCP é um protocolo de comunicação de camada de transporte baseado em fluxo de fluxo de fluxo de conexão. O TCP é o modo duplex completo, o que significa que, quando o host 1 envia um segmento de fin, isso significa apenas que o host 1 não tem dados a serem enviados. O host 1 diz ao Host 2 que seus dados foram enviados; No entanto, neste momento, o host 1 ainda pode aceitar dados do host 2; Quando o host 2 retorna o segmento ACK, significa que ele já sabe que o host 1 não tem dados a serem enviados, mas o host 2 ainda pode enviar dados para o host 1; Quando o host 2 também envia um segmento de fin, isso significa que o host 2 não tem dados a serem enviados e dirá ao Host 1 que eu não tenho dados a serem enviados e, em seguida, o outro interromperá com prazer essa conexão TCP. Se você deseja entender corretamente o princípio de quatro ondas, precisa entender as mudanças no estado durante as quatro ondas.
Fin_wait_1: Este estado precisa ser explicado com cuidado. De fato, o verdadeiro significado dos estados FIN_WAIT_1 e FIN_WAIT_2 deve esperar a mensagem FIN da outra parte. A diferença entre esses dois estados é: o estado fin_wait_1 é realmente quando o soquete está no estado estabelecido, ele deseja fechar ativamente a conexão e enviar uma mensagem de barbatana para a outra parte. Neste momento, o soquete entra no estado fin_wait_1. Quando a outra parte responde à mensagem ACK, ela entra no estado FIN_WAIT_2. Obviamente, em circunstâncias normais reais, independentemente da outra parte, a mensagem da ACK deve ser respondida imediatamente à mensagem da ACK. Portanto, o estado fin_wait_1 geralmente é difícil de ver, e o estado fin_wait_2 geralmente pode ser visto com o netstat. (Parte ativa)
Fin_wait_2: Este estado foi explicado em detalhes acima. De fato, o soquete no estado fin_wait_2 significa semi-conexão, ou seja, uma parte requer uma conexão estreita, mas também diz à outra parte que tenho alguns dados a serem transmitidos a você (informações da ACK) por enquanto e depois fechar a conexão mais tarde. (Parte ativa)
Close_wait: O significado desse estado é realmente estar esperando para fechar. Como entender? Quando a outra parte fecha um soquete e envia uma mensagem FIN para si mesmo, seu sistema, sem dúvida, responderá a uma mensagem ACK à outra parte e, em seguida, ele entrará no estado Close_wait. Em seguida, o que você realmente precisa considerar é verificar se você ainda tem dados para enviar para a outra parte. Caso contrário, você pode fechar o soquete e enviar mensagens de FIN para a outra parte, ou seja, fechar a conexão. Então, quando você está no estado close_wait, o que você precisa fazer é esperar que você feche a conexão. (Lado passivo)
Last_ack: Este estado é relativamente fácil de entender. Ele fecha passivamente a mensagem ACK da outra parte depois de enviar a mensagem FIN. Depois de receber a mensagem da ACK, você pode inserir o estado disponível do fechamento. (Lado passivo)
Time_wait: Isso significa que a mensagem FIN da outra parte foi recebida e a mensagem ACK foi enviada. Apenas espere que o 2MSL retorne ao estado disponível de fechado. Se no estado do Finwait1, ao receber uma mensagem com a outra parte com a bandeira do FIN e o sinalizador ACK, você poderá inserir diretamente o estado time_wait sem passar pelo estado FIN_WAIT_2. (Parte ativa)
Fechado: indica que a conexão é interrompida.
Resumir
O exposto acima é o conteúdo inteiro deste artigo sobre o princípio e a análise de processo de três apertos de mão e quatro apertos de mão no protocolo TCP/IP. Espero que seja útil para todos. Se houver alguma falha, deixe uma mensagem e aguarde suas opiniões valiosas.