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.
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.