Warstwowy model architektury internetowej, cz. III
część I
część II
część III
część IV
Warstwowy
model architektury internetowej
Andrzej Sopala
4.
Koncepcja gniazdka
Dotychczas opisane warstwy oprogramowania sieciowego Internetu
są "umieszczone" w systemie operacyjnym (w jądrze). Warstwę
zastosowań z kolei reprezentują programy użytkownika bądź programy
użytkowe systemu operacyjnego. Typowo programowanie Internetu polega
więc na wykorzystywaniu usług warstwy transportowej. Aby to ułatwić,
został wprowadzony specjalny interfejs programistyczny służący do
komunikowania się z warstwą transportową. Na interfejs ten składają
się tzw. gniazdka i funkcje do operowania na nich.
Gniazdko (socket) jest pewną koncepcją programistyczną. W
ogólności jest końcem wirtualnego połączenia. Na połączenie takie
składają się dwa gniazdka w dwóch hostach. Program, chcący nawiązać
połączenie z innym programem na hoście odległym, tworzy gniazdko do
komunikacji z nim. Po nawiązaniu połączenia, wszystko co chce wysłać
do programu na odległym hoście, wysyła do gniazdka, a co chce
odebrać czyta z gniazdka. Gniazdko jest więc "urządzeniem" wejścia /
wyjścia, podobnie jak otwarty plik. Ta analogia nie jest jedynie
obrazowa - w systemie UNIX gniazdka i otwarte pliki traktowane są na
podobnych zasadach. Tworzy je system, program zaś ma do nich dostęp
poprzez deskryptor. Deskryptory plików i gniazdek (a także innych
obiektów we/wy, np. urządzeń we/wy, kolejek FIFO i innych) mają
wspólną przestrzeń adresową - oznacza to, że nie ma tych samych
wartości deskryptorów dla gniazdek i plików otwartych przez jeden
proces. Dzięki temu w stosunku do gniazdek używać można tych samych
funkcji systemowych, co do plików. W szczególności dotyczy to
funkcji pisania i czytania. Nieco inaczej rzecz ma się w systemie
gniazdek systemu Windows (winsock), tam nie ma takiej analogii
"gniazdko - plik".
Interfejs gniazd jest przygotowany do obsługi kilku architektur
sieciowych, nie tylko TCP/IP (czyli Internetu). Tutaj zajmiemy się
oczywiście zastosowaniem gniazd jedynie dla protokołu TCP/IP.
Artykuł jest
fragmentem z książki Pisanie programów
internetowych publikowanym za uprzejmą zgodą autora
i Wydawnictwa MIKOM.
Księgarnia
internetowaWydawnictwa MIKOM Zamów książkę przez
Internet
4.1.
Operacje na gniazdkach
Przed użyciem gniazdka należy je oczywiście najpierw utworzyć. Służy
do tego funkcja socket. Jako parametry jej wywołania podać należy rodzinę
protokołów, które gniazdko będzie obsługiwać (w naszym przypadku będzie to
rodzina protokołów internetowych) oraz typ gniazdka (strumieniowe TCP czy
datagramowe UDP). Gniazdko tworzone jest także jako wynik działania
funkcji accept - piszemy o tym w opisie gniazdek nasłuchujących.
Po utworzeniu gniazdka można go użyć na dwa sposoby - jako gniazdko
połączeniowe lub jako gniazdko nasłuchujące. Opisujemy oba te typy niżej.
Gniazdko już niepotrzebne należy zamknąć przy pomocy funkcji używanej
także w stosunku do plików - close.
Gniazdka posiadają swoje opcje. Przy pomocy odpowiednich funkcji można
zmieniać domyślne zachowanie gniazdek. O najczęściej używanych opcjach i
sposobach ich zmiany piszemy w książce, w części poświęconej systemowi
UNIX. W systemie Windows są one bardzo podobne.
4.2.
Gniazdka połączeniowe
Są dwa typy gniazdek obsługujących protokół TCP - połączeniowe i
nasłuchujące. Tu opiszemy typ gniazdka częściej używany, mianowicie
gniazdko, które reprezentuje połączenie i przez które można przesyłać w
obie strony dane. Najczęściej używane jest ono przez programy klientów (o
podziale klient - serwer piszemy w następnym rozdziale). Nazywane jest
wtedy gniazdkiem aktywnym (czynnym), gdyż to ono nawiązuje połączenie
(inicjuje operację łączenia). Do nawiązania połączenia służy funkcja
connect, do której przekazujemy adres internetowy (adres IP hosta i numer
portu).
Po nawiązaniu połączenia gniazdko gotowe jest do przekazywania danych.
Używamy do tego funkcji read i write (częściej używane w systemie UNIX)
lub recv i send (używane w systemie Windows).
Rozłączanie połączenia możemy zrealizować prosto przy pomocy
zamknięcia gniazdka (zamykane jest wtedy całe połączenie i zwracany jest
deskryptor gniazdka) lub zamknąć połączenie częściowo (tylko w jedną
stronę) przy pomocy funkcji shutdown - czasem jest potrzebne takie
rozwiązanie.
4.3.
Gniazdka nasłuchujące
Gniazdko nasłuchujące nie jest końcówką żadnego połączenia. Nie można
przez nie przesyłać danych. Służą one do przyjmowania żądań połączenia,
dlatego gniazdko takie nazywa się pasywnym (biernym) - nie robi ono nic,
poza oczekiwaniem, aby zestawić połączenie. Wykorzystywane jest w
programach serwerów. Program taki tworzy gniazdko, przypisuje mu lokalny
numer portu (funkcja bind), aby program klienta (aktywna strona
połączenia) mógł zidentyfikować jednoznacznie gniazdko nasłuchujące (w
hoście odległym) na którym mu zależy. Po przypisaniu adresu lokalnego,
gniazdko przełączane jest w stan nasłuchu (funkcja listen) i czeka na
połączenia. Z gniazdkiem takim związana jest kolejka nieobsłużonych żądań
połączeń. Jeśli od klienta nadejdzie żądanie połączenia ustawiane jest ono
w kolejce. Do odpowiadania na żądanie połączenia (wyrażania na nie zgody)
służy funkcja accept przeprowadzana na gniazdku nasłuchującym. Pobiera ona
pierwsze z kolejki żądanie (najczęściej musi na nie czekać) i na podstawie
jego parametrów tworzy nowe gniazdko połączone, reprezentujące połączenie
z klientem. Od tej pory to nowe, wyprowadzone gniazdko może być używane w
identyczny sposób jak gniazdko aktywnej strony połączenia. Możemy przez
nie przesyłać dane w obie strony itd. - jednym słowem: jest to gniazdko
połączone. Zauważmy, że gniazdko nasłuchujące istnieje nadal i może
przyjmować dalsze zgłoszenia.
4.4.
Gniazdka datagramowe
W przypadku protokołu UDP sprawa jest prostsza. Tu nie ma zestawianego
połączenia, więc nie ma wyróżnianej strony aktywnej i pasywnej. Nie ma
więc rozróżnienia między gniazdkami stosowanymi w klientach i serwerach.
Podział na stronę serwera i klienta wynika w tym przypadku z funkcji
programu, nie zaś ze sposobu korzystania z gniazdek.
Po utworzeniu gniazdka datagramowego jest ono gotowe do
przeprowadzania komunikacji. Po stronie serwera należy jeszcze przypisać
gniazdku numer portu (funkcja bind), aby klient mógł je jednoznacznie
określić w hoście odległym. Do wysyłania i odbierania datagramów służą
funkcje - odpowiednio - sendto i recvfrom, choć można również używać
funkcji send, recv, write i read.
Ponieważ protokół datagramowy nie jest protokołem połączeniowym,
dlatego przy każdym wysyłanym datagramie należy podać jego adresata
(funkcja sendto posiada taką możliwość). Podobnie przy odbieraniu
datagramów, zwłaszcza serwer powinien znać adres nadawcy datagramu (daję
taką możliwość funkcja recvfrom).
W przypadku gniazdek datagramowych jest możliwość skorzystania z trybu
połączeniowego. W rzeczywistości nie jest to prawdziwy tryb połączeniowy -
między gniazdkami nie jest zestawiane żadne wirtualne połączenie. Jedynie
lokalnie do gniazdka (przy pomocy funkcji connect) przypisać można adres
odległego gniazdka. Od tej pory wszystkie datagramy będą wysyłane do tego
jednego gniazdka - nie trzeba więc podawać adresu przy każdym datagramie.
Tryb połączeniowy gniazdek datagramowych ma sens jedynie po stronie
klienta.
Rysunek 3. Operacje na gniazdkach
Pisaliśmy o numerach portów jako o adresach identyfikujących aplikację
w systemie. W rzeczywistości numer portu identyfikuje jedno gniazdko, a
ponieważ jeden proces może ich otworzyć więcej, dlatego poprzednia
definicja jest nieścisła.
część IV
http://www.e-marketing.pl/
Justyna Szumacher (justsz@webmaster.pl)
Wyszukiwarka
Podobne podstrony:
Warstwowy model architektury internetowej, cz IVWarstwowy model architektury internetowej, cz IWarstwowy model architektury internetowej, cz IIWarstwowy model architektury internetowej, cz IIWarstwowy model architektury internetowejWarstwowy model architektury internetowejLIMS system zarządzania działalnością laboratorium Cz III Uprawnienia i rozwiązania indywidualneAlgorytmy i złożoność cz IIIProblemy bohaterów Dziadów cz III i Wesela wobec proble~963o Wstęp do cz III Czy myślimy matematyczniePrawo rzymskie cz III prawo osobowe z czynnościami prawnymiZabawa w detektywa Jak zidentyfikować kogoś w internecie cz 1kurs od marzenia do sukcesu cz iiiJezyki i paradygmaty cz IIIwięcej podobnych podstron