9.8. Porturi¶
O adresă IP indică pentru ce gazdă este destinat un pachet. O gazdă modernă rulează multe programe simultan – un browser web, un client de chat, un apel video, o sarcină de backup – și fiecare dintre acestea trimite și primește pachete în paralel. Nivelul IP nu are nicio modalitate de a le diferenția; pur și simplu predă fiecare pachet sosit „gazdei”. Ceva trebuie să decidă cărui program îi aparține fiecare pachet.
Numărul de port este răspunsul. Fiecare pachet de la nivelul de transport poartă două câmpuri suplimentare dincolo de antetul IP: un port sursă și un port destinație. Fiecare este un întreg pe 16 biți, deci există 65535 de numere de port posibile per gazdă. Combinat cu adresa IP, portul identifică un anumit punct terminal în interiorul unei gazde – conversația specifică a unui program specific.
Multe programe partajează o singură adresă IP; portul destinație direcționează fiecare pachet sosit către cel corect.¶
9.8.1. Porturi binecunoscute¶
Primele 1024 de numere de port sunt rezervate prin convenție pentru servicii standard. Câteva pe care cititorul le va întâlni:
22 – SSH (protocolul Secure Shell, folosit pentru autentificare la distanță criptată).
53 – DNS, Domain Name System (descris în Nume și DNS).
80 – HTTP, Hypertext Transfer Protocol – protocolul necriptat al web-ului.
123 – NTP, Network Time Protocol (modul în care dispozitivele își setează ceasurile de la un server de timp).
443 – HTTPS, HTTP transportat peste TLS (Transport Layer Security, învelișul de criptare standard pentru protocoalele de internet) – protocolul din spatele fiecărei pagini web care afișează o pictogramă de lacăt în browser.
Convenția este ceea ce face posibil ca un browser să se conecteze la http://example.com fără a specifica un port – presupune 80, deoarece acela este portul binecunoscut pentru HTTP. O cameră care se conectează la un server web face același lucru.
Peste 1024, numerele de port nu sunt restricționate și orice program poate revendica unul. Serverele de baze de date (5432 pentru PostgreSQL, 3306 pentru MySQL), serverele de aplicații și protocoalele personalizate se află toate undeva în intervalul superior.
9.8.2. Porturi efemere¶
Serverele ascultă pe un port cunoscut. Clienții folosesc un port diferit la capătul lor, ales din nou pentru fiecare conexiune de ieșire.
Când camera se conectează la un server web pe portul 443, conversația are loc între
camera IP : <some-port> <--> server IP : 443
<some-port> este un port efemer – MicroPython alege un număr neutilizat dintr-un interval superior, îl folosește pe durata conexiunii și îl eliberează după aceea. Scriptului nu trebuie să-i pese ce număr a fost ales; nivelul de socket se ocupă de asta.
9.8.3. Ascultare vs. comunicare¶
Rolul pe care îl joacă un port depinde de partea conversației pe care se află. Două cazuri distincte:
Un port de ascultare aparține unui program care vrea să primească conexiuni nesolicitate. Programul îi spune lui MicroPython „orice pachet primit adresat mie pe portul 80 este al meu” și așteaptă. Serverele fac asta.
Un port conectat aparține unui program care vrea să inițieze o conversație. Programul alege (sau cere lui MicroPython să aleagă) un port efemer, trimite un pachet cu acesta ca port sursă și portul binecunoscut al serverului ca destinație și folosește aceeași pereche de porturi pentru restul conversației.
Un singur program poate face ambele lucruri simultan, deținând porturi diferite pentru fiecare rol. O cameră ar putea asculta pe portul 8000 pentru conexiuni HTTP de intrare de la o interfață de utilizator de configurare și să mențină o conexiune HTTPS de ieșire către un server la distanță pe portul 443. Cele două roluri nu interferează – fiecare conversație este identificată de cvadruplul complet (src IP, src port, dst IP, dst port), iar nicio pereche de conversații nu împarte același cvadruplu.
9.8.4. Ce deblochează porturile¶
Cu porturile la locul lor, nivelul de transport poate rezolva în sfârșit problema livrării de la program la program. Un pachet poartă acum suficiente informații pentru a fi direcționat nu doar către gazda corectă (adresa IP), ci și către socket-ul corect din interiorul acelei gazde (numărul de port).
Următoarele două pagini acoperă cele două variante pe care nivelul de transport le oferă deasupra acelei adresări: UDP (User Datagram Protocol – fiecare pachet independent, fără garanții) și TCP (Transmission Control Protocol – un flux conectat, fiabil și ordonat).