Soquete TCP e UDP: para que servem e diferenças com as portas

Quando dois hosts (computadores, smartphones ou qualquer dispositivo conectado à rede) precisam se comunicar entre si, é necessário que eles abram um socket TCP ou UDP para permitir a comunicação através do IP correspondente (público ou privado) e também do portos. Todas as comunicações entre dois ou mais hosts são realizadas no nível da camada de transporte, pois é a primeira camada onde há uma comunicação ponto a ponto entre dois ou mais computadores, e aqui poderíamos usar o protocolo TCP ou o protocolo UDP . Hoje, neste artigo, vamos explicar tudo sobre o que é um soquete e quais diferenças existem com as portas típicas do roteador.

O que é um soquete e para que serve?

Soquete TCP e UDP

Quando dois processos que estão em hosts diferentes precisam trocar informações pela rede, seja a rede local ou a Internet, eles precisam abrir um soquete para estabelecer comunicação e também trocar quaisquer fluxos de dados. Geralmente, o fluxo de dados é feito de forma confiável e ordenada, porém, dependemos se os processos estão utilizando o protocolo TCP ou o protocolo UDP, a seguir, explicamos brevemente as principais características de ambos os protocolos:

  • O protocolo TCP é um protocolo da camada de transporte que é orientado à conexão, isto significa que antes de trocar os dados reais existe um passo prévio para estabelecer uma comunicação. Este protocolo também garante que toda transmissão de dados seja feita sem erros, o próprio TCP é responsável por reenviar os dados novamente caso o receptor não os receba a tempo ou os receba danificados, além disso, também garante o pedido, pelo que fazemos certeza de que os processos receberão todos os dados na ordem de sua origem.

  • No caso do protocolo UDP, ele não é orientado à conexão, não há etapa anterior na comunicação, mas os dados são enviados diretamente. Este protocolo não garante que a transmissão seja realizada sem erros, embora faça todo o possível para que o faça, e também não garante a ordem dos datagramas que a origem envia ao destino. A parte positiva do UDP é que ele possui um cabeçalho muito pequeno e é muito rápido, pois não há fase de estabelecimento da conexão.

Para que dois processos possam se comunicar entre si, é necessário que um processo seja capaz de localizar o outro e que ambos os processos possam trocar informações pela rede. Claro, estamos usando uma arquitetura cliente-servidor, então um dos dois processos deve iniciar a comunicação. Para que dois processos se comuniquem, precisamos ter um socket.

Um socket, independentemente de usarmos o protocolo TCP ou o protocolo UDP, é definido pelos seguintes parâmetros:

  • Protocolo da camada de transporte usado: TCP ou UDP
  • Endereço IP de origem: pode ser um IP público ou privado.
  • Endereço IP de destino: pode ser um IP público ou privado.
  • Porta de origem ou local: esta porta geralmente está entre as portas 49152 a 65535, são chamadas de portas dinâmicas ou privadas. Mas não precisa ser assim, você pode usar qualquer porta de origem, por exemplo, um servidor web que usa a porta 443 para conexões HTTPS usará a porta de origem 443 para conexões.
  • Porta de destino ou remota: esta porta pode ser qualquer porta, é necessário que o outro processo ou host esteja escutando esta porta.

Graças a todos esses parâmetros, podemos tornar única cada uma das conexões, desta forma, tanto a origem quanto o destino podem identificar perfeitamente a conexão e iniciar a troca de dados.

Quantos soquetes você pode ter em uma equipe?

Para cada uma das ligações que fazemos fora do nosso equipamento necessitamos de uma tomada para podermos trocar informação entre os diferentes processos. Em um determinado computador, podemos ter um grande número de soquetes abertos, embora isso dependa tanto do hardware do computador quanto do sistema operacional, pois é o sistema operacional que se encarregará de gerenciar todos os soquetes (criar e excluí-los). Quando abrimos um novo socket, ele deve ser único para identificar a conexão de forma única.

