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.

Egyetlen host-doboz a jobb oldalon, a tetején feliratozott IP-címmel. A hoston belül három program látható „HTTP-kiszolgáló”, „videohívás”, „csevegőkliens” felirattal, mind egy-egy különböző, 80, 5004 és 4321 számú porthoz csatlakozva. Három nyíl érkezik a hosthoz a hálózat felől, mindegyik egy célporttal megjelölve; minden nyíl a megfelelő programon ér földet.

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).