Ero sivun ”Pistoke” versioiden välillä

Linux.fista
Siirry navigaatioon Siirry hakuun
p (→‎Historiaa: typo)
p (alun perin)
 
(5 välissä olevaa versiota 4 käyttäjän tekeminä ei näytetä)
Rivi 1: Rivi 1:
'''Pistoke''' (engl. '''''socket''''') on [[UNIX]]-järjestelmissä keskeinen tietoliikenneyhteyttä kuvaava käyttöjärjestelmän tarjoama kaksisuuntainen ohjelmointirajapinta, joka mahdollistaa kahden mahdollisesti eri isäntäkoneella olevan [[prosessi]]n välisen kommunikoinnin. Prosessille pistoke näkyy abstraktiona, jota voi lukea ja johon voi kirjoittaa tiedoston tapaan. Käyttäjän näkökulmasta jokaista UNIX-järjestelmässä kulkevaa tietoliikenneyhteyttä ja jokaista palvelinsovellusta vastaa yksi pistoke. Käytössä olevat pistokkeet voi listata <tt>[[netstat]]</tt>-komennolla.
'''Pistoke''' (engl. ''socket'') on [[Unix]]-järjestelmissä keskeinen tietoliikenneyhteyttä kuvaava, käyttöjärjestelmän tarjoama kaksisuuntainen ohjelmointirajapinta, joka mahdollistaa kahden mahdollisesti eri isäntäkoneella olevan [[prosessi]]n välisen kommunikoinnin. Prosessille pistoke näkyy abstraktiona, jota voi lukea ja johon voi kirjoittaa tiedoston tapaan. Käyttäjän näkökulmasta jokaista Unix-järjestelmässä kulkevaa tietoliikenneyhteyttä ja jokaista palvelinsovellusta vastaa yksi pistoke. Käytössä olevat pistokkeet voi listata komennolla [[netstat]].


Käyttöjärjestelmä ohjaa pistokkeeseen kuuluvan verkkoliikenteen pistokkeen omistavalle prosessille. Tunnistus tapahtuu porttinumeron perusteella (''UNIX domain socketin'' tapauksessa tiedostonimen perusteella). Pistokkeen ei tarvitse välttämättä kuljettaa TCP/IP-liikennettä, vaan sen alemman tason protokollaksi voidaan valita myös esimerkiksi [[IPX]] tai myös [[UNIX domain socket]], jolloin ei ole kyse verkkoliikenteestä, vaan paikallisella koneella tapahtuvasta prosessienvälisestä kommunikoinnista (engl. '''''I'''nter '''P'''rocess '''C'''ommunication'') eli [[IPC]]:stä.
Käyttöjärjestelmä ohjaa pistokkeeseen kuuluvan verkkoliikenteen pistokkeen omistavalle prosessille. Tunnistus tapahtuu porttinumeron perusteella (''Unix domain socketin'' tapauksessa tiedostonimen perusteella). Pistokkeen ei tarvitse välttämättä kuljettaa TCP/IP-liikennettä, vaan sen alemman tason protokollaksi voidaan valita myös esimerkiksi [[IPX]] tai myös [[Unix domain socket]], jolloin ei ole kyse verkkoliikenteestä, vaan paikallisella koneella tapahtuvasta prosessienvälisestä kommunikoinnista eli [[IPC]]:stä (engl. ''Inter Process Communication'').


Pistokkeella on useita mahdollisia tiloja, ja kaikkia pistokkeita ei voi välttämättä lukea. Pistoke voi olla täysin ''käyttämötön pistoke'', jolla ei ole muita ominaisuuksia kuin valittu protkolla, tai se voi olla jotakin tiettyä porttia ''kuunteleva pistoke'', joka "synnyttää" uusia pistokkeita tarvittaessa kun muut prosessit ottavat yheyttä tämän porttiin. Vain ''yhdistetyn pistokkeen'', jolla on jo tiedossa kummatkin yhteyden ääripäät, kautta voi oikeasti kulkea dataa.
Pistokkeella on useita mahdollisia tiloja, ja kaikkia pistokkeita ei voi välttämättä lukea. Pistoke voi olla täysin ''käyttämätön pistoke'', jolla ei ole muita ominaisuuksia kuin valittu protokolla, tai se voi olla jotakin tiettyä porttia ''kuunteleva pistoke'', joka "synnyttää" uusia pistokkeita tarvittaessa kun muut prosessit ottavat yheyttä tämän porttiin. Vain ''yhdistetyn pistokkeen'', jolla on jo tiedossa kummatkin yhteyden ääripäät, kautta voi oikeasti kulkea dataa.


==Historiaa==
==Historiaa==
Pistokkeisiin perustuva kommunikointirajapinta on alunperin kehitetty Berkeley Source Distribution eli [[BSD]] UNIX-järjestelmille, ja julkaistu [[BSD-lisenssi]]n alaisuudessa 4.2BSD:ssa vuonna '''1983'''. Tämän takia toteutus tunnetaan yleisesti nimellä '''Berkeley Sockets'''. Myöhemmin mm. Microsoftin Windows järjeslmiin tehtiin tämän rajapinnan kanssa jossain määrin yhteensopiva toteutus.
Pistokkeisiin perustuva kommunikointirajapinta on alun perin kehitetty Berkeley Software Distribution eli [[BSD]]-Unix-järjestelmille, ja julkaistu [[BSD-lisenssi]]n alaisuudessa 4.2BSD:ssa vuonna 1983. Tämän takia toteutus tunnetaan yleisesti nimellä ''Berkeley Sockets''. Myöhemmin mm. Microsoftin Windows-järjestelmiin tehtiin tämän rajapinnan kanssa jossain määrin yhteensopiva toteutus.