No caso de servidores web, cada uma das conexões de cliente é definida por um socket, por exemplo, imagine que um total de três clientes se conectem ao nosso servidor web, cada socket será diferente, além disso, dependendo se olharmos o status de a conexão em nosso computador local ou remoto, o par de IP e portas mudará da origem para o destino e vice-versa.

No exemplo a seguir, podemos ver os sockets criados em um servidor web, olhando esses sockets do próprio servidor web.

  • 1 usuário
  • Protocolo: TCP.
  • IP de origem: 77.77.77.77 (o cliente).
  • IP de destino: 88.88.88.88 (nos).
  • Origem ou porta local: 49152 (o cliente).
  • Destino ou porta remota: 443 (usamos HTTPS).

No caso do segundo usuário, teríamos:

  • 2 usuário
  • Protocolo: TCP.
  • IP de origem: 71.71.71.71 (o cliente).
  • IP de destino: 88.88.88.88 (nos).
  • Origem ou porta local: 49152 (o cliente).
  • Destino ou porta remota: 443 (usamos HTTPS).

Nesse caso, apenas o IP de origem foi alterado, mas assim que um dos quatro parâmetros for alterado, já temos um novo soquete que nos permite identificar a conexão de forma exclusiva. Esse cliente ainda pode usar a porta de origem 49152 como a primeira, mas o IP de origem será diferente. Assim que um dos quatro parâmetros muda, já estamos em outro processo totalmente diferente e não há problema em identificá-lo corretamente.

Como ver todos os soquetes no sistema

In Windows sistemas operacionais podemos ver todos os soquetes do sistema que estão abertos, simplesmente executando o seguinte comando no prompt de comando com permissões de administrador:

netstat

Na imagem a seguir você pode ver o protocolo TCP, o endereço local que é formado por IP:PORT e também o endereço remoto que é formado por IP:PORT. Por fim, também indica o status da conexão.

In Linux sistemas operacionais também existe o netstat, ou melhor, existia, porque agora é considerado “obsoleto”. O substituto é o comando “ss” que tem as mesmas funcionalidades mas nos permite mais opções de exibição. Se você estiver usando um sistema operacional baseado em Linux, poderá executar o seguinte comando para ver todos os soquetes:

ss

Agora que vimos o que é um soquete, vamos ver como ele difere das portas.

Qual é a diferença com as portas

Um soquete TCP ou UDP é frequentemente confundido com portas TCP ou UDP. Um soquete, como dissemos antes, é composto pelo protocolo da camada de transporte, o endereço IP de origem e destino, bem como as portas de origem e destino. As “portas” são apenas uma parte do socket, uma parte fundamental mas apenas uma parte, para formar um socket também é necessário ter os endereços IP correspondentes para que haja comunicação ponto-a-ponto entre dois processos.

Quando abrimos uma porta no roteador, o que estamos realmente fazendo é permitir a comunicação de fora (Internet) para dentro da rede local, passando pelo NAT que todos os roteadores possuem para o protocolo IPv4. Quando estivermos em um ambiente NAT, o roteador se encarregará de traduzir os endereços IP privados para os públicos, a fim de direcionar corretamente todo o tráfego para a Internet.

Caso algum cliente dentro do NAT deseje se comunicar com um servidor web que esteja na Internet, o socket que este cliente local irá criar será algo assim:

  • Protocolo: TCP.
  • IP de origem: 192.168.1.2 (nos).
  • IP de destino: 88.88.88.88 (o servidor web).
  • Origem ou porto local: 49152 (nos).
  • Destino ou porta remota: 443 (servidor web).

O roteador então pegará essa conexão e a traduzirá para o seguinte, para que possa ser roteado pela Internet, criando um novo soquete entre o roteador e o servidor web remoto:

  • Protocolo: TCP.
  • IP de origem: 20.20.20.20 (nosso IP público).
  • IP de destino: 88.88.88.88 (o servidor web).
  • Origem ou porto local: 49152 (nos).
  • Destino ou porta remota: 443 (servidor web).

Caso a comunicação seja inversa (de fora do NAT para dentro do NAT), é quando devemos abrir uma porta em nosso roteador para que o servidor possa ser acessado de fora, caso contrário, o firewall do roteador interromperá toda a comunicação.