9.2. Protocolli a livelli

Inviare un frame dalla camera a un server in un’altra città significa risolvere diversi problemi contemporaneamente. Il segnale elettrico deve riuscire ad attraversare il primo cavo. I byte su quel cavo devono trovare la strada attraverso uno switch locale. La rete locale deve consegnare il messaggio a qualunque cosa si trovi tra essa e il resto di internet. I pacchetti che sopravvivono al viaggio devono essere riassemblati nell’ordine giusto. Il ricevente deve sapere a quale dei suoi programmi consegnarli. E i byte stessi devono significare qualcosa su cui entrambe le estremità concordino.

Cercare di risolvere tutto ciò in un unico blocco di codice sarebbe ingestibile. La risposta standard è suddividere il lavoro in livelli. Ogni livello risolve un problema ben definito ed espone un servizio semplice al livello superiore. Un programma comunica sempre e solo con il livello immediatamente sottostante; i livelli al di sotto di quello sono invisibili.

Una pila verticale di cinque riquadri etichettati dal basso verso l'alto: fisico, collegamento, rete, trasporto, applicazione. Una freccia a destra punta verso l'alto lungo la pila con l'etichetta "ciò che costruiamo". Una freccia a sinistra punta verso il basso lungo la pila con l'etichetta "ciò che viene fornito".

Ogni livello di uno stack di rete risolve un problema e consegna un’astrazione pulita a quello successivo.

9.2.1. I cinque livelli

I nomi seguenti sono quelli usati nel resto di questa sezione. Provengono dal modello standard attorno a cui sono state progettate le reti. I confini esatti tra i livelli sono talvolta sfumati, ma il ruolo che ciascuno svolge è stabile.

Livello fisico. Spostare bit tra due dispositivi sullo stesso cavo o radio. Livelli di tensione, impulsi luminosi, modulazione RF. Il compito della camera qui consiste principalmente nel collegare il cavo giusto o nell’unirsi alla rete wireless giusta; il silicio fa il resto.

Livello di collegamento. Spostare frame (piccoli blocchi di byte) tra due dispositivi che condividono un segmento locale. Aggiunge indirizzi hardware in modo che ogni frame possa essere indirizzato a un vicino specifico. Ethernet e Wi-Fi sono le due tecnologie di collegamento che la camera incontra nella pratica.

Livello di rete. Spostare pacchetti tra due dispositivi qualsiasi su internet, non solo sullo stesso segmento locale. Aggiunge un indirizzo a livello software che identifica un host indipendentemente dal cavo su cui si trova e un meccanismo di routing che fa saltare un pacchetto da un segmento locale al successivo finché non arriva. Questo è il primo livello in cui il codice Python della camera inizia ad avere voce in capitolo.

Livello di trasporto. Si colloca sopra i pacchetti e offre la consegna tra programmi su due host, non solo tra gli host stessi. Sono comuni due varianti: una consegna un flusso di byte connesso e ordinato (la base portante per la maggior parte del traffico), l’altra consegna messaggi autocontenuti che viaggiano indipendentemente l’uno dall’altro (usata quando un basso overhead conta più delle garanzie). Aggiunge numeri di porta in modo che più programmi sullo stesso host possano portare avanti conversazioni in parallelo.

Livello applicativo. Tutto ciò che sta sopra il trasporto: i protocolli che danno significato ai byte. Qui risiedono quelli che un browser web parla per caricare le pagine – e quelli dietro a quasi ogni altro servizio internet che il lettore già usa ogni giorno. Il tutorial tratta il trasporto in profondità; questo livello ottiene una sezione successiva tutta sua.

9.2.2. Come i livelli si impilano in fase di esecuzione

Quando la camera invia byte sulla rete, ogni livello aggiunge la propria intestazione davanti ai dati, come annidare una busta dentro un’altra busta:

  • I byte dell’applicazione entrano per primi.

  • Il livello di trasporto li avvolge con una piccola intestazione che indica a quale programma appartengono (il numero di porta).

  • Il livello di rete avvolge quello con un’intestazione che indica a quale host sono destinati (l’indirizzo a livello software).

  • Il livello di collegamento avvolge quello con un’intestazione che indica a quale dispositivo sul segmento locale consegnarli successivamente (l’indirizzo hardware).

  • Il livello fisico trasforma l’intero pacchetto in bit su un cavo.

All’altra estremità, ogni livello rimuove la propria intestazione e consegna il resto verso l’alto. L’applicazione ricevente recupera i propri byte ignara che i livelli di rete, di collegamento e fisico siano mai esistiti.

Questo annidamento è il motivo per cui il tutorial procede dal basso verso l’alto. Comprendere ciò che fa il livello sottostante fa apparire il livello superiore inevitabile. I due livelli inferiori sono trattati in una singola pagina ciascuno perché non c’è quasi nulla da configurare da Python. Dal livello di rete in su, il ritmo rallenta man mano che il ruolo di Python diventa più importante.