9.8. Portok¶
Egy IP-cím megmondja, melyik hostnak szól egy csomag. Egy modern host egyszerre sok programot futtat – egy webböngészőt, egy csevegőklienst, egy videohívást, egy biztonsági mentési feladatot –, és ezek mindegyike párhuzamosan küld és fogad csomagokat. Az IP-rétegnek nincs módja megkülönböztetni őket; egyszerűen átadja minden beérkező csomagot „a hostnak”. Valaminek el kell döntenie, melyik csomag melyik programhoz tartozik.
A portszám a válasz. A szállítási rétegben minden csomag két további mezőt hordoz az IP-fejlécen túl: egy forrásportot és egy célportot. Mindegyik egy 16 bites egész szám, így hostonként 65535 lehetséges portszám létezik. Az IP-címmel kombinálva a port egy adott, hoston belüli végpontot azonosít – egy konkrét program egy konkrét beszélgetését.
Sok program osztozik egyetlen IP-címen; a célport minden beérkező csomagot a megfelelőhöz irányít.¶
9.8.1. Jól ismert portok¶
Az első 1024 portszámot megállapodás szerint a szabványos szolgáltatások számára tartják fenn. Néhány, amellyel az olvasó találkozni fog:
22 – SSH (a Secure Shell protokoll, amelyet titkosított távoli bejelentkezéshez használnak).
53 – DNS, a Domain Name System (a Nevek és DNS oldalon tárgyalva).
80 – HTTP, a Hypertext Transfer Protocol – a web titkosítatlan protokollja.
123 – NTP, a Network Time Protocol (ahogyan az eszközök egy időkiszolgálóról beállítják az órájukat).
443 – HTTPS, a TLS (Transport Layer Security, az internetes protokollok szabványos titkosítási burka) felett szállított HTTP – a protokoll, amely minden olyan weboldal mögött áll, amely lakat ikont mutat a böngészőben.
A megállapodás teszi lehetővé, hogy egy böngésző port megadása nélkül csatlakozhasson a http://example.com címhez – a 80-as portot feltételezi, mert ez a HTTP jól ismert portja. Egy webkiszolgálóhoz csatlakozó kamera ugyanezt teszi.
Az 1024 felett a portszámok korlátozás nélküliek, és bármely program lefoglalhat egyet. Az adatbázis-kiszolgálók (5432 a PostgreSQL, 3306 a MySQL esetében), az alkalmazáskiszolgálók és az egyedi protokollok mind valahol a magasabb tartományban élnek.
9.8.2. Efemer portok¶
A kiszolgálók egy ismert porton figyelnek. A kliensek egy másik portot használnak a saját oldalukon, amelyet minden kimenő kapcsolathoz frissen választanak ki.
Amikor a kamera a 443-as porton csatlakozik egy webkiszolgálóhoz, a beszélgetés a következők között zajlik:
camera IP : <some-port> <--> server IP : 443
A <some-port> egy efemer port – a MicroPython egy nem használt számot választ egy magas tartományból, a kapcsolat idejére használja, majd utána felszabadítja. A szkriptnek nem kell törődnie azzal, melyik számot választotta ki; a socket-réteg kezeli ezt.
9.8.3. Figyelés kontra kommunikáció¶
Az a szerep, amelyet egy port betölt, attól függ, hogy a beszélgetés melyik oldalán van. Két különálló eset:
Egy figyelő port egy olyan programhoz tartozik, amely kéretlen kapcsolatokat akar fogadni. A program közli a MicroPythonnal, hogy „a 80-as porton hozzám címzett bármely bejövő csomag az enyém”, és vár. A kiszolgálók ezt teszik.
Egy csatlakozott port egy olyan programhoz tartozik, amely beszélgetést akar kezdeményezni. A program kiválaszt (vagy megkéri a MicroPythont, hogy válasszon ki) egy efemer portot, küld egy csomagot, amelyben ez a forrásport és a kiszolgáló jól ismert portja a célport, majd a beszélgetés hátralévő részében ugyanezt a portpárt használja.
Egyetlen program egyszerre mindkettőt megteheti, mindegyik szerephez külön portot tartva. Egy kamera figyelhet a 8000-es porton egy konfigurációs felhasználói felület felől érkező bejövő HTTP-kapcsolatokra, és fenntarthat egy kimenő HTTPS-kapcsolatot egy távoli kiszolgálóhoz a 443-as porton. A két szerep nem zavarja egymást – minden beszélgetést a teljes (src IP, src port, dst IP, dst port) négyes azonosít, és nincs két olyan beszélgetés, amely ugyanazon a négyesen osztozna.
9.8.4. Mit oldanak fel a portok¶
A portok birtokában a szállítási réteg végre megoldhatja a programtól programig tartó kézbesítés problémáját. Egy csomag mostantól elegendő információt hordoz ahhoz, hogy ne csak a megfelelő hosthoz (az IP-címhez), hanem az adott hoston belüli megfelelő sockethez (a portszámhoz) is eljusson.
A következő két oldal a szállítási réteg által e címzés tetején kínált két változatot tárgyalja: UDP (a User Datagram Protocol – minden csomag független, semmilyen garancia nélkül) és TCP (a Transmission Control Protocol – egy kapcsolt, megbízható, sorrendhelyes folyam).