9.8. Portas¶
Um endereço IP indica a qual anfitrião um pacote se destina. Um anfitrião moderno executa muitos programas em simultâneo – um browser web, um cliente de conversação, uma videochamada, uma tarefa de cópia de segurança – e cada um deles está a enviar e a receber pacotes em paralelo. A camada IP não tem forma de os distinguir; limita-se a entregar cada pacote recebido ao «anfitrião». Algo tem de decidir qual o pacote que pertence a qual programa.
O número de porta é a resposta. Cada pacote na camada de transporte transporta dois campos extra além do cabeçalho IP: uma porta de origem e uma porta de destino. Cada uma é um inteiro de 16 bits, pelo que existem 65535 números de porta possíveis por anfitrião. Combinado com o endereço IP, a porta identifica um endpoint específico dentro de um anfitrião – a conversa específica de um programa específico.
Muitos programas partilham um endereço IP; a porta de destino encaminha cada pacote recebido para o correto.¶
9.8.1. Portas bem conhecidas¶
Os primeiros 1024 números de porta são reservados por convenção para serviços padrão. Alguns que o leitor irá encontrar:
22 – SSH (o protocolo Secure Shell, utilizado para acesso remoto encriptado).
53 – DNS, o Sistema de Nomes de Domínio (abordado em Nomes e DNS).
80 – HTTP, o Protocolo de Transferência de Hipertexto – o protocolo não encriptado da web.
123 – NTP, o Protocolo de Tempo de Rede (como os dispositivos acertam os relógios a partir de um servidor de tempo).
443 – HTTPS, HTTP transportado sobre TLS (Transport Layer Security, o encapsulamento de encriptação padrão para protocolos internet) – o protocolo por detrás de cada página web que mostra um ícone de cadeado no browser.
A convenção é o que torna possível um browser ligar-se a http://example.com sem especificar uma porta – assume 80 porque é a porta bem conhecida para HTTP. Uma câmara a ligar-se a um servidor web faz o mesmo.
Acima de 1024, os números de porta são irrestritos e qualquer programa pode reservar um. Servidores de bases de dados (5432 para PostgreSQL, 3306 para MySQL), servidores de aplicações e protocolos personalizados vivem todos algures no intervalo superior.
9.8.2. Portas efémeras¶
Os servidores escutam numa porta conhecida. Os clientes utilizam uma porta diferente na sua própria extremidade, escolhida de novo para cada ligação de saída.
Quando a câmara se liga a um servidor web na porta 443, a conversa é entre
camera IP : <some-port> <--> server IP : 443
A <some-port> é uma porta efémera – o MicroPython escolhe um número não utilizado de um intervalo alto, utiliza-o durante a ligação e liberta-o depois. O script não precisa de saber qual o número escolhido; a camada de sockets trata disso.
9.8.3. Escuta vs. comunicação¶
A função de uma porta depende do lado da conversa em que se encontra. Dois casos distintos:
Uma porta em escuta pertence a um programa que quer receber ligações não solicitadas. O programa diz ao MicroPython «quaisquer pacotes recebidos endereçados a mim na porta 80 são meus» e aguarda. Os servidores fazem isto.
Uma porta ligada pertence a um programa que quer iniciar uma conversa. O programa escolhe (ou pede ao MicroPython para escolher) uma porta efémera, envia um pacote com essa como porta de origem e a porta bem conhecida do servidor como destino, e utiliza o mesmo par de portas para o resto da conversa.
Um único programa pode fazer ambas em simultâneo, mantendo portas diferentes para cada função. Uma câmara pode escutar na porta 8000 para ligações HTTP de entrada provenientes de uma interface de configuração e manter uma ligação HTTPS de saída para um servidor remoto na porta 443. As duas funções não interferem – cada conversa é identificada pelo quádruplo completo (src IP, src port, dst IP, dst port) e não há duas conversas com o mesmo quádruplo.
9.8.4. O que as portas permitem¶
Com as portas implementadas, a camada de transporte pode finalmente resolver o problema da entrega programa a programa. Um pacote contém agora informação suficiente para ser encaminhado não apenas para o anfitrião correto (o endereço IP) mas para o socket correto dentro desse anfitrião (o número de porta).
As próximas duas páginas cobrem os dois tipos que a camada de transporte oferece sobre esse endereçamento: UDP (o User Datagram Protocol – cada pacote independente, sem garantias) e TCP (o Transmission Control Protocol – um fluxo ligado, fiável e ordenado).