Sokety a služby
Síťový socket (anglicky network socket) je v informatice koncový bod připojení přes počítačovou síť. S rozvojem Internetu většina komunikace mezi počítači používá rodinu protokolů TCP/IP. Vlastní přenos zajišťuje IP protokol, a proto je používáno i označení internetový socket. Vlastní socket je handle (abstraktní odkaz), který může program použít při volání síťového rozhraní pro programování aplikací (API), například ve funkci „odeslat tato data na tento socket“. Sockety jsou vnitřně často jen celá čísla, která odkazují do tabulky aktivních spojení.
Charakteristika
Například k poslání „Hello, world!” pomocí TCP na port 80
hostitele s adresou 1.2.3.4, vytvoříme socket, připojíme jej ke vzdálenému
hostiteli, odešleme řetězec a poté socket zavřeme:
Socket socket = getSocket(type = "TCP")
connect(socket, address = "1.2.3.4",
port = "80")
send(socket, "Hello, world!")
close(socket)
Socket API je
rozhraní pro programování aplikací (API), které je obvykle poskytováno operačním
systémem a umožňuje aplikačním programům ovládat a používat síťové sockety. API
internetových socketů jsou obvykle založena na standardu Berkeley socketů. Dle
standardu Berkeley socketů jsou sockety ve formě deskriptoru souboru (souborový
handle), což vychází z filozofie Unixu, která tvrdí, že „všechno je soubor”, a
analogie mezi sockety a soubory: v obou případech lze data číst, zapisovat a
socket lze otevřít a zavřít. V meziprocesové komunikaci bude obecně mít každá
strana komunikace své vlastní sockety a každý z nich může používat jiné API,
protože jsou data předávána pomocí síťového protokolu.
Adresa socketu je kombinací IP adresy a čísla portu, stejně jako je jeden konec telefonního spojení kombinací telefonního čísla a předčíslí (tzv. „volačka“). Sockety nemusí mít nutně adresu (například pouze pro odesílání dat), ale pokud program váže sockety na adresu, mohou být sockety použity k přijímání dat odeslaných na danou adresu. Na základě této adresy doručují internetové sockety příchozí datové pakety do příslušného procesu nebo vlákna aplikace.
Přehled
Internetový socket je charakterizován alespoň následujícím:
Místní adresa socketu: Místní IP adresa a číslo portu
Protokol: transportní
protokol (např. TCP, UDP, raw IP).
Z toho vyplývá, že TCP port 53 a UDP port
53 jsou odlišné sockety. Socket, který je připojen do jiného socketu, například
při navázání TCP spojení, má také vzdálenou socket adresu.
Jak je uvedeno v oddílu klient-server níže, TCP server může obsluhovat více klientů současně. Server vytvoří jeden socket pro každého klienta a z pohledu tohoto serveru sdílejí sockety stejné místní socket adresy a mají různé vzdálené adresy pro každého klienta.
V rámci operačního systému a aplikace, která socket vytvořila, je na socket odkazováno pomocí unikátní celočíselné hodnoty nazývané socket deskriptor. Operační systém předává příchozí IP pakety odpovídající aplikaci pomocí extrakce informací socket adresy z IP adresy a hlaviček transportních protokolů a oddělování hlaviček od aplikačních dat.
V IETF RFC, Internetových Standardech, v mnoha učebnicích a také v tomto článku se pojem socket vztahuje k entitě, která je jednoznačně identifikována pomocí čísla socketu. V ostatních učebnicích odkazuje pojem socket na místní socket adresu, tj. „kombinaci IP adresy a čísla portu”. V původní definici socketu uvedené v RFC 147, která bylo vydáno v souvislosti se sítí ARPANET v roce 1971 je uvedeno, že „socket je specifikován jako 32bitové číslo se sudými sockety identifikujícími přijímací sockety a lichými sockety identifikujícími odesílající sockety”.
V unixových systémech i v systémech založených na Microsoft Windows může být v příkazovém řádku použit nástroj netstat, který zobrazí seznam všech aktuálně používaných socketů a souvisejících informací.
Typy síťových socketů
Několik typů internetového socketu:
Datagramové sockety, známé také jako nespojové sockety, které používají User
Datagram Protocol (UDP).
Streamové sockety, také známý jako spojové sockety,
které používají Transmission Control Protocol (TCP) nebo Stream Control
Transmission Protocol (SCTP).
Raw sockety (nebo Raw IP sockety), obvykle k
dispozici ve směrovačích (routerech) a dalších síťových zařízeních. Zde se
transportní vrstva obejde a hlavičky paketů se zpřístupní aplikaci.
Další
typy socketů jsou realizovány pomocí jiných transportních protokolů, jako jsou
např. Systems Network Architecture (SNA). Viz také Unix domain sockety (UDS),
pro interní meziprocesovou komunikaci.
Stavy síťových socketů a model klient-server
Počítačové procesy, poskytující
aplikační služby, jsou označovány jako servery a při startu vytvářejí sockety,
které jsou ve stavu naslouchání (listen). Tyto sockety čekají na iniciativu od
klientských programů.
TCP server může obsluhovat více klientů současně pomocí podřízeného procesu vytvořeného pro každého klienta a navázání TCP spojení mezi podřízeným procesem a klientem. Pro každé spojení jsou vytvořeny unikátní specializované sockety. Když je zaváděno socket-to-socket virtuální spojení nebo virtuální okruh (VC), také známo jako TCP relace, pomocí dálkového socketu, což poskytuje duplexní proud bytů, jsou tyto unikátní specializované sockety ve stavu spojeno (connected).
Server může vytvořit několik současně stanovených TCP socketů se stejným lokálním číslem portu a lokální IP adresou, kde je každý socket mapován na vlastní server-podřízený proces a slouží vlastnímu procesu klienta. Operačním systém s těmito sockety však zachází jako s rozdílnými, protože vzdálené socket adresy (IP adresa klienta a/nebo číslo portu) jsou rozdílné, jelikož mají různé čtveřice socketových párů.
UDP socket nemůže být ve stavu spojeno, protože UDP je nespojový protokol. Proto výstup příkazu netstat neukazuje stav UDP socketu. UDP server nevytváří nové podřízené procesy pro každého souběžně obsluhovaného klienta, ale jeden stejný proces postupně zpracovává příchozí datové pakety od všech vzdálených klientů přes stejný socket. To znamená, že UDP sockety nejsou identifikovány pomocí vzdálené adresy, ale pouze pomocí lokální adresy i přesto, že každá zpráva má přiřazenu i vzdálenou adresu.
Socketové páry
Komunikující lokální a vzdálené sockety se nazývají socketové
páry. Každý socketový pár je popsán unikátní čtveřicí, která se skládá ze zdrojů
a umístění IP adres a čísel portů (lokálních a vzdálených socket adres). Jak
bylo popsáno výše v případě TCP je každé unikátní čtveřici socketového páru
přiřazeno číslo socketu, zatímco v případě UDP je každé lokální socket adrese
přiřazeno číslo socketu.