9.6. Pachete și dirijare

O adresă IP spune cui îi este destinat un mesaj. Mecanismul care îl livrează efectiv se numește dirijare (routing) și este procesul salt cu salt prin care un pachet călătorește de la rețeaua locală a unui expeditor la rețeaua locală a unui destinatar, eventual foarte departe.

9.6.1. Pe scurt, un pachet

Un pachet este unitatea de lucru a nivelului IP – un fragment de octeți cu un mic antet și o sarcină utilă. Antetul are două câmpuri care contează pentru dirijare:

  • Adresa IP sursă (de unde a venit pachetul).

  • Adresa IP destinație (unde se îndreaptă).

Sarcina utilă este orice a cerut nivelul transport nivelului rețea să livreze. Antetul pachetului include de asemenea un contor time-to-live, o sumă de control peste antet și câteva fanioane de control. Niciunul dintre acestea nu este atins direct de codul Python al camerei.

Pachetele nu promit nimic mai mult decât „am încercat” – pot fi pierdute, duplicate sau livrate într-o ordine greșită. Fiabilitatea și ordonarea sunt probleme pe care le rezolvă nivelul transport de deasupra; nivelul rețea doar face tot posibilul să retransmită fiecare pachet către destinația sa.

9.6.2. Salt cu salt

Pachetul părăsește camera și ajunge la primul dispozitiv care nu se află pe segmentul local al camerei: gateway-ul implicit. (Pagina anterioară a menționat DHCP-ul oferind camerei adresa gateway-ului atunci când rețeaua s-a ridicat.) Acel dispozitiv este un router – o cutie a cărei sarcină este să primească pachete, să le examineze destinația și să le retransmită mai departe.

O diagramă care arată cinci cutii. În stânga, o cameră etichetată „10.0.0.42”. Conectată la un router etichetat „10.0.0.1 / 203.0.113.5”. Apoi o secvență de două routere fără nume în mijloc. Apoi un router etichetat „198.51.100.1 / 198.51.100.x”. În final un server etichetat „198.51.100.20”. O săgeată cu eticheta „destinație: 198.51.100.20” parcurge lanțul de la stânga la dreapta.

Un pachet de la cameră către destinație sare de la un router la altul, fiecare cu un pas mai aproape.

Routerul are o tabelă de dirijare – o listă de „pentru destinațiile care corespund acestui tipar, trimite pachetul pe această interfață”. Pentru destinațiile aflate pe aceeași rețea ca și camera, intrarea spune „trimite-l înapoi pe cablul prin care a venit”. Pentru destinațiile de pe internetul mai larg, intrarea spune „trimite-l la routerul din amonte”. Pentru tipare cunoscute de destinații (un VPN corporativ, rețeaua unui anumit partener de afaceri, o legătură prin satelit), routerul poate avea o intrare mai specifică ce suprascrie valoarea implicită.

Routerul din amonte face același lucru. Și următorul. Și următorul. Fiecare salt are aceeași formă: primește pachetul, caută destinația în tabelă, îl trimite pe interfața corectă. În cele din urmă pachetul ajunge la un router care se află pe același segment local ca și IP-ul destinație. Acel router efectuează ultimul salt, destinația primește pachetul, iar călătoria s-a încheiat.

9.6.3. Capetele nu cunosc ruta

O cameră care trimite un pachet către un server la distanță nu știe cum va ajunge pachetul acolo. Știe doar IP-ul destinație și adresa propriului gateway implicit. Tot ce este între – ce routere, ce fibre, ce cabluri submarine – este ceva ce decid routerele de pe traseu pe măsură ce înaintează, pe baza propriilor tabele. Routerele înseși cunosc doar vecinii lor imediați și direcția aproximativă a destinațiilor obișnuite; niciun dispozitiv unic de pe internet nu are o hartă completă a acestuia.

Această descentralizare este motivul pentru care rețeaua continuă să funcționeze atunci când trasee individuale eșuează. Un cablu tăiat undeva la mijloc devine un eveniment de redirijare la câteva routere; capetele nu observă niciodată. Este de asemenea motivul pentru care un pachet de la o cameră din Tokyo către un server din Dublin poate reuși fără ca vreuna dintre părți să știe ce țări se află între ele.

9.6.4. Ce înseamnă asta pentru un script Python

Sarcina camerei la nivelul rețea se reduce la:

  • Să aibă o adresă IP.

  • Să cunoască adresa gateway-ului implicit (DHCP completează asta automat).

  • Să predea pachetele de ieșire, adresate oricărui IP, acelui gateway și să aibă încredere în restul traseului.

Un script nu alege niciodată o rută, nu denumește niciodată un salt intermediar și nu vede niciodată routerele din mijloc. El scrie IP-ul destinație pe pachet, iar nivelul rețea preia controlul. Din perspectiva unui script Python, întreaga dirijare este doar o proprietate a rețelei la care s-a alăturat camera – „gateway-ul trimite pachetele undeva util pentru mine”.

Nivelul transport care urmează presupune că dirijarea pur și simplu funcționează și construiește deasupra acesteia fiabilitatea, ordonarea și adresarea de la program la program.