9.6. Pacotes e encaminhamento

Um endereço IP diz para quem é uma mensagem. O mecanismo que realmente a entrega chama-se encaminhamento, e é o processo salto a salto pelo qual um pacote viaja da rede local de um remetente para a rede local de um destinatário, possivelmente muito distante.

9.6.1. Um pacote, brevemente

Um pacote é a unidade de trabalho da camada IP – um bloco de bytes com um pequeno cabeçalho e um payload. O cabeçalho tem dois campos relevantes para o encaminhamento:

  • O endereço IP de origem (de onde veio o pacote).

  • O endereço IP de destino (para onde vai).

O payload é o que a camada de transporte pediu à camada de rede para entregar. O cabeçalho do pacote inclui também um contador de tempo de vida, uma soma de verificação do cabeçalho e alguns sinalizadores de controlo. Nenhum desses é algo que o código Python da câmara toque directamente.

Os pacotes não prometem mais do que «fizemos o melhor» – podem ser perdidos, duplicados ou entregues fora de ordem. A fiabilidade e a ordenação são problemas que a camada de transporte acima resolve; a camada de rede apenas faz o seu melhor para reencaminhar cada pacote para o seu destino.

9.6.2. Salto a salto

O pacote sai da câmara e chega ao primeiro dispositivo que não se encontra no segmento local da câmara: o gateway predefinido. (A página anterior mencionou que o DHCP fornece à câmara o endereço do gateway quando a rede se estabelece.) Esse dispositivo é um router – uma caixa cujo trabalho é receber pacotes, analisar o seu destino e reencaminhá-los.

A diagram showing five boxes. On the left, a camera labelled "10.0.0.42". Connected to a router labelled "10.0.0.1 / 203.0.113.5". Then a sequence of two unnamed routers in the middle. Then a router labelled "198.51.100.1 / 198.51.100.x". Finally a server labelled "198.51.100.20". An arrow with the label "destination: 198.51.100.20" travels along the chain from left to right.

Um pacote da câmara para o destino salta entre routers, cada um um passo mais próximo.

O router tem uma tabela de encaminhamento – uma lista de «para destinos que correspondem a este padrão, envie o pacote por esta interface». Para destinos na mesma rede que a câmara, a entrada diz «envie-o de volta pelo cabo por onde chegou». Para destinos na internet mais ampla, a entrada diz «envie-o para o router a montante». Para padrões de destinos conhecidos (uma VPN empresarial, a rede de um parceiro de negócios específico, uma ligação por satélite), o router pode ter uma entrada mais específica que substitui a predefinição.

O router a montante faz o mesmo. E o seguinte. E o próximo. Cada salto tem a mesma forma: receber o pacote, consultar o destino na tabela, enviá-lo pela interface correcta. Eventualmente o pacote chega a um router que está no mesmo segmento local que o IP de destino. Esse router entrega o último salto, o destino recebe o pacote e a viagem terminou.

9.6.3. Os extremos não conhecem a rota

Uma câmara que envia um pacote para um servidor remoto não sabe como o pacote chegará lá. Só conhece o IP de destino e o endereço do seu próprio gateway predefinido. Tudo o que está entre eles – quais routers, quais fibras, quais cabos submarinos – é algo que os routers ao longo do caminho decidem à medida que avançam, com base nas suas próprias tabelas. Os próprios routers apenas conhecem os seus vizinhos imediatos e a direcção geral dos destinos comuns; nenhum dispositivo na internet tem um mapa completo dela.

Essa descentralização é a razão pela qual a rede continua a funcionar quando caminhos individuais falham. Um cabo cortado algures no meio torna-se um evento de reencaminhamento em alguns routers; os extremos nunca notam. É também a razão pela qual um pacote de uma câmara em Tóquio para um servidor em Dublin pode ter sucesso sem que nenhum dos lados saiba que países estão no meio.

9.6.4. O que isto significa para um script Python

O trabalho da câmara na camada de rede resume-se a:

  • Ter um endereço IP.

  • Conhecer o endereço do gateway predefinido (o DHCP preenche isso automaticamente).

  • Entregar pacotes de saída, endereçados a qualquer IP, a esse gateway e confiar no resto do caminho.

Um script nunca escolhe uma rota, nunca nomeia um salto intermédio e nunca vê os routers no meio. Escreve o IP de destino no pacote e a camada de rede toma conta do resto. Do ponto de vista de um script Python, todo o encaminhamento é apenas uma propriedade da rede à qual a câmara se ligou – «o gateway envia pacotes para algum lugar útil para mim».

A camada de transporte que vem a seguir assume que o encaminhamento simplesmente funciona, e constrói fiabilidade, ordenação e endereçamento entre programas sobre isso.