9.2. Protocolos em camadas

Enviar um quadro da câmera para um servidor em outra cidade significa resolver vários problemas ao mesmo tempo. O sinal elétrico precisa atravessar o primeiro fio. Os bytes nesse fio precisam encontrar o caminho através de um switch local. A rede local precisa entregar a mensagem ao que quer que esteja entre ela e o resto da internet. Os pacotes que sobrevivem à viagem precisam ser remontados em ordem. O receptor precisa saber a qual de seus programas entregá-los. E os próprios bytes precisam significar algo com que ambas as pontas concordem.

Tentar resolver tudo isso em um único bloco de código seria ingerenciável. A resposta padrão é dividir o trabalho em camadas. Cada camada resolve um problema bem definido e expõe um serviço simples à camada acima. Um programa só conversa com a camada diretamente abaixo dele; as camadas abaixo dessa são invisíveis.

Uma pilha vertical de cinco caixas rotuladas de baixo para cima: física, enlace, rede, transporte, aplicação. Uma seta à direita aponta para cima na pilha rotulada "o que construímos". Uma seta à esquerda aponta para baixo na pilha rotulada "o que é fornecido".

Cada camada de uma pilha de rede resolve um problema e entrega uma abstração limpa para a próxima.

9.2.1. As cinco camadas

Os nomes abaixo são os que o restante desta seção utiliza. Eles vêm do modelo padrão em torno do qual as redes foram projetadas. As fronteiras exatas entre as camadas às vezes são imprecisas, mas o papel que cada uma desempenha é estável.

Camada física. Move bits entre dois dispositivos no mesmo fio ou rádio. Níveis de tensão, pulsos de luz, modulação RF. O trabalho da câmera aqui é, na maior parte, conectar o cabo certo ou ingressar na rede sem fio certa; o silício faz o resto.

Camada de enlace. Move quadros (pequenos blocos de bytes) entre dois dispositivos que compartilham um segmento local. Adiciona endereços de hardware para que cada quadro possa ser direcionado a um vizinho específico. Ethernet e Wi-Fi são as duas tecnologias de enlace que a câmera encontra na prática.

Camada de rede. Move pacotes entre quaisquer dois dispositivos na internet, não apenas no mesmo segmento local. Adiciona um endereço em nível de software que identifica um host independentemente de qual cabo ele está, e um mecanismo de roteamento que faz um pacote saltar de um segmento local para o próximo até que ele chegue. Esta é a primeira camada em que o código Python da câmera começa a ter algo a dizer.

Camada de transporte. Fica em cima dos pacotes e oferece entrega entre programas em dois hosts, não apenas entre os próprios hosts. Dois tipos são comuns: um entrega um fluxo de bytes conectado e ordenado (o cavalo de batalha da maior parte do tráfego), o outro entrega mensagens autocontidas que viajam independentemente umas das outras (usado quando baixo overhead importa mais do que garantias). Adiciona números de porta para que vários programas no mesmo host possam manter conversas em paralelo.

Camada de aplicação. Tudo acima do transporte: os protocolos que dão significado aos bytes. Os que um navegador web fala para carregar páginas – e os que estão por trás de quase todos os outros serviços da internet que o leitor já usa todos os dias – residem aqui. O tutorial cobre o transporte em profundidade; esta camada ganha uma seção complementar própria.

9.2.2. Como as camadas se empilham em tempo de execução

Quando a câmera envia bytes pela rede, cada camada adiciona seu próprio cabeçalho na frente dos dados, como aninhar um envelope dentro de outro envelope:

  • Os bytes da aplicação entram primeiro.

  • A camada de transporte os envolve com um pequeno cabeçalho dizendo a qual programa eles pertencem (o número da porta).

  • A camada de rede envolve isso com um cabeçalho dizendo a qual host eles se destinam (o endereço em nível de software).

  • A camada de enlace envolve isso com um cabeçalho dizendo a qual dispositivo no segmento local entregá-los em seguida (o endereço de hardware).

  • A camada física transforma todo o pacote em bits em um fio.

Na outra ponta, cada camada remove seu próprio cabeçalho e entrega o restante para cima. A aplicação receptora recebe seus bytes de volta sem saber que as camadas de rede, enlace e física algum dia existiram.

Esse aninhamento é o motivo pelo qual o tutorial avança de baixo para cima. Entender o que a camada abaixo faz torna a camada acima parecer inevitável. As duas camadas inferiores são cobertas em uma única página cada, porque há quase nada a configurar a partir do Python. Da camada de rede para cima, o ritmo desacelera à medida que o papel do Python aumenta.