Durante os primeiros anos da internet, o Internet Protocol (IP) era o único protocolo que as pessoas usavam para se conectar à internet. O problema com o IP era que você podia enviar uma mensagem e não ter certeza se o destinatário a receberia ou não. Por esta razão, o TCP/IP foi estabelecido.
O TCP/IP garante que todos os dados enviados cheguem ao destinatário. Ele faz isso fornecendo ao cliente e ao servidor uma conexão segura antes de enviar dados. Essa conexão segura é estabelecida por meio de um processo conhecido como handshake de três vias, também conhecido como handshake TCP/IP.
O que é um aperto de mão de três vias?
Um handshake de três vias (TCP/IP handshake) são as três primeiras interações entre um cliente e um servidor tentando estabelecer uma conexão TCP. Essas interações iniciais são essenciais para fazer uma conexão segura. Nesta fase, tanto o cliente quanto o servidor concordarão com os parâmetros que usarão para verificar e verificar os pacotes de dados de entrada e saída. Esses parâmetros estarão na forma de segmentos TCP.
O que é um segmento TCP?
Em uma conexão TCP/IP, todos os dados enviados devem ser cortados e estruturados no que é conhecido como segmentos TCP. Esses segmentos contêm informações como endereços IP, portas, bits de sinalização, números de sequência, números de confirmação e dados opcionais ou carga útil.
As três primeiras interações (handshake de três vias) conterão apenas cabeçalhos de segmento TCP sem carga útil ou dados anexados. Aqui está uma amostra de um segmento TCP
Observe que a ilustração acima é apenas para TCP. Um segmento TCP/IP completo requer tanto endereços IP do remetente e do destinatário no topo do segmento TCP acima.
Sempre que enviar uma encomenda a uma pessoa, o serviço de entregas exige que preencha um formulário de informação e, em seguida, anexe-o à encomenda antes do envio. Da mesma forma, o TCP exige que o remetente anexe um cabeçalho de segmento (formulário de informações) aos dados (pacote) antes de começar a enviar o segmento (pacote) ao destinatário.
Sempre que um cliente se comunica com um servidor, ambas as partes precisarão formatar suas interações na forma de um segmento TCP. Um segmento TCP compreende um cabeçalho de segmento TCP anexado aos dados que você está tentando enviar. O remetente terá que preencher as informações que o chefe do segmento requer.
Para um handshake de três vias, o remetente precisará preencher o seguinte:
- Porta de origem: Identifica a porta do remetente
- Porto de destino: Identifica a porta do receptor
- Número sequencial: Indica a sequência do segmento
- Número de confirmação: Significa que um segmento foi reconhecido adicionando um ao número de sequência fornecido
Além de preencher os campos do cabeçalho do segmento, o emissor também deve selecionar um bit sinalizador. Há seis bits de sinalização no total, mas para um handshake de três vias, você precisará apenas dos dois seguintes:
- SYN: Fornece um número de sequência. Esse número de sequência será usado para contar a sequência de todos os segmentos de entrada para o restante da interação.
- ACK: Indica que o destinatário do número SYN aceita a solicitação de conexão adicionando um (1) ao número SYN fornecido.
Agora que você sabe o que é um segmento TCP, vamos ver como ele é usado em um handshake de três vias.
Como funciona um aperto de mão de três vias
Um handshake de três vias é estabelecido quando o cliente e o host trocam informações e reconhecem os números de sequência um do outro. Como o nome indica, um handshake de três vias é feito em três etapas.
Primeiro, o cliente envia um segmento SYN puro indicando que deseja uma conexão. Em segundo lugar, o servidor responde com um segmento SYN-ACK, o que significa que ele reconheceu a solicitação e está enviando seu próprio número SYN para o cliente reconhecer. Terceiro, o cliente envia um segmento ACK ao servidor para notificá-lo de que o número SYN do servidor foi reconhecido e será usado para conexão adicional.
Um aperto de mão de três vias será algo assim:
Vamos detalhar e analisar os segmentos para que você saiba exatamente o que acontece quando cliente e servidor trocam e reconhecem números de sequência.
Etapa 1: o cliente envia um segmento SYN
O cliente envia uma solicitação de conexão enviando um segmento SYN para o servidor. O cliente usa o endereço IP do cliente para localizar o servidor e enviar o segmento TCP.
Para reduzir a complexidade do segmento, vamos ignorar alguns campos de segmento e nos concentrar nas necessidades básicas de uma conexão de handshake de três vias. Isso inclui porta de origem, porta de destino, número de sequência, número de confirmação e que tipo de bit sinalizador é usado.
E com isso, um segmento SYN/request deve ficar assim:
A porta do cliente é um número aleatório entre 49152 e 65536. Esse intervalo de portas é o intervalo acordado que os dispositivos públicos podem usar dinamicamente para se conectar à Internet. Os intervalos de porta de 1024 a 49151 são privados. Eles terão que ser registrados por uma entidade para usar uma porta dentro do intervalo especificado. Números de porta abaixo de 1024 são portas reservadas para várias funções e protocolos da Internet, como FTP (porta 20), SMTP (porta 25), DNS (porta 53) e HTTP (porta 80).
Na vida real, um número de sequência é um número aleatório. Para o exemplo, usamos 0000000000 para facilitar a visualização.
Anote o número de sequência à medida que avançamos nas etapas. Atualmente, é 000000000. No momento, não há número de confirmação, pois não há algo a ser confirmado.
Etapa 2: o servidor responde com um segmento SYN-ACK
Assim que o servidor receber um segmento SYN, ele responderá enviando um segmento ACK contendo o número de confirmação. O número de confirmação será o número de sequência do cliente mais um (1).
Olhe para a porta de origem. Mostra que o segmento é da porta 20, indicando que veio do servidor como resposta.
Agora, olhe para o número de confirmação. É 0000000001, que é o número de sequência do cliente (0000000000) mais um (1). É assim que um segmento é rastreado. Digamos que o cliente recebeu uma resposta de segmento ACK onde o número de confirmação é 0000000002. Isso indicaria ao cliente que o segmento 0000000001 estava faltando e que o cliente terá que esperar até que ele chegue para que você não sofra perda de pacotes.
Como você pode ver, dois bits de flag são ativados — SYN e ACK.
Além de reconhecer o número de sequência do cliente, o servidor também enviará seu próprio número de sequência para o cliente reconhecer o número de sequência do servidor mais um (1). Em nosso exemplo, usamos 1111111111 como o número de sequência do servidor. Novamente, no mundo real, esse número é aleatório.
Observe que os números de sequência do cliente e do servidor não precisam corresponder. Contanto que ambas as partes reconheçam o número de sequência exclusivo uma da outra, a conexão será confiável.
Etapa 3: respostas do cliente com um segmento ACK
Finalmente, o cliente reconhece o número de sequência do servidor.
O segmento final é um segmento ACK do cliente.
Como você pode, o cliente reconhecerá o número de sequência do servidor respondendo com o número de sequência do servidor (1111111111) mais um (1), que é 1111111112.
O cliente e o servidor não enviarão mais um número de sequência, pois o início da sequência já foi confirmado. No entanto, ambas as partes esperarão segmentos de confirmação com números de sequência contínuos mais um (1) e o número de bytes ao longo da interação. Nesse caso, o cliente espera que a próxima resposta do servidor tenha um ACK de 0000000002 (se não houver dados anexados).
Depois disso, o handshake de três vias é estabelecido!
Entendendo como funcionam as conexões de rede
Agora que você aprendeu como funciona um handshake de três vias, também terá mais facilidade para entender como o TCP funciona após o handshake. O cliente e o servidor começarão a enviar dados quando o handshake for estabelecido. Desta vez, o formato de segmento completo será usado, mais os dados opcionais ou a carga útil.
Os dados geralmente são segmentados/cortados em partes menores para facilitar as transferências. Cada segmento de dados tem seu próprio cabeçalho de segmento contendo um número de sequência e um número de confirmação. A razão para um número de sequência é conhecer a sequência dos segmentos quando eles eventualmente serão remontados. Os números de confirmação existem para verificar com o remetente se o segmento foi recebido e se corresponde à sequência de segmentos de entrada.
Contar um número de sequência e verificá-lo com um reconhecimento é como o TCP pode transportar de forma confiável grandes blocos de dados sem nenhum pacote de dados ausente.
E com isso, você deve ter uma boa ideia de como o TCP funciona.