Sendo curto, grosso e teórico: Handshake é basicamente um processo de coordenação e negociação entre dois dispositivos pra iniciar ou concluir a comunicação entre eles.
Inicialmente temos 2 tipos principais de handshake:
Three-Way Handshake
É o processo designado pela RFC 793 para estabelecer conexões TCP.
Pra simplificar: Esse processo é bem similar a um processo que todos nós conhecemos bem, principalmente após o ano de 2020.
Videoconferência é iniciada:
- Oi, bom dia. Você consegue me ouvir?
- Bom dia, consigo te ouvir sim. Meu áudio está ok?
- Sim, consigo te ouvir claramente.
Ou seja, é um processo que confirma se ambos os lados da conversa conseguem se comunicar de forma apropriada.
Dado que uma das características do protocolo TCP é a confiabilidade, antes que a comunicação entre os hosts tenha início e a transferência de dados comece, ele utiliza o handshake a fim de confirmar as condições necessárias para estabelecer a conexão. Antes mesmo que qualquer dado seja trocado entre cliente e servidor, deve ser estabelecida uma conexão de confiança entre eles.
Como o nome indica, um three-way handshake ocorre em 3 etapas, todas envolvendo trocas de pacotes de dados entre cliente e servidor. Ao estabelecer uma conexão, o cliente e o servidor devem sincronizar os números de sequência entre si.
Você deve achar esse processo bem semelhante à confirmação de um token em um app de 2FA (não utilize SMS pra isso, sempre use um app como o Authy) ou até mesmo um site de banco.
Isso ocorre basicamente desta forma:
O cliente toma a iniciativa e inicia a conexão com o servidor. Nesse primeiro contato ele "propõe" a forma de comunicação que vai ser utilizada na "conversa"(em suma: a ordem de envio dos pacotes de dados).
O servidor responde ao cliente confirmando o recebimento da primeira mensagem e concordando com a ordem de envio dos pacotes.
O cliente, por sua vez, também confirma que recebeu a mensagem do servidor e inicia a comunicação.
Flags
Conexões TCP utilizam bits de controle inseridos no cabeçalho do pacote, nesse caso chamados de flags, para estabelecer os protocolos da transmissão de dados.
ACK: A principal função dessa flag é confirmar a recepção do pacote no destino. Como eu havia dito logo ali em cima, uma das características do protocolo TCP é a confiabilidade. O emissor do pacote precisa receber a confirmação de que o pacote chegou ao lugar desejado e que não há a necessidade de retransmitir o mesmo pacote.
ISN (Número de sequência inicial) : Não é uma flag, mas uma sequência única de números que identificam cada pacote.
SYN: Ok, já sabemos como confirmar o recebimento dos pacotes e como identificá-los. Resta agora ordená-los numa sequência que será usada pelos hosts. A flag SYN diz respeito a isso, à sincronização desses números sequenciais dos pacotes. Como os hosts devem concordar na ordem desses números sequenciais, a flag tem essa função de estabelecer a ordem do envio durante a comunicação. A ordem desses números não é padrão ou pré-definida por questões de segurança. Afinal, ao saber a ordem dos números sequenciais, um invasor poderia forjar um desses números.
Sabendo disso, podemos entender esse processo com mais detalhes agora:
O cliente envia uma solicitação ao servidor pedindo a sincronização de seus os números de sequência. Um pacote que possui a flag SYN ativada é enviado especificando seu número de sequência inicial (ISN).
O servidor envia também sua solicitação ao cliente para sincronização de seus números de sequência (com as flags SYN e ACK ativadas), enquanto reconhece e confirma o recebimento da solicitação enviando o número de sequência do cliente incrementado por um (ISN + 1).
O cliente confirma o recebimento enviando um novo pacote com a flag ACK e o número de sequência do servidor também incrementado por um (ISN + 1).
Usando o Wireshark, conseguimos ver o processo acontecendo em sequência:
Logo após essa troca de pacotes, o servidor deve receber uma requisição HTTP e a "conversa" é iniciada.
Four-Way Handshake
Ok, já vimos como é o processo de início da conexão dos hosts. O processo de finalização não é tão diferente (inclusive, é descrito pela mesma RFC do handshake de 3 vias, mas numa página diferente). Dessa vez, ao invés de 3 segmentos de dados, serão trocados 4 segmentos entre os hosts, justificando o nome " 4-way handshake".
Simplificando, o processo acontece da seguinte forma:
O cliente não tem mais dados para enviar. Por este motivo, decide encerrar a conexão e envia um pacote, comunicando essa decisão ao servidor.
Servidor recebe o pacote. Confirma o recebimento deste pacote enviando também um pacote ao cliente.
O servidor envia um segundo pacote afirmando que não há nada mais dados para enviar e que também encerrará a conexão.
O cliente responde com um novo pacote, confirmando o recebimento dos pacotes anteriores e encerrando a conexão de fato.
Flag FIN
FIN: Nesse tipo de handshake é utlizada a flag FIN. Por ser uma flag de finalização, o nome deriva do termo "Finished" (finalizado/ concluído). Após a conclusão da transferência de dados, cliente e servidor encerram a conexão usando essa flag.
Revendo o processo do handshake, agora com as flags:
O cliente, ao iniciar o encerramento da conexão, envia um segmento com a flag FIN ativada (bit 1) + o ISN. A flag ACK também está contida no segmento, porém não está ativada (bit 0).
Ao receber a solicitação de encerramento da conexão, o servidor envia um pacote com a flag ACK ativada, mostrando recebeu a requisição. O "Acknowledgement number" é igual ao ISN recebido acrescido por 1 (ISN + 1).
O servidor envia um novo segmento ao cliente, dessa vez com a flag FIN ativada e um novo ISN, para encerrar a conexão. Após esse envio a conexão é encerrada no lado do servidor.
O cliente recebe a flag FIN do servidor, ativa a flag ACK com o Acknowledgement number igual ao ISN recebido mais 1 (ISN +1) e envia o último pacote. Ao concluir esse passo a conexão é encerrada também no lado do cliente.
Top comments (0)