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

02 - Conexão entre Processos

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

Conexão entre Processos (Process-to-Process Communication)

O conceito de Conexão entre Processos (do inglês Process-to-Process Communication) é a função primária que distingue a Camada de Transporte das camadas inferiores. Enquanto a Camada de Rede (IP) é responsável por entregar dados para um computador (host), a Camada de Transporte é responsável por entregar dados para um programa (processo) específico em execução naquele computador.

Uma "conexão" neste contexto refere-se a um canal de comunicação lógico estabelecido entre dois processos de aplicação, permitindo que eles troquem mensagens de forma estruturada. Na arquitetura TCP/IP, essa comunicação é realizada através de Sockets (Pontos de Comunicação) e é gerenciada por mecanismos de endereçamento e controle de fluxo.


1. A Necessidade do Endereçamento de Processo

Para entender a conexão entre processos, é preciso visualizar o problema que ela resolve:

  • O Endereço IP (Camada de Rede): Identifica a interface de rede do computador na rede global. Se um pacote chega ao IP 192.168.1.10, o computador o recebeu. Mas esse computador pode estar rodando um navegador web, um cliente de e-mail, um cliente de jogos e um servidor de arquivos simultaneamente.
  • A Ambiguidade: Sem um mecanismo adicional, o sistema operacional não saberia para qual desses programas entregar os dados recebidos. Todos os programas compartilham o mesmo acesso à placa de rede através do IP.

A conexão entre processos resolve isso adicionando um identificador secundário ao fluxo de dados: a Porta (16 bits, valores 0 a 65.535).

Anatomia de um Segmento de Transporte

| Endereço IP de Origem  | Endereço IP de Destino  |  (Camada 3 - IP)
| Porta de Origem        | Porta de Destino        |  (Camada 4 - TCP/UDP)
| Número de Sequência    | Acknowledgment Number   |  (TCP apenas)
| Dados da Aplicação     |                         |  (Payload)

2. Multiplexação e Desmultiplexação de Portas

A conexão entre processos é tecnicamente implementada através dos processos de multiplexação (no envio) e desmultiplexação (no recebimento).

  • Portas (Ports): São números inteiros de 16 bits (0 a 65.535) usados para identificar processos específicos.
  • Porta de Origem: Identifica o processo que enviou os dados no computador remetente.
  • Porta de Destino: Identifica o processo que deve receber os dados no computador destino.
  • Multiplexação (Envio): A Camada de Transporte do remetente pega dados de diferentes processos (ex: navegador, Spotify, SSH) e os encapsula em segmentos distintos, cada um marcado com o número de porta de destino apropriado. Vários fluxos compartilham o mesmo canal de rede (IP).
  • Desmultiplexação (Recebimento): A Camada de Transporte do destino lê a porta de destino no cabeçalho do segmento e entrega o payload para o buffer do processo que está "escutando" (aguardando) nessa porta específica.

Classificação das Portas (IANA)

Faixa Uso
0 - 1.023 Well-Known (serviços de sistema)
1.024 - 49.151 Registered (aplicações comerciais)
49.152 - 65.535 Dinâmicas/Efêmeras (clientes)

3. O Socket como Ponto de Extremidade

Na terminologia de redes, um Socket é o ponto final de uma conexão entre processos. Ele é a combinação de um endereço IP e um número de porta.

  • Estrutura do Socket: {Endereço IP, Número de Porta}.
  • Identificação Única de Conexão: Uma conexão de transporte estabelecida entre dois hosts é identificada univocamente por uma tupla de soquetes de 5 elementos:
  1. Protocolo de Transporte (TCP ou UDP)
  2. IP de Origem
  3. Porta de Origem
  4. IP de Destino
  5. Porta de Destino

Isso permite que múltiplas conexões simultâneas coexistam entre os mesmos dois computadores (ex: várias abas do mesmo site conectando ao mesmo servidor, usando portas de origem diferentes).

Exemplo de Tupla

Conexão 1: (TCP, 192.168.1.10:52431, 93.184.216.34:443)
Conexão 2: (TCP, 192.168.1.10:52432, 93.184.216.34:443)
Conexão 3: (TCP, 192.168.1.10:52433, 93.184.216.34:443)

Três conexões TCP distintas para o mesmo servidor HTTPS, diferenciadas apenas pela porta de origem. É assim que o navegador abre múltiplas conexões paralelas para acelerar o download de uma página.

4. O Modelo Cliente-Servidor na Conexão

A conexão entre processos geralmente segue o paradigma Cliente-Servidor, definindo papéis distintos para os processos durante o estabelecimento da conexão.

A. O Processo Servidor (Passive Open)

O servidor é o processo que fornece um serviço (como um servidor Web).

  • Escuta (Listening): O servidor inicia e fica em estado de escuta passiva. Ele se "amarra" (bind) a uma Porta Bem Conhecida (Well-Known Port), como a porta 80 para HTTP ou 22 para SSH.
  • Disponibilidade: Ele não conhece os clientes antecipadamente. Ele apenas espera que alguém tente conectar-se àquela porta específica.
  • Aceitação: Ao receber uma requisição, o servidor cria um novo socket (com nova porta efêmera ou reutilizando a porta listening, dependendo da implementação) para atender aquela conexão específica, deixando o socket listening livre para aceitar novas conexões.

