9.6. Pacchetti e instradamento¶
Un indirizzo IP dice a chi è destinato un messaggio. Il meccanismo che lo recapita effettivamente si chiama instradamento, ed è il processo salto per salto con cui un pacchetto viaggia dalla rete locale di un mittente alla rete locale di un destinatario, eventualmente molto lontana.
9.6.1. Un pacchetto, in breve¶
Un pacchetto è l’unità di lavoro del livello IP – un blocco di byte con una piccola intestazione e un payload. L’intestazione ha due campi che contano per l’instradamento:
L’indirizzo IP di origine (da dove proviene il pacchetto).
L’indirizzo IP di destinazione (dove sta andando).
Il payload è qualunque cosa il livello di trasporto abbia chiesto al livello di rete di recapitare. L’intestazione del pacchetto include anche un contatore time-to-live, un checksum sull’intestazione e alcuni flag di controllo. Nessuno di questi elementi viene toccato direttamente dal codice Python della camera.
I pacchetti non promettono nulla più di «abbiamo provato» – possono essere persi, duplicati o recapitati fuori ordine. L’affidabilità e l’ordinamento sono problemi che risolve il livello di trasporto soprastante; il livello di rete fa semplicemente del suo meglio per inoltrare ogni pacchetto verso la sua destinazione.
9.6.2. Salto dopo salto¶
Il pacchetto lascia la camera e arriva al primo dispositivo che non si trova sul segmento locale della camera: il gateway predefinito. (La pagina precedente ha citato il DHCP che consegna alla camera l’indirizzo del gateway all’attivazione della rete.) Quel dispositivo è un router – una scatola il cui compito è ricevere i pacchetti, esaminarne la destinazione e inoltrarli oltre.
Un pacchetto dalla camera alla destinazione salta da un router all’altro, ognuno un passo più vicino.¶
Il router ha una tabella di instradamento – un elenco di voci del tipo «per le destinazioni che corrispondono a questo schema, invia il pacchetto su questa interfaccia». Per le destinazioni sulla stessa rete della camera, la voce dice «rimandalo lungo il cavo da cui è arrivato». Per le destinazioni sull’internet più ampio, la voce dice «invialo al router a monte». Per schemi di destinazioni noti (una VPN aziendale, la rete di uno specifico partner commerciale, un collegamento satellitare), il router può avere una voce più specifica che sovrascrive quella predefinita.
Il router a monte fa la stessa cosa. E quello successivo. E quello dopo ancora. Ogni salto ha la stessa forma: ricevere il pacchetto, cercare la destinazione nella tabella, inviarlo sull’interfaccia corretta. Alla fine il pacchetto arriva a un router che si trova sullo stesso segmento locale dell’IP di destinazione. Quel router effettua l’ultimo salto, la destinazione riceve il pacchetto e il viaggio è concluso.
9.6.3. Gli endpoint non conoscono il percorso¶
Una camera che invia un pacchetto a un server remoto non sa come il pacchetto arriverà a destinazione. Conosce solo l’IP di destinazione e l’indirizzo del proprio gateway predefinito. Tutto ciò che sta in mezzo – quali router, quali fibre, quali cavi sottomarini – è qualcosa che i router lungo il percorso decidono strada facendo, in base alle proprie tabelle. I router stessi conoscono solo i propri vicini immediati e la direzione approssimativa delle destinazioni comuni; nessun singolo dispositivo su internet ne possiede una mappa completa.
Questa decentralizzazione è il motivo per cui la rete continua a funzionare quando i singoli percorsi vengono meno. Un cavo tranciato da qualche parte nel mezzo diventa un evento di re-instradamento presso pochi router; gli endpoint non se ne accorgono mai. È anche il motivo per cui un pacchetto da una camera a Tokyo a un server a Dublino può arrivare a destinazione senza che nessuna delle due parti sappia quali paesi si trovino in mezzo.
9.6.4. Cosa significa questo per uno script Python¶
Il compito della camera al livello di rete si riduce a:
Avere un indirizzo IP.
Conoscere l’indirizzo del gateway predefinito (il DHCP lo compila automaticamente).
Consegnare i pacchetti in uscita, indirizzati a qualsiasi IP, a quel gateway e affidarsi al resto del percorso.
Uno script non sceglie mai un percorso, non nomina mai un salto intermedio e non vede mai i router nel mezzo. Scrive l’IP di destinazione sul pacchetto e il livello di rete si occupa del resto. Dal punto di vista di uno script Python, tutto l’instradamento è semplicemente una proprietà della rete a cui la camera si è collegata – «il gateway invia i pacchetti da qualche parte utile per me».
Il livello di trasporto che viene dopo presuppone che l’instradamento funzioni e basta, e costruisce su di esso affidabilità, ordinamento e indirizzamento da programma a programma.