02 - Conexão entre Processos
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:
- Protocolo de Transporte (TCP ou UDP)
- IP de Origem
- Porta de Origem
- IP de Destino
- 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()erecv(): 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:
- Examina o campo Protocol no cabeçalho IP (6=TCP, 17=UDP, 1=ICMP).
- Se TCP, examina o cabeçalho TCP, identificando porta de destino.
- Consulta tabela interna de sockets para encontrar qual processo está aguardando nessa porta.
- Copia o payload para o buffer de recepção do processo (acordando-o se estiver bloqueado em
recv()). - 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.