B. O Processo Cliente (Active Open)

O cliente é o processo que solicita o serviço (como o navegador).

  • Iniciativa: O cliente inicia a conexão ativamente.
  • Porta Efêmera: O cliente se conecta à porta bem conhecida do servidor, mas usa uma Porta Efêmera (geralmente aleatória e alta, acima de 49.151) como sua porta de origem. Isso permite que o cliente execute múltiplas conexões simultâneas sem conflito.

5. Conexão Lógica (TCP) vs. Sem Conexão (UDP)

A natureza da "conexão" entre processos varia drasticamente dependendo do protocolo de transporte utilizado:

Conexão Lógica (TCP)

O TCP estabelece uma conexão lógica persistente entre os sockets.

  • Handshake (Três Vias): Os processos realizam uma negociação inicial (SYN, SYN-ACK, ACK) para sincronizar seus números de sequência e alocar buffers de memória (buffers de recepção e envio).
  • Estado: Ambas as partes mantêm informações de estado sobre a conexão (se está ativa, tamanho da janela, números de sequência). Se o cabo for desconectado temporariamente, os processos saberão porque a conexão falhará.
  • Fluxo Contínuo: Os dados fluem como um stream de bytes contínuo e confiável.
  • Encerramento: O TCP encerra a conexão com um Four-Way Handshake (FIN, ACK, FIN, ACK).

Sem Conexão (UDP)

O UDP oferece comunicação entre processos, mas não estabelece uma conexão.

  • Disparo de Mensagens: O processo cliente apenas envia um datagrama para o IP e Porta do servidor. Não há handshake, nem alocação de buffers de conexão, nem estado mantido entre os pacotes.
  • Independência: Cada mensagem é independente. Se o servidor cair e voltar, ele não "sabe" que perdeu mensagens anteriores, pois não há memória de estado de conexão.
  • Vantagem: Baixíssima latência e overhead mínimo. Ideal para DNS, VoIP, streaming, jogos online.

Comparação Prática

Característica TCP UDP
Conexão Orientada (3-way handshake) Não orientada
Confiabilidade Sim (ACKs, retransmissão) Não (best effort)
Ordem Garantida Não garantida
Controle de Fluxo Sim (sliding window) Não
Overhead Alto (20 bytes mínimo) Baixo (8 bytes mínimo)
Aplicações Típicas HTTP, SMTP, SSH, FTP DNS, DHCP, VoIP, streaming

6. A Interface de Programação (API)

Do ponto de vista do desenvolvedor de software, a conexão entre processos é manipulada através de APIs (Application Programming Interfaces) de Sockets (ex: a biblioteca socket em C/C++ ou java.net em Java, socket em Python).

System Calls Principais

O sistema operacional expõe chamadas de sistema (system calls) para gerenciar essa conexão:

  • socket(): Cria o ponto final (endpoint).
  • bind(): Associa o socket a uma porta (no servidor).
  • listen(): Coloca o socket em modo passivo (servidor).
  • accept(): Bloqueia até receber conexão entrante (servidor).
  • connect(): Inicia a conexão (no cliente).
  • send() e recv(): Transferem dados através da conexão estabelecida.
  • close(): Encerra a conexão e libera recursos.

Exemplo em Python (Servidor TCP)

import socket
srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
srv.bind(('0.0.0.0', 8080))
srv.listen(5)
while True:
    conn, addr = srv.accept()
    data = conn.recv(1024)
    conn.sendall(b'HTTP/1.1 200 OK\r\n\r\nHello')
    conn.close()

7. Demultiplexação no Recebimento

Quando um pacote IP chega a um host, o kernel do sistema operacional precisa saber qual processo deve receber os dados. O processo de demultiplexação é hierárquico:

  1. Examina o campo Protocol no cabeçalho IP (6=TCP, 17=UDP, 1=ICMP).
  2. Se TCP, examina o cabeçalho TCP, identificando porta de destino.
  3. Consulta tabela interna de sockets para encontrar qual processo está aguardando nessa porta.
  4. Copia o payload para o buffer de recepção do processo (acordando-o se estiver bloqueado em recv()).
  5. Se nenhum processo estiver listening, o kernel descarta o pacote e pode enviar um ICMP Port Unreachable (UDP) ou TCP RST (TCP).

8. Conclusão

A "Conexão entre Processos" é a abstração que permite que softwares conversem, isolando-os da complexidade da rede física e permitindo que múltiplos programas compartilhem a mesma infraestrutura de rede simultaneamente sem conflito. A combinação de multiplexação/demultiplexação por portas, sockets e os protocolos TCP/UDP formam a espinha dorsal da comunicação entre aplicações na Internet moderna.