Síťový socket

Z Wikipedie, otevřené encyklopedie

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[editovat | editovat zdroj]

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[editovat | editovat zdroj]

Internetový socket je charakterizován alespoň následujícím:

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.

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ů[editovat | editovat zdroj]

Několik typů internetového socketu:

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[editovat | editovat zdroj]

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[editovat | editovat zdroj]

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.

Reference[editovat | editovat zdroj]

V tomto článku byl použit překlad textu z článku Network socket na anglické Wikipedii.