Warstwowy model architektury internetowej
Warstwowy model architektury internetowej
Andrzej Sopala
Materiał 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
Czym jest Internet nie trzeba wyjaśniać osobom, które tu zajrzały. Czym
innym jednak jest wiedza na temat zastosowań Internetu i umiejętność sprawnego
korzystania ze wszystkich jego możliwości, a czym innym wiedza o architekturze
Internetu, budowie oprogramowania sieciowego, wykorzystywanych protokołach i
innych szczegółach.
Opiszemy tu działanie Internetu. Nie będą to bardzo szczegółowe i
teoretyczne rozważania. Będą to podane w skrótowej formie informacje,
terminy i zasady - niezbędne minimum, z którym powinien się zapoznać Czytelnik,
chcący nauczyć się pisania programów Internetowych.
Najpierw krótko omówimy najważniejsze pojęcia związane z Internetem, powiemy
czym on jest od strony technicznej. Później przyjrzymy się warstwowej budowie
oprogramowania Internetowego. Poznamy funkcje każdej z warstw i ich
współpracę ze sobą.
1.
Intersieć
Siecią komputerową nazywamy zbiór komputerów i innych urządzeń połączonych
ze sobą przy pomocy pewnego medium, które umożliwia im komunikowanie się ze
sobą. Fizyczna sieć komputerowa to taka, której składniki połączone są fizycznie
i komunikują się przy pomocy tego samego medium i zestawu protokołów niskiego
poziomu np. Ethernet.
Ze względu na zajmowany obszar, sieci komputerowe dzielimy na:
LAN - sieci lokalne; rozpiętość do kilkuset metrów, najczęściej
umiejscowione na terenie jednego budynku;
MAN - sieci metropolitalne; rozpiętość do kilkunastu kilometrów,
najczęściej umiejscowione na terenie miasta, łączy budynki;
WAN - sieci rozległe; bez granicy rozpiętości; może łączyć nawet
kontynenty.
Internet nie jest siecią fizyczną. Realizuje on koncepcję tzw. intersieci
(ang. internet), czyli sieci łączącej sieci (fizyczne) wszystkich powyższych
typów. Opracowano specjalny protokół IP (Internet Protocol), którego głównym
zadaniem jest przekazywanie danych (pakietów IP) pomiędzy sieciami i kierowanie
ich do właściwej sieci i komputera. Wykonują to komputery zwane routerami, z
których każdy należy do kilku (przynajmniej dwóch) sieci fizycznych. Komunikacja
w Internecie oparta jest więc na technice komutacji pakietów - oznacza to, że
pomiędzy dwoma komputerami nie jest zestawiane fizyczne połączenie (komutacja
kanałów - jak w telefonii klasycznej), ale połączenie jest symulowane poprzez
wymianę pakietów.
2.
Warstwowy model architektury internetowej
W teorii sieci komputerowych bardzo ważne miejsce zajmuje tzw. warstwowy
model sieci. Najczęściej opisuje się go korzystając z - mającej raczej
teoretyczne znaczenie - architektury ISO-OSI, która wyróżnia 7 warstw. Warstwy
są to oddzielne części oprogramowania sieciowego (realizującego funkcje
komunikacyjne, organizującego sieć). Jedna warstwa odpowiada za pewną część
funkcji i "kompetencji". Dostarcza usług warstwie wyższej i korzysta z usług
warstwy niższej. Taki modułowy podział oprogramowania sprzyja większej
elastyczności konkretnych rozwiązań. Łatwiej jest wymienić jeden moduł niż
konstruować od początku całe oprogramowanie sieci.
Ten nieco abstrakcyjny wstęp wyjaśni się już za chwilę, kiedy opiszemy model
warstwowy oprogramowania Internetowego.
Internet korzysta z protokołu TCP/IP. Budowę oprogramowania realizującego ten
protokół można podzielić na cztery warstwy (od najniższej):
warstwa dostępu do sieci,
warstwa internet (nazywana inaczej sieciową, międzysieciową lub warstwą
IP),
warstwa transportowa,
warstwa zastosowań (nazywana inaczej warstwą aplikacji).
Warstwa zastosowań (aplikacji)HTTP, FTP, SMTP
Warstwa transportowaTCP UPD
Warstwa Internet (międzysieciowa)IP, ICMP
Warstwa dostępu do sieciEthernet, PPP, SLIPRysunek
1. Architektura TCP/IP
Warstwa dostępu do sieci odpowiada za dostarczanie danych do innych
urządzeń bezpośrednio dołączonych do sieci. Współpracuje ona bezpośrednio ze
sprzętem i sterownikami odpowiedzialnymi za współpracę z siecią. W sieci
lokalnej mogą to być Ethernet lub Token-Ring (różne rozwiązania sieci
lokalnych). W przypadku innych sieci mogą to być protokoły PPP, SLIP lub inne.
Warstwa ta współpracuje więc z interfejsem sieciowym (kartą sieciową), modemem
lub innym urządzeniem pozwalającym na bezpośrednie połączenie dwóch lub więcej
komputerów i separuje resztę warstw od zastosowanych rozwiązań fizycznych
(niskopoziomowych). Świadczy ona usługę warstwie wyższej polegającą na wysyłaniu
i odbieraniu porcji danych (zwanych ramkami) z komputerów w danej sieci
fizycznej. Nie będziemy się więcej zajmować tą warstwą.
Warstwa internet (IP) odpowiada za dostarczanie danych do urządzeń
nie tylko w danej sieci fizycznej. Organizuje ona ruch tzw. pakietów IP między
poszczególnymi sieciami fizycznymi połączonymi w intersieć. Korzysta z usług
warstwy dostępu do sieci, sama zaś świadczy usługi dostarczania pakietu do
dowolnego komputera w Internecie. Napiszemy o niej więcej w kolejnym
podrozdziale.
Warstwa transportowa odpowiedzialna jest za niezawodną wymianę danych
z dowolnym komputerem w Internecie. Organizuje też i utrzymuje tzw. sesje, czyli
wirtualne połączenia między komputerami. Korzysta z warstwy IP, sama zaś
dostarcza usług niezawodnego transportu danych. Tę warstwę opiszemy dalej.
Warstwa zastosowań jest najwyżej położona. Tej warstwie odpowiadają
wszelkie programy (aplikacje) Internetowe korzystające z warstwy transportowej.
Tu znajdują się wszelkie konkretne zastosowania Internetu - przesyłanie plików
(FTP), poczty (SMTP) i inne. Najwięcej napiszemy o tej właśnie warstwie - w tym
i kilku następnych rozdziałach.
Rysunek 2. Współpraca międzywarstwowa w TCP/IP
Jak już wspomnieliśmy współpraca między warstwami polega na świadczeniu
usług przez warstwy niższe warstwom wyższym. Związane to jest także z przepływem
danych w dół sterty warstw (przy wysyłaniu danych) i w górę (przy odbieraniu).
Moduł warstwy zastosowań (najczęściej program użytkownika) wysyła dane do
warstwy transportowej. Ta odpowiednio formatuje je (dzieli lub łączy, dodaje
nagłówek) i wysyła do warstwy IP. Ta z kolei dodaje swój nagłówek i wysyła do
warstwy dostępu do sieci. Jak już się domyślamy i ta warstwa dołącza swój
nagłówek (związany ze sprzętowym rozwiązaniem komunikacji, np. tzw. nagłówek
MAC) i wysyła pakiet fizycznie do sieci. Podobna droga, ale w drugą stronę,
czeka dane w komputerze je odbierającym. Pakiet wędruje ku górze i jest
pozbawiany odpowiednich nagłówków, by wreszcie dotrzeć do warstwy zastosowań w
formie identycznej porcji danych jaką wysłała warstwa zastosowań w komputerze
wysyłającym.
Przedstawiony wyżej opis jest faktycznym obiegiem danych. W koncepcji warstw
istnieje jeszcze coś takiego jak wirtualny (logiczny) obieg danych. Występuje on
pomiędzy odpowiadającymi sobie warstwami w odległych systemach. Warstwy dostępu
do sieci wymieniają między sobą ramki - tu jeszcze wspomniana wirtualność jest
mało widoczna. Warstwy IP wysyłają do siebie pakiety IP - choć w rzeczywistości
muszą się ze sobą komunikować poprzez swoje niższe warstwy, to z logicznego
punktu widzenia istnieje między nimi wirtualne połączenie, które pozwala na
wymianę pakietów. Podobnie jest z warstwami transportowymi, które wysyłają
między sobą poprzez swój wirtualny kanał pakiety danych (segmenty TCP) i inne
komunikaty zapewniające utrzymanie sesji i niezawodne dostarczenia danych
(potwierdzanie). Najciekawszym dla nas jest fakt istnienia wirtualnego
połączenia między warstwami zastosowań. Między nimi istnieje kanał pozwalający
na wysyłanie strumienia danych w obie strony. Tę warstwę stanowią najczęściej
programy Internetowe i z ich punktu widzenia istnieje bezpośrednie połączenie
strumieniowe z innym programem działającym na komputerze odległym. Dzięki temu
programista nie musi znać budowy i zasady działania warstw niższych - musi
jedynie poznać usługi świadczone przez warstwę transportową. Mimo to pokrótce
omówimy dwie środkowe warstwy.
2.1.
Warstwa IP
Warstwa IP jest podstawą architektury Internetowej. Zapewnia dostarczanie
pakietów do dowolnego komputera dołączonego do sieci Internet. Każdy komputer w
Internecie nazywać będziemy hostem.
Przy przekazywaniu pakietów warstwa IP korzysta z protokołu IP (Internet
Protocol). Na protokół ten składają się operacje:
kierowania pakietu do właściwej sieci i hosta (routing),
tłumaczenia adresów hostów na adresy fizyczne związane z daną siecią
fizyczną (protokół arp),
segmentacji i składania pakietów.
Routing, czyli kierowanie pakietu do odpowiedniego hosta polega na
takim wyznaczaniu trasy pakietu, aby dotarł on do przeznaczenia w możliwie
krótkim czasie (i w ogóle żeby dotarł). Pakiet, aby dojść do adresata, przejść
musi przez kilka fizycznych sieci komputerowych - konkretnie przez specjalne
komputery zwane routerami. To one realizują algorytmy wyznaczania trasy pakietu.
Należy zaznaczyć, że algorytmy routingu są rozproszone, czyli nie istnieje jakiś
specjalny ośrodek (komputer) w Internecie, który zna położenie wszystkich
hostów. Wiedza o tym jest "podzielona" między routerami, które przy pomocy
specjalnych komunikatów potrafią ją sobie przekazywać. W tej książce nie
będziemy się zajmować problemami routowania.
Protokół IP nazywany jest zawodnym, gdyż nie zapewnia dostarczenia
pakietu do odbiorcy. Host nadający wysyła pakiet i od tej pory nie ma nad nim
żadnej kontroli - nie wie, czy dotarł on do odbiorcy, czy nie. Nie ma żadnych
potwierdzeń, ani żądań powtórnej transmisji pakietu. Pakiet może "zniknąć" (nie
dotrzeć do adresata) przy bardzo obciążonej sieci. Podobnie jest z kolejnością
pakietów - tu również ujawnia się zawodność protokołu. Nie gwarantuje on, że
pakiety dotrą do odbiorcy w takiej samej kolejności w jakiej zostały wysłane.
Zawodność protokołu IP nie jest jednak jego niedogodnością. Dzięki temu
implementacja protokołu jest prosta, a niezawodność dostarczania danych zapewnia
warstwa transportowa.
Warstwa IP korzysta również z protokołu ICMP, który steruje pracą sieci.
Zapewnia on między innymi:
sterowanie przepływem (host odbiorczy lub router może wysłać do nadawcy
pakietów komunikat z żądaniem ograniczenia ilości wysyłanych pakietów);
sprawdzanie osiągalności danego hosta w Internecie;
wspomaganie routowania.
2.1.1.
Adresy IP
Nie będziemy tu szczegółowo opisywać warstwy IP - z reguły wiedza o tej
części oprogramowania sieciowego nie jest potrzebna przy konstruowaniu typowych
aplikacji Internetowych. Jednak istnieje pewien aspekt związany z tą warstwą,
który trzeba koniecznie znać, aby napisać nawet najprostszy program korzystający
z protokołu TCP/IP. Tym ważnym elementem są adresy IP.
Każdy host w Internecie posiada swój unikalny na skalę całego Internetu
numer (adres) IP. Składa się on (w obecnej wersji 4. protokołu) z 32 bitów (4
bajtów). Numer ten identyfikuje nie tylko pojedynczy host, ale przede wszystkim
sieć fizyczną do której jest on podłączony. Konkretnie adres IP składa się z
adresu sieci i adresu hosta w ramach tej sieci. Komputer przeniesiony do innej
sieci musi mieć zmieniony adres IP.
Istnieją cztery klasy adresów IP:
Klasa A - przedrostek: 0; 7 bitów na adres sieci; 24 bity na adres hosta.
Klasa B - przedrostek: 10; 14 bitów na adres sieci; 16 bitów na adres
hosta.
Klasa C - przedrostek: 110; 21 bitów na adres sieci; 8 bitów na adres
hosta.
Klasa D - przedrostek: 1110; 28 bitów na adres rozgłoszeniowy.
Struktura adresu, czy przynależność adresu do danej klasy nie są sprawami
istotnymi w czasie pisania programów Internetowych. Program taki dostaje adres
IP i niewiele więcej go "obchodzi". Interpretacją adresu zajmuje się właśnie
warstwa IP. Adresy najczęściej zapisuje się w postaci czterech bajtów. W
pamięci umieszczone są w tzw. sieciowym porządku bajtów (z reguły nie ma
potrzeby bezpośrednio "grzebać" w pamięci, w której zapisany jest adres - są
odpowiednie funkcje, które zapisują i odczytują adres z pamięci). Adres IP
zapisuje się często w postaci tekstowej w formacie tzw. zapisu dziesiętnego z
kropkami. Są to cztery bajty zapisane dziesiętnie oddzielone od siebie kropkami
np.:
153.19.40.230Do
konwersji między tymi postaciami służą funkcje inet_addr (z tekstu na
postać w pamięci) oraz inet_ntoa (odwrotnie). Opisujemy je w książce, w
częściach poświęconych systemom UNIX i Windows.
Kilka adresów (zakresów adresów) jest zarezerwowanych dla specjalnych celów.
Spośród nich jednym z ważniejszych jest adres 127.0.0.1, który zawsze wskazuje
na host lokalny, czyli na samego siebie.
Klasa D adresów wskazuje na jeszcze jedną możliwość protokołu IP -
transmisję rozgłoszeniową. Nie jest ona często stosowana w typowych, prostych
programach internetowych - nie będziemy się tym tematem zajmować.
2.2.
Warstwa transportowa
Warstwa IP nie współpracuje bezpośrednio z programem użytkownika
umiejscowionym w warstwie zastosowań. Pomiędzy nimi znajduje się warstwa
transportowa. Warstwa ta ma w ogólności za zadanie zorganizować transport danych
przekazanych z warstwy zastosowań do warstwy zastosowań w hoście odległym.
Warstwa transportowa korzysta przy tym z usług warstwy IP, której usługi - jak
napisaliśmy - są zawodne. Musi więc sama zapewnić niezawodność przesyłanych
danych. Realizuje to protokół TCP. W warstwie transportowej znajduje się też
protokół nie zapewniający niezawodności, korzystający bardziej "surowo" z usług
warstwy IP - mianowicie UDP. Oba opiszemy dokładniej.
2.2.1.
Protokół TCP
TCP (Transmission Control Protocol) realizuje transmisje w trybie
połączeniowym. Oznacza to, że między komunikującymi się hostami zestawiane jest
wirtualne połączenie. Protokół TCP utrzymuje to połączenie i zapewnia
niezawodny transfer danych między hostami. Realizowane jest to poprzez
operacje potwierdzania pakietów i retransmitowania pakietów zagubionych.
Dokonują tego specjalne algorytmy. W rezultacie program wysyłający dane może
mieć pewność ich dostarczenia do odległego hosta.
Utworzone połączenie wirtualne zapewnia kanał transmisji, w którym dane
przyjmują postać strumienia bajtów. Konkretnie są to dwa strumienie, gdyż
transmisja jest dwustronna. Strumień ten nie ma żadnej struktury, nie jest
podzielony na żadne rekordy lub inne mniejsze części. Oczywiście przesyłany jest
on przy pomocy pakietów (porcji danych) jednak podział strumienia na mniejsze
części danych dokonywany przez protokół TCP nie powinien być wiążący dla strony
odbierającej. Nadal powinna ona traktować nadchodzące we fragmentach dane jako
część strumienia. Jest to dość ważna uwaga - przekonamy się o tym przy
konstruowaniu konkretnych programów - protokół TCP nie zawsze zachowuje podział
danych jaki mu sugeruje warstwa zastosowań po stronie wysyłającej. Czasem łączy
mniejsze fragmenty, czasem dzieli większe. Przykładowo jeśli program wysyła dwa
komunikaty bezpośrednio następujące po sobie, warstwa transportowa może je
wysłać w jednym pakiecie. Program odbierający, jeśli zastosuje proste odbieranie
danych, może potraktować porcję danych jako jeden komunikat i w rezultacie
nastąpi błąd.
Dodatkowo protokół TCP zapewnia obsługę tzw. danych pilnych OOB (ang. urgent
data Out-Of-Band). Są to dane przekazywane poza normalnym strumieniem danych,
obok niego. Jeśli np. strona wysyłająca wysłała 100 bajtów w normalnym trybie, a
odbierająca odebrała dopiero 10 (reszta czeka w buforach wewnętrznych strony
odbierającej - tj. zatrzymała się w jednej z warstw), do tego należy się
spodziewać, że nieprędko pobierze następne (np. długo przetwarza otrzymane dane)
to strona nadająca nie ma możliwości skontaktować się (powiadomić o czymś)
strony odbierającej do czasu "przetrawienia" przez nią wszystkich danych.
Wprowadzono możliwość wysyłania komunikatów poza kolejką. Wysłane w tym trybie
dane pojawią się na początku danych "nie przetrawionych" przez stronę
odbierającą. Tym sposobem następna operacja czytania danych z warstwy
transportowej po stronie odbierającej, zwróci dane pilne. W rzeczywistości
rzadko się korzysta z możliwości przesyłania danych pilnych, ich zastosowanie
komplikuje program i protokół warstwy zastosowań. Należy się wystrzegać
stosowania tej możliwości, jeśli dany problem można rozwiązać stosując
wyłączenie podstawowy strumień. Spośród popularnych protokołów warstwy
zastosowań jedynie TELNET używa danych pilnych i to tylko w wyjątkowych
przypadkach. W niniejszej książce bardzo mało miejsca poświęcimy obsłudze danych
pilnych.
Podsumowując: Protokół TCP dostarcza niezawodny, połączeniowy, strumieniowy
system transmisji danych.
2.2.2.
Protokół UDP
Protokół UDP (User Datagram Protocol) jest dużo prostszym protokołem od TCP.
Korzysta w sposób mniej wyszukany z warstwy IP. - Wysyła dane z warstwy
zastosowań niemalże bez żadnych dodatkowych operacji do warstwy IP. Jedynie
dodaje krótki nagłówek m.in. z numerem portu (o numerach portów piszemy niżej).
Można więc powiedzieć, że dane wysłane przy pomocy tego protokołu wędrują więc
po sieci jako pakiety IP. Protokół UDP ma więc podobne wady i zalety jak IP.
Jest przede wszystkim zawodny - i o tym trzeba zawsze pamiętać. Warstwa
zastosowań wysyłając datagram nie ma żadnej pewności, że ten dotrze do adresata
i że kolejność odbierania datagramów będzie taka jak nadawania. Musi więc sama
zapewniać mechanizmy niezawodności (potwierdzanie, retransmisję itp.). Dlaczego
więc wprowadzono ten protokół? - Ze względu na zalety protokołu IP, które UDP
przejmuje. Jest to przede wszystkim szybkość. Protokół TCP "traci" dużo czasu na
operacje zarządzania połączeniem, potwierdzania danych i retransmisji pakietów
utraconych. Czas ten jest niedopuszczalny dla niektórych zastosowań. Niektóre
programy korzystają z UDP, zwłaszcza jeśli:
"zależy im na czasie", czyli stosują protokół czasu rzeczywistego (np.
daytime);
stosują bardzo prosty protokół warstwy zastosowań: jedno pytanie, jedna
odpowiedź - wtedy odpowiedź jest jednocześnie potwierdzeniem dostarczenia
pytania;
utrata jednego lub kilku datagramów nie jest rzeczą "tragiczną" (np. w
protokołach transmisji głosu będą krótkie przerwy w transmisji).
z różnych innych względów korzystniej jest skonstruować algorytm
zapewniania niezawodności, niż korzystać z protokołu TCP;
Podsumujmy: Protokół UDP dostarcza zawodnej, bezpołączeniowej usługi
przesyłania datagramów.
Bardziej skupimy się tu na protokole TCP - jako częściej używanym i
popularniejszym.
2.2.3.
Porty
Pisaliśmy o adresach IP - określają one jednoznacznie komputer w sieci
Internet. Dzięki temu pakiety IP potrafią dotrzeć do odpowiedniego komputera.
Nie jest to jednak wystarczające. Często na jednym komputerze pracuje kilka
aplikacji, które korzystają z Internetu. Gdybyśmy używali jedynie adresów IP
jako identyfikatora adresata, system nie wiedziałby do której aplikacji odebrane
dane są skierowane. Warstwa transportowa wprowadza pojęcie portów. Port jest
dodatkowym polem adresowym, które identyfikuje proces na komputerze odbiorczym.
Dzięki temu host "wie" dokąd (do którego programu) ma przekazać dane.
Porty są numerowane przy pomocy 16-bitowej liczby dodatniej i w praktyce są
częścią (wraz z adresem IP) adresu internetowego. W interfejsach
programistycznych istnieje struktura sockaddr_in, która mieści adres IP oraz
numer portu. Porty w pamięci zapisuje się w tzw. sieciowym porządku bajtów.
Różne komputery w różny sposób zapisują w pamięci wartości kilkubajtowe - raz
młodszy bajt zajmuje niższy adres, innym razem jest odwrotnie. Sposób wymiany
wartości kilkubajtowych (np. portów w nagłówkach warstwy transportowej) jest
oczywiście w standardach sieci dokładnie określony - najpierw bajt starszy,
potem młodszy. Nie musimy tego pamiętać, konwersję między różnymi postaciami
zapisu (zapis komputerowy i zapis sieciowy) realizują za nas odpowiedni funkcje,
które jednak trzeba jawnie użyć. W przypadku numerów portów będą to funkcje
htons (z komputerowego na sieciowy) oraz ntohs (odwrotnie) - będziemy dalej
opisywać te funkcje. Należy pamiętać o konwersji postaci numerów portów - częste
źródło błędów logicznych.
Numery portów pełnią ważną funkcję w zastosowaniach Internetu. Każda
standardowa usługa (np. http, POP3, TELNET) ma przypisany ogólnie znany numer
portu, który identyfikuje na danym hoście program odpowiedzialny za jej
udzielenie. Należy więc pamiętać o tym, aby nowym usługom, stworzonym na
potrzeby jednego programu przydzielać numery różne od zarezerwowanych na
standardowe usługi. Bezpiecznie jest używać numerów portów większych od 1024.
Przestrzenie adresowe portów dla protokołów TCP i UDP są odrębne. Oznacza
to, że można używać jednocześnie jednakowego numeru w stosunku do protokołów TCP
i UDP. Nie wchodzą sobie one w drogę.
3.
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.
3.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.
3.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.
3.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.
3.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.
4.
Warstwa zastosowań
Warstwę zastosowań stanowią najczęściej programy użytkownika i programy
użytkowe systemu operacyjnego. Korzystają one z warstwy transportowej poprzez
interfejs gniazdek. Programy te po obu stronach porozumiewają się ze sobą przy
pomocy protokołu warstwy zastosowań. Istnieje wiele standardowych protokołów
realizujących różne usługi (HTTP, SMTP, FTP i wiele innych) - wszystkie
standardowe protokoły opisane są w dokumentach RFC (Request for Comments),
dostępych na większych i poważniejszych serwerach FTP, zwłaszcza na serwerach
instytucji akademickich. Programy mogą korzystać również z niestandardowych
protokołów, tworzonych do konkretnych zastosowań i konkretnych programów.
Wszystkie te protokoły (standardowe i niestandardowe) definiują sposób
komunikacji między programami przy zastosowaniu niezawodnego połączenia
strumieniowego (TCP) lub zawodnego przesyłania datagramów. W książce opisaliśmy cztery
popularne protokoły warstwy zastosowań (POP3, SMTP, HTTP oraz FTP) oraz
zdefiniowaliśmy na własny użytek protokół rozmów internetowych NaszChat, który
posłużył jako podstawa do konstruowania dużej części przykładów.
5.
Nazwy domenowe, usługa DNS
Dla pełnego obrazu podstaw funkcjonowania Internetu pozostało nam omówienie
ważnej usługi tłumaczenia nazw hostów na adres IP. Każdemu hostowi w Internecie
przypisać można nazwę domenową (dziedzinową). Ma ona postać oddzielonych od
siebie kropkami nazw poszczególnych domen. Od najbardziej ogólnej, umieszczonej
na końcu, aż po nazwę komputera umieszczoną na początku. Ostatni człon
najczęściej określa kraj, gdzie umieszczony jest host (nie dotyczy to USA).
Przedostatni (a ostatni w USA) najczęściej dotyczy ogólnej dziedziny życia,
gospodarki, którą zajmuje się organizacja, do której należy host (np. edu -
edukacja; com - komercyjny; org - organizacje). Kolejne od końca człony są już
nazwami własnymi organizacji. Przykładem nazw hostów są: www.yahoo.com
polbox.com
ftp.pg.gda.pl
qwerty.ds2.pg.gda.pl
www.uj.edu.pl
Szczególną nazwą hosta jest "localhost", która zawsze oznacza komputer
lokalny - podobnie jak adres IP postaci "127.0.0.1" (patrz Adresy IP).
Użytkownik Internetu najczęściej określa host przy pomocy nazwy domenowej.
Stosowanie adresów IP - choć również poprawne - nie jest wygodne. Z kolei
interfejs gniazdek może obsługiwać jedynie adresy IP. Aplikacja internetowa
staje więc przed problemem tłumaczenia nazwy domenowej na adres IP. Korzysta
przy tym z usługi DNS (Domain Name Service) - umiejscowiona jest ona w warstwie
zastosowań. Usługa DNS oparta jest na sieci serwerów DNS, które stanowią
rozproszoną bazę nazw domenowych wszystkich hostów w Internecie. Aplikacja,
która chce przetłumaczyć nazwę hosta na jego adres IP kontaktuje się z
najbliższym serwerem DNS, wysyłając zapytanie. Ten jeśli zna odpowiedź od razu
odpowiada; jeśli nie zna - zadaje pytanie innemu serwerowi DNS, lub odsyła do
niego. Protokół i sieć serwerów DNS jest w ten sposób zaprojektowana, że żadne
pytanie nie zostanie bez odpowiedzi - system w skończonym czasie znajdzie dany
host, oczywiście jeśli dana nazwa istnieje.
Na szczęście programista nie musi znać szczegółów usługi DNS. Interfejs
gniazdek udostępnia funkcje, dzięki którym zamiana nazwy hosta na adres IP i
odwrotnie jest trywialna. Służą do tego funkcje gethostbyname (zamiana nazwy na
adres) i gethostbyaddr (odwrotnie). Więcej o tych funkcjach napiszemy przy
omawianiu konkretnych interfejsów gniazdek.
6.
Podsumowanie
Ten krótki opis funkcjonowania Internetu i oprogramowania składającego się
na niego, powinien przygotować Czytelnika do lektury książki. Nie wszystkim
jednak się w niej zajeliśmy. Spośród opisywanych tu kwestii, w książce
zajmowaliśmy się jedynie stykiem warstwy transportowej i zastosowań oraz samą
warstwą zastosowań. W każdej części książki poświęconej konkretnemu systemowi
omówiliśmy usługi oferowane przez warstwę transportową - gniazdka, struktury i
typy danych, funkcje na nich operujące itp. Przygotowaliśmy przykładowe
programy, które z racji swych funkcji umieścić można w warstwie zastosowań
(aplikacji).
Andrzej Sopala jest studentem Informatyki na Wydziale Elektroniki,
Telekomunikacji i Informatyki Politechniki Gdańskiej o specjalności
Przetwarzanie Równoległe i Rozproszone.
POWRÓT
STRONA-OS
Wyszukiwarka
Podobne podstrony:
Warstwowy model architektury internetowejWarstwowy model architektury internetowej, cz IVWarstwowy model architektury internetowej, cz IWarstwowy model architektury internetowej, cz IIIWarstwowy model architektury internetowej, cz IIWarstwowy model architektury internetowej, cz II2 Model warstwowy szacowanieF 1 Tranzystor IGBT model warstwowyModel Warstwowy OSIF 8 Model warstwowy tranzystora MOSInternet Archive Search subject ?coration and ornament, ArchitecturalF 2 Model warstwowy PNFETRzutparteru Model (1)Internet Pierwsza pomocwięcej podobnych podstron