Aperto de mão tridirecional TCP.
O primeiro handshake: Quando a conexão é estabelecida, o cliente envia um pacote syn ( syn=j) para o servidor e entra no estado SYN_SENT , aguardando a confirmação do servidor;
syn: Sincronizar Números de Sequência ( Sincronizar Números de Sequência )
O segundo handshake: O servidor recebe o pacote syn enviado pelo cliente , e deve confirmar o ACK do cliente (ack=j+1) e, ao mesmo tempo, também envia um pacote SYN ( seq=k ), ou seja, o pacote SYN+ACK Neste momento, o servidor Entra no estado SYN_RECV ;
seq: (sequência)
ack: confirme
O terceiro handshake: o cliente recebe o pacote SYN+ACK do servidor e envia um pacote de confirmação ACK (ack=k+1) para o servidor . Após o envio do pacote, o cliente e o servidor entram no ESTABLISHED (a conexão TCP foi bem-sucedida ) estado e completo três vezes apertar as mãos.
estabelecido: estabelecido com sucesso
************************************************** ************************************************** ***************
Por que três vezes e não duas?
Então devemos entender uma coisa, qual problema o aperto de mão deve resolver?
O problema a ser resolvido pelo handshake na verdade é: espero que o servidor abra apenas uma conexão para o cliente usar. Dois apertos de mão não são necessariamente malsucedidos
Suponha que a envie uma carta para b (pela primeira vez).
b recebe a carta e escreve novamente para dizer a a que a recebeu! (a segunda vez)
Neste momento, a não escreveu para b novamente (sem terceira vez).
Superficialmente, a comunicação entre a e b foi bem-sucedida, mas na verdade existem duas possibilidades aqui:
1. A não tem letra para b.
2. a pode receber carta de b.
Aqui reside o problema, supondo que haja apenas dois apertos de mão
a envia uma carta para b, e b escreve para a novamente após receber a carta (os dois apertos de mão são concluídos).
No entanto, quando a carta de b é enviada para a, a carta é perdida (a rede de b para a não está disponível).
Neste momento, se a não receber a carta, pensará que a carta não foi enviada para b. (Como é um aperto de mão bidirecional, b neste momento apenas assume que a recebeu o pacote)
O estado de b neste momento é que um canal foi aberto, esperando que a escreva novamente.
O estado de a neste momento é que, como nenhuma resposta foi recebida, a carta é reenviada para b. (Na verdade, se a receber o pacote, os dois handshakes também estabelecem a conexão com sucesso)
Então b abrirá um novo canal após receber a carta e esperará que a envie a carta, repetindo o ciclo, o que causa um desperdício de recursos de rede! ! !
Não existe esse problema após o aperto de mão de 3 vias?
O handshake de 3 vias foi bem-sucedido, o que prova que a rede de a para b e b para a está conectada. a envia informações para b, há um período de tempo limite neste momento, se as informações de b não puderem ser enviadas para a (vai expirar neste momento), então a reenviará uma nova solicitação logicamente, até que b receba as informações e as retorne para um.
Por que não enviar a mensagem de texto diretamente durante o aperto de mão, porque se a rede for desconectada e o texto for enviado para o servidor, o servidor ficará facilmente congestionado e desligará.
Resumo: O handshake de 3 vias é para reduzir o desperdício desnecessário de recursos devido à rede ou outros motivos (quando a não recebe o pacote de b)