Home Comunidade Eventos YouTube Networks Desafios // produtos Academy News CTI | CVE Contato

01 - Socket (IP + Porta)

video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione video: https://youtu.be/... no frontmatter da nota.

Socket (IP + Porta) - A Abstração Fundamental de Comunicação

1. Definição e Contexto

Um Socket (frequentemente traduzido como "soquete", mas mantido como "socket" na maioria da literatura técnica) é o ponto de extremidade (endpoint) de uma comunicação bidirecional entre dois programas de rede rodando em uma rede de computadores. Na arquitetura TCP/IP, o socket é a abstração fundamental que combina o endereçamento de hardware (Camada de Rede) com o endereçamento de software (Camada de Transporte).

Formalmente, um socket é identificado pela tupla: {Endereço IP, Número de Porta}.

Essa combinação é o que permite à internet transformar um sinal elétrico em um dado entregue a um aplicativo específico. Enquanto o IP diz "a qual casa ir", o Socket diz "em qual porta bater".

Características Formais

  • Modelo: Berkeley Sockets API (1983, BSD 4.2)
  • RFC de referência: RFC 147 (1969), RFC 793 (TCP, 1981)
  • Camada OSI: Entre camada 4 e 5
  • Implementação: Parte do kernel do sistema operacional

2. A Definição Matemática do Socket

Na sua essência, um socket resolve a limitação do endereço IP ao adicionar granularidade.

O Problema do Apenas IP

O endereço IP (ex: 192.168.1.5) identifica uma interface de rede em um host específico. No entanto, esse host pode ter múltiplos processos (navegador, cliente de e-mail, servidor de banco de dados) todos desejando usar a rede simultaneamente. O IP sozinho não consegue distinguir para qual desses processos os dados são destinados.

A Solução (IP + Porta)

  • IP: Identifica o Host (o computador).
  • Porta: Identifica o Processo (a aplicação) dentro daquele host.
  • Identificador Único: O Socket é o identificador único global que permite que um fluxo de dados encontre seu caminho exato desde um processo no computador A até um processo no computador B.

3. Analogia: O Edifício e o Apartamento

Para visualizar o conceito de Socket, podemos usar a analogia de um grande edifício de apartamentos:

  • Endereço IP: É o endereço postal do prédio (ex: "Av. Paulista, 1000"). Isso garante que o carteiro (roteador) chegue ao local correto.
  • Número da Porta: É o número do apartamento dentro desse prédio (ex: "Apto 305").
  • O Socket: É o par completo "Av. Paulista, 1000, Apto 305". Sem o número do apartamento, a carta seria entregue no prédio, mas o zelador não saberia a quem entregá-la.

Sem o Socket (IP + Porta), a internet funcionaria como um sistema de som público onde todos dentro de uma casa ouviriam todas as mensagens destinadas a qualquer um. Com o Socket, a comunicação é privada e direcionada.

4. A Estrutura do Socket na Camada de Transporte

Na Camada de Transporte, o socket é a entidade que realiza a multiplexação e desmultiplexação.

Criação (Bind)

Quando uma aplicação (como um servidor Web) quer receber dados, ela pede ao sistema operacional para criar um socket. O sistema operacional vincula (bind) um número de porta específico (ex: 80) a esse socket e o associa ao endereço IP da máquina.

Tabela de Sockets

O sistema operacional mantém uma tabela interna de sockets ativos. Cada entrada contém:

  • Endereço IP local
  • Porta local
  • Endereço IP remoto (para conexões estabelecidas)
  • Porta remota (para conexões estabelecidas)
  • Protocolo (TCP/UDP)
  • Estado (LISTEN, ESTABLISHED, etc.)
  • Buffer de recepção e envio

Entrega (Desmultiplexação)

Quando um datagrama IP chega, a Camada de Transporte lê o cabeçalho TCP/UDP, extrai o número da porta de destino e procura na tabela: "Existe algum socket aberto nesta porta?". Se sim, os dados são copiados para o buffer de memória desse socket. A aplicação então lê os dados desse buffer.

5. Socket Pair e a Identificação de Conexão (TCP)

No contexto do protocolo TCP (orientado a conexão), uma única conexão é identificada não por um socket, mas por um Par de Sockets (Socket Pair).

O Socket Pair é uma tupla de 5 elementos que identifica univocamente uma conexão na internet:

  1. IP de Origem
  2. Porta de Origem
  3. Protocolo (TCP ou UDP)
  4. IP de Destino
  5. Porta de Destino

Exemplo de Socket Pair

Cliente: 192.168.1.100:54321 (porta efêmera)
Servidor: 142.250.189.4:443 (HTTPS)

Socket Pair = (192.168.1.100, 54321, TCP, 142.250.189.4, 443)

