9.8. Portas¶
Um endereço IP indica a qual host um pacote se destina. Um host moderno executa muitos programas ao mesmo tempo – um navegador web, um cliente de chat, uma chamada de vídeo, uma tarefa de backup – e cada um deles está enviando e recebendo pacotes em paralelo. A camada IP não tem como diferenciá-los; ela apenas entrega cada pacote que chega para “o host”. Algo precisa decidir qual pacote pertence a qual programa.
O número de porta é a resposta. Cada pacote na camada de transporte carrega dois campos extras além do cabeçalho IP: uma porta de origem e uma porta de destino. Cada uma é um inteiro de 16 bits, portanto há 65535 números de porta possíveis por host. Combinada com o endereço IP, a porta identifica um ponto de extremidade específico dentro de um host – a conversa específica de um programa específico.
Muitos programas compartilham um endereço IP; a porta de destino encaminha cada pacote que chega ao programa 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. Algumas com as quais o leitor vai se deparar:
22 – SSH (o protocolo Secure Shell, usado para login remoto criptografado).
53 – DNS, o Domain Name System (abordado em Nomes e DNS).
80 – HTTP, o Hypertext Transfer Protocol – o protocolo não criptografado da web.
123 – NTP, o Network Time Protocol (como os dispositivos acertam seus relógios a partir de um servidor de tempo).
443 – HTTPS, HTTP transportado sobre TLS (Transport Layer Security, o invólucro de criptografia padrão para protocolos da internet) – o protocolo por trás de toda página web que exibe um ícone de cadeado no navegador.
É a convenção que torna possível a um navegador conectar-se a http://example.com sem especificar uma porta – ele assume a 80 porque essa é a porta bem conhecida do HTTP. Uma câmera que se conecta a um servidor web faz o mesmo.
Acima de 1024, os números de porta são irrestritos e qualquer programa pode reivindicar um. Servidores de banco de dados (5432 para PostgreSQL, 3306 para MySQL), servidores de aplicação e protocolos personalizados vivem todos em algum lugar da faixa mais alta.
9.8.2. Portas efêmeras¶
Os servidores escutam em uma porta conhecida. Os clientes usam uma porta diferente em sua própria extremidade, escolhida do zero para cada conexão de saída.
Quando a câmera se conecta a um servidor web na porta 443, a conversa se dá 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 uma faixa alta, usa-o durante a conexão e o libera depois. O script não precisa se preocupar com qual número foi escolhido; a camada de socket cuida disso.
9.8.3. Escutando versus conversando¶
O papel que uma porta desempenha depende de qual lado da conversa ela está. Dois casos distintos:
Uma porta de escuta pertence a um programa que quer receber conexões não solicitadas. O programa diz ao MicroPython “quaisquer pacotes de entrada endereçados a mim na porta 80 são meus” e aguarda. Os servidores fazem isso.
Uma porta conectada 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 ela como porta de origem e a porta bem conhecida do servidor como destino, e usa o mesmo par de portas pelo resto da conversa.
Um único programa pode fazer ambos ao mesmo tempo, mantendo portas diferentes para cada papel. Uma câmera pode escutar na porta 8000 por conexões HTTP de entrada vindas de uma interface de usuário de configuração e manter uma conexão HTTPS de saída para um servidor remoto na porta 443. Os dois papéis não interferem entre si – cada conversa é identificada pela quádrupla completa (src IP, src port, dst IP, dst port), e duas conversas nunca compartilham a mesma quádrupla.
9.8.4. O que as portas desbloqueiam¶
Com as portas no lugar, a camada de transporte pode finalmente resolver o problema da entrega programa a programa. Um pacote agora carrega informação suficiente para ser roteado não apenas até o host correto (o endereço IP), mas até o socket correto dentro daquele host (o número de porta).
As duas próximas páginas abordam os dois sabores 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 conectado, confiável e ordenado).