Nykyisin [[POSIX]] määrittelee kaikille UNIX-järjestelmille yhteisen pistokerajapinnan, joka ei merkittävästi eroa alkuperäisestä Berkeley Sockets -toteutuksesta.
Nykyisin [[POSIX]] määrittelee kaikille Unix-järjestelmille yhteisen pistokerajapinnan, joka ei merkittävästi eroa alkuperäisestä Berkeley Sockets -toteutuksesta.


==Esimerkki==
==Esimerkki==
Rivi 17: Rivi 17:
</source>
</source>


Uusi ''käyttämätön pistoke'' luodaan:
Uusi käyttämätön pistoke luodaan:
<source lang="c">
<source lang="c">
int socket(int domain, int type, int protocol);
int socket(int domain, int type, int protocol);
</source>
</source>


Esim. palvelinpistokkeesta
Esimerkki palvelinpistokkeesta
<source lang="c">
<source lang="c">
#include <netinet/in.h>
#include <netinet/in.h>
Rivi 28: Rivi 28:
</source>
</source>


Luo [[IPv6]]-protokollaa käyttävän TCP-pistokkeen.
Luodaan [[IPv6]]-protokollaa käyttävä TCP-pistoke.


Pistoke sidotaan (engl. bind) isäntäkoneen johonkin porttiin kutsulla:
Pistoke sidotaan (engl. bind) isäntäkoneen johonkin porttiin kutsulla:

Nykyinen versio 24. maaliskuuta 2015 kello 20.19

Pistoke (engl. socket) on Unix-järjestelmissä keskeinen tietoliikenneyhteyttä kuvaava, käyttöjärjestelmän tarjoama kaksisuuntainen ohjelmointirajapinta, joka mahdollistaa kahden mahdollisesti eri isäntäkoneella olevan prosessin välisen kommunikoinnin. Prosessille pistoke näkyy abstraktiona, jota voi lukea ja johon voi kirjoittaa tiedoston tapaan. Käyttäjän näkökulmasta jokaista Unix-järjestelmässä kulkevaa tietoliikenneyhteyttä ja jokaista palvelinsovellusta vastaa yksi pistoke. Käytössä olevat pistokkeet voi listata komennolla netstat.

Käyttöjärjestelmä ohjaa pistokkeeseen kuuluvan verkkoliikenteen pistokkeen omistavalle prosessille. Tunnistus tapahtuu porttinumeron perusteella (Unix domain socketin tapauksessa tiedostonimen perusteella). Pistokkeen ei tarvitse välttämättä kuljettaa TCP/IP-liikennettä, vaan sen alemman tason protokollaksi voidaan valita myös esimerkiksi IPX tai myös Unix domain socket, jolloin ei ole kyse verkkoliikenteestä, vaan paikallisella koneella tapahtuvasta prosessienvälisestä kommunikoinnista eli IPC:stä (engl. Inter Process Communication).

Pistokkeella on useita mahdollisia tiloja, ja kaikkia pistokkeita ei voi välttämättä lukea. Pistoke voi olla täysin käyttämätön pistoke, jolla ei ole muita ominaisuuksia kuin valittu protokolla, tai se voi olla jotakin tiettyä porttia kuunteleva pistoke, joka "synnyttää" uusia pistokkeita tarvittaessa kun muut prosessit ottavat yheyttä tämän porttiin. Vain yhdistetyn pistokkeen, jolla on jo tiedossa kummatkin yhteyden ääripäät, kautta voi oikeasti kulkea dataa.

Historiaa[muokkaa]

Pistokkeisiin perustuva kommunikointirajapinta on alun perin kehitetty Berkeley Software Distribution eli BSD-Unix-järjestelmille, ja julkaistu BSD-lisenssin alaisuudessa 4.2BSD:ssa vuonna 1983. Tämän takia toteutus tunnetaan yleisesti nimellä Berkeley Sockets. Myöhemmin mm. Microsoftin Windows-järjestelmiin tehtiin tämän rajapinnan kanssa jossain määrin yhteensopiva toteutus.

Nykyisin POSIX määrittelee kaikille Unix-järjestelmille yhteisen pistokerajapinnan, joka ei merkittävästi eroa alkuperäisestä Berkeley Sockets -toteutuksesta.

Esimerkki[muokkaa]

Pistokkeet saa C-kielessä käyttöön seuraavasti missä tahansa POSIX-yhteensopivassa järjestelmässä:

#include <sys/types.h>
#include <sys/socket.h>

Uusi käyttämätön pistoke luodaan:

int socket(int domain, int type, int protocol);

Esimerkki palvelinpistokkeesta

#include <netinet/in.h>
int pistoke = socket(PF_INET6, SOCK_STREAM, 0)

Luodaan IPv6-protokollaa käyttävä TCP-pistoke.

Pistoke sidotaan (engl. bind) isäntäkoneen johonkin porttiin kutsulla:

int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);

ja sitten pistoke merkitään halukkaaksi vastaanottamaan paketteja kutsulla:

int listen(int sockfd, int backlog);

Pistokkeesta tulee kuunteleva pistoke.

Tämän jälkeen yhteyksiä voi ottaa vastaan yksitellen accept()-kutsulla:

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

acceptin palauttama int-arvo on samalla mudostetun yhteyden socketfd-arvo, jota voi lukea recv()-kutsulla ja johon voi kirjoittaa send()-kutsulla. Komentojen käyttö on samanlaista kuin tiedostojen luku ja kirjoitus read() ja write()-kutsuilla.

Lisätietoja on man-sivulla socket(2).

Katso myös[muokkaa]