Essa distinção é crucial para suportar múltiplas conexões simultâneas. Por exemplo, quando você abre várias abas no seu navegador para acessar o mesmo site (ex: www.google.com):

  • O IP de Destino e Porta de Destino são os mesmos para todas as abas (IP do Google, Porta 443).
  • O IP de Origem é o mesmo (seu computador).
  • O Socket Pair é diferente porque o seu sistema operacional atribui uma Porta de Origem diferente (efêmera) para cada aba.
  • Portanto, o sistema operacional sabe exatamente quais dados pertencem à aba 1 e quais pertencem à aba 2, baseando-se na Porta de Origem do Socket Pair.

6. Socket na Programação (API)

Para o desenvolvedor de software, o Socket é uma "porta" abstrata que pode ser lida e escrita como se fosse um arquivo de disco.

Abstração de Arquivo

Em sistemas operacionais tipo Unix (Linux, macOS), a filosofia é "tudo é um arquivo". Um socket aberto é representado por um descritor de arquivo (file descriptor, um número inteiro).

Operações Principais

A aplicação usa chamadas de sistema (system calls) como socket(), bind(), listen(), connect(), send() e recv().

// Exemplo de servidor TCP em C (simplificado)
int sockfd = socket(AF_INET, SOCK_STREAM, 0);

struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(8080);

bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));
listen(sockfd, 5);

int clientfd = accept(sockfd, NULL, NULL);
char buffer[1024];
recv(clientfd, buffer, sizeof(buffer), 0);

Transparência

O programador escreve dados no socket usando send(), e o sistema operacional cuida de encapsular isso em segmentos TCP/UDP, adicionar cabeçalhos IP, calcular checksums e transmitir pela placa de rede. O programador não precisa conhecer os detalhes físicos da transmissão; ele interage apenas com o Socket.

7. Tipos de Sockets

Tipo Constante Uso
Stream SOCK_STREAM TCP - fluxo confiável
Datagram SOCK_DGRAM UDP - datagramas não confiáveis
Raw SOCK_RAW Acesso direto ao IP (scanners, sniffers)
Sequenced Packet SOCK_SEQPACKET SCTP - mensagens confiáveis
Raw com IP Header SOCK_RAW + IP_HDRINCL Construindo IP do zero

8. Estados de um Socket TCP

CLOSED -> SYN_SENT -> ESTABLISHED -> FIN_WAIT_1 -> FIN_WAIT_2 -> TIME_WAIT -> CLOSED
                  ^
                  |
LISTEN -> SYN_RECEIVED -> ESTABLISHED -> CLOSE_WAIT -> LAST_ACK -> CLOSED
Estado Descrição
LISTEN Servidor aguardando conexões
SYN_SENT Cliente enviou SYN, aguarda SYN-ACK
SYN_RECEIVED Servidor recebeu SYN, enviou SYN-ACK
ESTABLISHED Conexão ativa, dados podem fluir
FIN_WAIT_1 Lado enviou FIN, aguarda ACK
FIN_WAIT_2 Lado recebeu ACK do FIN, aguarda FIN remoto
CLOSE_WAIT Lado recebeu FIN, aguarda aplicação fechar
LAST_ACK Lado enviou FIN após receber FIN
TIME_WAIT Aguarda 2×MSL antes de fechar (evita pacotes atrasados)

9. Comandos Práticos para Inspeção

# Listar todos os sockets TCP/UDP no Linux
ss -tulnp

# Ver conexões estabelecidas
ss -t state established

# Verificar socket específico (similar ao antigo netstat)
netstat -tunlp

# Ver processos que abriram sockets
lsof -i :443

Exemplo de Saída do ss -t state established

Recv-Q Send-Q Local Address:Port  Peer Address:Port   Process
0      0      192.168.1.5:54321  142.250.189.4:443  users:(("chrome",pid=1234,fd=45))
0      0      192.168.1.5:54322  151.101.1.69:443   users:(("firefox",pid=5678,fd=12))

10. Resumo Técnico

Atributo Valor
Definição Tupla (IP, Porta)
Socket Pair (IP_src, Port_src, Proto, IP_dst, Port_dst)
API original Berkeley Sockets (1983)
Camada OSI Entre 4 e 5
Tipos comuns SOCK_STREAM, SOCK_DGRAM, SOCK_RAW
Implementação Kernel do SO

11. Conclusão

Em resumo, o Socket (IP + Porta) é o mecanismo que une a localização física (Rede) com a execução lógica (Processo), tornando possível a comunicação direta e concorrente entre aplicações em uma rede global complexa. Para desenvolvedores, administradores de sistemas e engenheiros de rede, dominar o conceito de socket é pré-requisito para qualquer trabalho sério em redes, desde análise de tráfego até desenvolvimento de aplicações distribuídas e troubleshooting avançado de conexões.