Podłączenie sieci lokalnej do Internetu

5/5 - (1 vote)

Praca inżynierska

Łącze z Internetem

Aby połączyć sieć lokalną z Internetem, w pierwszej kolejności wybrać należy rodzaj tego połączenia adekwatnie do potrzeb, możliwości technicznych oraz zasobów finansowych.

Modem analogowy

Analogowe łącze komutowane jest to najprostszy i na krótką metę obecnie chyba najtańszy sposób na połączenie z Internetem. Jego podstawową wadą jest mała szybkość transmisji, niska niezawodność oraz fakt zajęcia linii telefonicznej podczas połączenia modemowego. Opłata za połączenie jest zależna od czasu jego trwania. Największą prędkością, jaką można przy wykorzystaniu tego rodzaju połączenia uzyskać, jest teoretycznie 56 kb/s, ale praktycznie prędkość transmisji rzadko przekracza 40 kb/s.

Modem ISDN

ISDN (Integrated System Digital Network)jest łączem cyfrowym złożonym z dwóch kanałów o prędkości 64 kb/s każdy. Można, więc przy jego wykorzystaniu uzyskać połączenie z prędkością 128 kb/s lub 64 kb/s przy jednoczesnym korzystaniu z telefonu. Wadą tego rozwiązania są wyższe koszty eksploatacji (droższe są połączenia telefoniczne) w porównaniu z linią analogową.

HIS czyli SDI

Usługą, którą Telekomunikacja Polska S.A. Zaczęła oferować polskim internautom, jest tania oferta połączenia stałego z Internetem opartego na rozwiązaniu firmy Ericsson – HIS (Home Internet Solution) i zwane w TPSA – SDI (Szybki Dostęp do Internetu). Usługa ta zapewnia dostęp z prędkością 115.2 kb/s. Taka szybkość wystarcza do połączenia z Internetem sieci złożonej już z kilku komputerów. Oczywiście wydajność takiego połączenia w przeliczeniu na jeden komputer będzie tym mniejsza, im więcej komputerów będzie z niego jednocześnie korzystać.

Technologia przesyłu danych jest podobna do linii ISDN. SDI umożliwia jednoczesne korzystanie z podłączonego telefonu, lecz w takim wypadku prędkość połączenia spada do 70 kb/s.

Jest to obecnie najtańsza na rynku oferta połączenia stałego, której dodatkową zaletą jest stały, widziany z zewnątrz adres IP, co oznacza, że możliwe jest postawienie własnego prostego serwera internetowego.

Więcej informacji można znaleźć na stronach Telekomunikacji Polskiej S.A. pod adresem http://www.tpsa.pl oraz witrynie firmy Ericsson (http://his.ericsson.pl).

Modem kablowy

Ofertą przedstawianą coraz częściej przez telewizje kablowe jest dołączenie do Internetu przez łącze stałe.

Połączenie to jest wykonywane przy pomocy tzw. modemu kablowego umożliwiającego transmisję danych po kablu telewizyjnym. Rozwiązanie to jednak jest jak dotąd mało rozpowszechnione prawdopodobnie ze względu na wysokie koszty takiego rozwiązania. Należy jednak przypuszczać, że w najbliższych latach technologia ta się rozwinie.

xDSL

Jest to technologia dzierżawionych łącz stałych umożliwiająca, przy pomocy modemów z rodziny DSL (Digital Subscriber Line), uzyskanie transmisji danych po parze miedzianej wydzielonej specjalnie do tego celu.

ADSL (Asymmetric DSL) – polega na podziale pasma wykorzystywanego do transmisji na tzw. UpLink i DownLink. Wykorzystuje się tu fakt, że przeciętny użytkownik Internetu pobiera z Sieci znacznie więcej danych, niż do niej wysyła. Umożliwia to przydzielenie większej szerokości pasma dla transmisji do internauty oraz mniejszej dla transmisji od niego, co skutkuje różną przepustowością łącza w każdym kierunku. Szybkość transmisji zależy również oczywiście od długości pary miedzianej oraz jakości kabla i zakłóceń zewnętrznych.

W chwili gdy piszę te słowa, TPSA wprowadza nową usługę pod nazwą „neostrada” będącą ofertą stałego dostępu do Internetu przy wykorzystaniu technologii ADSL. Przepustowość UpLink’a ma w założeniu wynosić 64 kb/s zaś DownLink’a do 256 kb/s.

RADSL (Rate Adaptive DSL) – opiera się na technologii ADSL. Jej cechą charakterystyczną jest możliwość negocjacji przez modemy prędkości połączenia w zależności do jakości linii.

SDSL (Single line DSL) – zapewnia symetryczną transmisję dwukierunkową po jednej parze przewodów miedzianych z prędkością 2 Mb/s.

HDSL (High data rate DSL) – umożliwia transmisję z prędkością 2 Mb/s po dwóch parach miedzianych. Jest to starsza wersja SDSL.

Udostępnianie połączenia internetowego w sieci lokalnej

Gdy już mamy zapewnione połączenie z Internetem na jednej maszynie, należy zastanowić się, jak udostępnić to połączenie innym komputerom. Do udostępniania połączenia internetowego w sieci lokalnej można wykorzystać komputer podpięty do sieci lokalnej z jednej strony, oraz drugą kartę sieciową połączoną z Internetem. Aby Internet był widziany z sieci lokalnej należy zastosować oprogramowanie wykorzystujące technologię NAT lub tzw. proxy serwer.

Można również wykorzystać mechanizm dzielenia połączenia modemowego wbudowany w drugą edycję systemu MS Windows 98/XP.

Dużo lepszym jednak rozwiązaniem (dającym dużo większe możliwości zwłaszcza, jeśli dysponujemy stałym łączem do Internetu) jest uruchomienie osobnej maszyny zajmującej się tylko umożliwieniem dostępu do Sieci (ew. udostępniającymi również inne usługi sieciowe) pracującej pod którymś z systemów uniksowych np. pod systemem Linux. Jej uruchomienie będzie na pewno dużo trudniejsze, niż uruchomienie udostępniania połączenia pod Windows, lecz w wielu wypadkach będzie się to bardziej opłacać, gdyż będziemy mieć większą (praktycznie prawie całkowitą) kontrolę nad tym, jakiego rodzaju aplikacjom klienckim umożliwiamy dostęp do Internetu. Rozwiązanie to jest również o wiele wydajniejsze, dużo bardziej niezawodne i bezpieczniejsze z punktu widzenia bezpieczeństwa samej sieci wewnętrznej przed atakami z zewnątrz.

W następnym rozdziale przybliżę państwu proces instalacji sieciowego serwera internetowego, na którym zainstalowany zostanie system LUNUX. W kolejnym rozdziale znajdziecie podstawową konfigurację serwera do pracy w sieci i udostępniania Internetu. Na końcu pracy umieszczona jest konfiguracja usług działających na serwerze: WWW, FTP, MAIL. Poniżej jako ciekawe rozwiązanie pozwoliłem sobie umieścić minidystrybucję linuxa „Freesco”.

Minidystybucja Freesco

Freesco powstało w 1999r.i spełnia rolę jednodyskietkowego routera rozdzielającego Internet w sieci lokalnej. Freesco to system oparty na Linuxie. Ma niewielkie wymagania sprzętowe i może służyć jako router dla łącz SDI, neostrada (pppoe), DSL i innych opartych na dostępie do Internetu przez kartę sieciową lub modem na złączu szeregowym. W podstawowej wersji działa z dyskietki. Może też pełnić funkcję serwera usług (www, e-mail, ssh, ftp i inne). Wymaga komputera z procesorem minimum 386 i 8 MB RAM. Po zakończeniu konfiguracji, nie jest potrzebna karta graficzna, monitor, ani klawiatura (o ile umożliwia to BIOS komputera). Freesco jest też systemem bezpiecznym, ponieważ większość exploitów wymaga kompilatora, a tego we Freesco brak. Poza tym Freesco działa na dyskietce którą po załadowaniu można wyj ąc ze stacji dyskietek i system działa w pamięci komputera.

Linux Freesco doskonale się nadaje do zastosowania wszędzie tam, gdzie niewielkim kosztem potrzeba założyć sprawny i wydajny serwer, a więc w szkołach, małych firmach, sieciach sąsiedzkich.

Freesco easy PL-0.2.7- Dla łącza SDI

założenia:

Router dyskietkowy umożliwiający łatwe skonfigurowanie i uruchomienie osobom, które nigdy wcześniej nie miały do czynienia z Linuxem. Konfiguracja ma umożliwiać dostęp do Internetu kilu komputerom na łączu SDI (lub modemie).

W związku z tym zaimplementowano następujące funkcje:

  • justice, podział łącza między komputery uruchamiany w momencie przekroczenia określonej wartości pobranych danych przez któryś z komputerów w zależności od ilości komputerów aktywnych w sieci;
  • status on line wyświetlany na stronie www, pozwalający użytkownikom na sprawdzenie, kto aktualnie jest włączony do sieci. Na stronie www można jednocześnie zobaczyć, informacje dla użytkowników (w tym przykładowy regulamin sieci) oraz wypisane efekty działania *justice*;
  • atd i synctime – synchronizacja czasu letniego i zimowego;
  • allow, czyli skrypt umożliwiający dostęp do Internetu tylko określonym komputerom;
  • block/unblock, skrypt działający w panelu kontrolnym umożliwiający zablokowanie komputerów (np. w związku z niepłaceniem abonamentu);
  • simple, dodatkowy użytkownik uprawniony do wykonania komendy reboot i halt;
  • setup po polsku

wersja EASY charakteryzuje się uproszczoną konfiguracją – opis działania:

Router na dyskietce uruchamia się z włączonymi usługami:

  • serwer DNS
  • panel kontrolny www i synchronizacja czasu
  • serwer www
  • telnet
  • oidentd usługi włączone są wewnętrznie (dla komputerów w sieci – opcja „s”

[security]) konfiguracja:

  1. Wrzucamy plik exe i feasyPL.img do jednego katalogu i uruchamiamy ten pierwszy
  • wpisujemy nazwę pliku z obrazem, następnie „a” i w ciągu minuty obraz jest już gotowy.

W przypadku systemu linuxowego dd if=FeasyPL.img of=/dev/fd0.

Przypomnę tu, że odtąd każde wpisane polecenie potwierdzamy naciśnięciem klawisza ENTER, a nie kliknięciem myszki.

  1. Uruchamiamy system z dyskietki na komputerze wyposażonym w monitor i klawiaturę, później można pracować bez monitora i klawiatury, jeśli BIOS komputera to umożliwia. Uruchamiamy normalny tryb pracy routera.
  • logujemy się (login: root<enter>, hasło: root<enter>)
  • wpisujemy:dial<enter>
  • nastąpi wykonanie skryptu, który po polsku przeprowadzi nas przez proces konfiguracji łącza SDI lub modemu (jeśli jest to modem zewnętrzny). Urządzenie musi być podpięte do COM1.
  • wpisujemy: config<enter>, żeby skonfigurować sieć i skrypty dzielące połączenie oraz pokazujące komputery w sieci. Serwer domyślnie otrzymuje numer 192.168.1.1, zatem komputery w sieci muszą mieć ustawione numery od 192.168.1.2 do 192.168.1.254 i maskę
  • serwer jest też bramkę i spełnia funkcję serwera DNS. Dlatego w ustawieniach sieci (komputerów klienckich) musimy wpisać numer serwera w odpowiednich okienkach.

Uwaga! Powyższe ustawienia można zmienić używając setupu (po reboocie!), który daje możliwość pełnej konfiguracji. Pamiętać trzeba jednak, że jeśli zmienimy zakres adresów IP np. na 192.168.0.0/24, to ręcznie należy wyedytować plik *allow*, który znajduje się w: /mnt/router/fix, ponieważ w przeciwnym razie żaden komputer w sieci nie będzie miał dostępu do Internetu.

  • wpisujemy passwd<enter> i dwukrotnie wpisujemy nowe hasło dla roota (superużytkownika) za każdym razem potwierdzając je enterem.
  • wpisujemy admpasswd<enter>, żeby zmienić hasło użytkownika admin, który może zarządzać serwerem z poziomu www i podobnie zmieniamy hasło (domyślnie login: admin, hasło: admin)
  • wpisujemy passwd simple<enter>, żeby zmienić hasło użytkownika simple, który uprawniony jest jedynie do wykonania komendy reboot i halt (domyślnie brak hasła, co blokuje logowanie).
  • jeśli chcemy korzystać z Oidenta, wpisujemy config-ident i edytujemy listę komputerów w naszej sieci.

Jest to bardzo istotne jeśli chcemy zapewnić dostęp do IRC, a ponadto zapewnia identyfikację komputerów w sieci w razie ewentualnych problemów.

  • wpisujemy reboot<enter>, żeby ponownie uruchomić serwer.
  1. Po uruchomieniu routera wpisujemy w oknie adresu przeglądarki: adres naszego serwera – strona informacyjna (zawierająca przykład regulaminu).
  • tę stronę można sobie przeredagować używając polecenia: edt /www/index.html

Ponieważ na dyskietce jest obecnie 34 kB wolnego miejsca, więc można umieścić tam wykonaną± przez siebie stronę, wgranie pliku najlepiej używając komendy snarf adres/plik.

Przy czym musimy dysponować zewnętrznym serwerem, na którym umieścimy stronę.

adres.serwera:82/admin.htm – wejście do panelu kontrolnego z trzema możliwościami:

blokada określonych IP, odblokowanie i obsługa panelu (np. przeglądanie logów, zdalny reboot).

nasze.sdi.tpnet.pl:82 – strona, którą zobaczą użytkownicy zablokowani zamiast czegokolwiek, co wywołają. Ta sama strona służy również do pokazania informacji, kto jest online i czy jakieś komputery podlegają ograniczeniom shapera. minimalne wymaganie sprzętowe: procesor – 486 DX2 RAM – 12 MB

sprawna stacja dyskietek

monitor i klawiatura (na czas konfiguracji) modem zewnętrzny lub terminal HIS na porcie COM1 karta sieciowa:

  • PCI na rtl8139, SIS900, RTL 8029
  • ISA zgodna z NE 2000 (ustawienia: IRQ 10 IO 0x300)
  • ISA 3com509 (ustawiona jak wyżej)

Inne karty sieciowe bądź wymagały doinstalowania sterowników i/lub skorzystania z setupu.

Obecna wersja zawiera justice 3.3, poprawiono plik dial dopisując ostrzeżenie przed nadpisaniem pliku i umożliwiając wyjście bez edycji. Plik dial zawiera obecnie wpis IP półki SDI.

Skrypt status online działa po wywołaniu z poziomu www (nie obciąża pamięci).

Dodano również demona oidentd.

Możliwość podpięcia drugiej stacji dyskietek (fd1)

Obsługa kart sieciowych SIS900

Konfiguracja Freesco dla Neostrady+ (RJ45)

Posted on 07-02-2004 o godz. 00:50:22 Topic: Freesco 0.3

Konfiguracja łącza Neostrada+ (RJ45)

  1. Ściągnij z działu download „freesco032.zip”

(lub inne 0.3.x ale wtedy kolejność poleceń może się trochę różnić ) i przygotuj dyskietkę (make fd.bat),

  1. Po uruchomieniu, zaloguj się (użytkownik: root, hasło: root),
  2. Wejdź do setup’u (polecenie 'setup’), setup [enter]

[enter]

pe [enter] #PPPoE/PPtP router:

626 Use PPP over Ethernet connection to ISP (y/n)  []?

y [enter]

PPP over ethernet protocol PPP(o)E or PP(t)P (o/t) ? []?

o [enter]

Do you want to enable a route (y/n) ? []?

n [enter]

611 Hostname of this computer [router]? router [enter]

Ethernet hardware settings (x – exit) []? 0

Nic0 I/O addr (0xHEXADDR or 0 for PCI card or – to disable) [0]?

0 [enter] # jeżeli masz karte PCI PnP

Nic0 IRQ line (decimal number, 0 for PCI card or – to clear) [0]? 0 [enter] # jeżeli masz karte PCI PnP

Ethernet hardware settings (x – exit) []? 1

Nic0 I/O addr (0xHEXADDR or 0 for PCI card or – to disable) []?

0 [enter] # jeżeli masz kartę PCI PnP

Nic0 IRQ line (decimal number, 0 for PCI card or – to clear) []? x [enter]

Uwaga! – Te ustawienia działają w przypadku kart sieciowych na PCI. W przypadku kart ISA należy wpisać konkretne wartości.

621 IP address of interface [10.0.0.20]?

  • 1 [enter]

627 [enter]

627 Use DHCP client to configure network #0  (y/n) [n]?

y [enter]

1 [enter]

  • [enter]
  • Network #1 connected via interface (- disable network) []? eth1 [enter]
  • [enter]
  • IP address of interface []?

192.168.1.1 [enter]

  • [enter]
  • Network mask []?

255.255.255.0 [enter]

Jeżeli chcesz używać serwera DHCP do przydzielania klientom adresów IP to wpisz:

625 [enter]

625 IP range for DHCP server (- disable) []?

  • XX-192.168.1.XX [enter] #tu wpisz przedział IP przydzielanych dynamicznie

x [ente]

Autodetect modems now ? y/n [y]? n [enter]

Do you need the advanced modem setup ? (y/n) [n]?

n [enter]

  • Trust local network 1 (y/s/n) [s]?

s [enter] #i tak przy każdej kolejnej podsieci

  • Trust modem links (y/n) [n]?

n [enter]

41 Enable caching DNS server y/s/n [s]? s [enter]

  • Number of URL’s to cache ? [300]?

[enter]

  • Enable DNS requests logging (y/n) [n]?

n [enter]

  • Do you want to add static IP’s to your DNS file (y/n) [n]?

n [enter]

  • Enable DHCP server y/n [n]?

Jeżeli chcesz używać serwera DHCP do przydzielania klientom adresów IP to wpisz: y [enter]

  • WINS address (if you have one, otherwise -) []?

[enter]

  • Default-lease-time (sec) [604800]?

[enter]

  • Maximum-lease-time (sec) [604800]?

[enter]

  • Do you want to create/edit static dhcp leases (y/n) []?

y [enter] #jeżeli chcemy na sztywno przypisać IP do MAC adresów

  • Enable public HTTP server y/s/n [n]? y [enter]
  • Public HTTP server IP port [80]?

[enter]

  • Enable time server and router control via HTTP y/s/n [s]? s [enter]
  • Control HTTP server IP port [82]?

[ enter]

  • Host Time server address (- disable syncing time) [clock.org]? [enter]
  • Time offset to UTC(GMT) [-0000]?

+0100 [enter] #w zależności od pory roku :> +0100 lub +0200 461 Enable Print Server(s) y/s/n [n]?

[enter]

47 Enable telnet server y/s/n [n]?

[enter]

51 Enable FTP server (y/s/n) [n]?

[enter]

dalej [enter]

50 Do you want to enable the ident server (y/n/s) [n]?

n [enter]#jeżeli korzystamy z Irca moża być konieczne ustawienie na s lub y [enter] dalej [enter]

913 [enter]

  • Primary DNS address (usually your providers DNS) []?

194.204.159.1 [enter]

  • [enter]

914 Secondary DNS address?

194.204.152.34 [enter]

916 [enter]

  • PPP login name (’ clear) []? xxx@neostrada.pl [enter]
  • PPP password (’ clear) []? hasło [enter]

s [enter]

[enter]

[enter]

następuje zmiana haseł na konta root, admin i ppp , należy je koniecznie zmienić [enter] s [enter]

Konfiguracja Ethernet router’a DSL.

  • setup
  • enter
  • E
  • 711 Hostname of this computer []? router
  • 712 Domain name []? interek
  • Autodetect modems now ? y/n [y]? czy posiadamy modem ( jak ktoś by miał się wdzwaniać do naszego serwera ) jeśli posiadamy to dajemy Y jeśli nie to N

Jeśli mamy modem to zostanie wykryty jeśli nie mamy modemu przejść do punktu 8

  • 53 1st modem init string [ATZ]? pozostawiamy ( chyba ze nasz modem potrzebuje jakiś specjalnych ustawień )
  • 8xx How many network interface cards do you have (1-3) []? ilośc

kart sieciowych 2

  • 811 I/O port address of 1st ethernet card [0x300]? I/O karty jeśli PCI to nas to nie interesuje
  • 812 IRQ line of 1st ethernet card [10]? jak wyżej
  • 821 I/O port address of 2nd ethernet card [0]? to samo tyle że dla 2 karty
  • 822 IRQ line of 2nd ethernet card [0]? jak wyżej
  • 720 Use DHCP client to configure 1st network interface y/n [n]? jeśli mamy dynamiczne IP to dajemy Y jeśli statyczne to N
  • 721 Interface name of 1st network, eth0/eth1/eth2 etc [eth0]?

eth0

  • 722 Enable DHCP client message logging y/n [y]? Czy posiadamy stałe IP czy nie. Jeśli damy N to IP pobieramy od ISP a jeśli mamy stałe IP to Y przechodzimy do punktu 724

Dotyczy tylko przy dynamicznym IP

  • 723 Update DNS server settings by DHCP y/n [y]? Y Dotyczy tylko jeśli posiadamy stałe IP
  • 724 IP address of 1st network interface []? nasze IP nadane od ISP
  • 725 Network mask []? Maska podsieci od ISP
  • 726 IP range []?
  • 731 Interface name of 2nd network eth1/eth0:1/eth2 etc []? eth1
  • 732 IP address of 2nd network interface []? IP naszego routera dla sieci 192.168.0.1
  • 733 Network mask []? Maska podsieci 255.255.255.0
  • 734 IP range []? 192.168.0.1 192.168.0.10 Zakres IP jakie ma przydzielać serwer DHCP
  • 411 Enable caching DNS server y/s/n [y]? S
  • 412 Enable DNS requests logging for debug purpose y/n [n]?
  • 421 Enable DHCP server y/s/n [n]? s
  • 431 Enable public HTTP server y/s/n [n]? serwer www Y
  • 441 Enable time server and router control via HTTP y/s/n [s]? controla poprzez www S ( Sieć )
  • 442 Control HTTP server IP port [82]?
  • 443 Host Time server address, ’-’ – disable time service []?
  • 451 Enable Print Server(s) y/s/n [n]? n
  • 46 Enable telnet server y/s/n [y]? S
  • 14 Savers – screen(min),hdd(x5 sec) 0 -off [0,0]?
  • 15 Swap file size in Megabytes (on boot device). 0 – disable [16]? ilość swapu na HDD
  • 13 Do you want to enable extra modules/programs y/n [n]? n
  • 16 Log sizes in bytes. syslog,logins log [50000,5000]?
  • 911 Host gateway (if exists, otherwise – ’-’) []? IP naszej

Bramki do internetu

  • 912 Primary DNS address (usually your provider’s DNS) []? IP serwera DNS
  • 913 Secondary DNS address (otherwise – ’-’) []? 2 DNS np.

194.204.152.34

  • 914 ISP http proxy address, (otherwise ’-’) []? Zmuszamy aby nasz

router korzystał z jakiego serwera PROXY jeśli nie to enter

  • 47 Do you want to export services y/n []? n

Zapisujemy nasze ustawienia S

Restartujemy nasz router reboot

I to na tyle, już mamy skonfigurowany router

Po uruchomieniu routera warto zmienić hasło dla roota i web admina Logujemy się

setup

enter

a

Zmiana hasła dla root’a 30 Zmiana hasła web admina 31 X

S ( zapisz zmiany

Dostęp do Internetu przez kartę sieciową.

Konfiguracja

Przyjmuje ze system jest już zainstalowany. W następnym kroku należy skonfigurować: karty sieciowe:

setup

2

  ( change advenced s ettings )
a   ( advenced s ettings )
81   (1st card)
881 0 (I/O port adress of 1st etherned card)
882 0 (IRQ line of 1st etherned card)
82   (2nd card)
821 0 (I/O port adress of 2nd etherned card)
822 0 (IRQ line of 2nd etherned card)
sieci:

)ierws za:

72

720   n

  (1st network)

(Use DHCP client…)

721 eth0   (Interfece namefo 1st network)
724 xxx. xxx.xxx .xxx    (IP adress of 1st network
725 255 . 255.0.0 (network mask)
726   (IP range)
interface)

gdzie:

  • xxx.xxx.xxx – jest to adres IP taki jaki otrzymujemy do ISP poprzez DHCP,
  • natomiast maska jest określona dla sieci klasy B a dokładniej dla sieci mającej np. adres 168.xxx.xxx

siec druga:

73                (2nd network)

  • eth1 (Interfece namefo 2nd network)
  • xxx.yyy.yyy (IP adress of 2nd  network interface)
  • 255.255.0 (network mask)
  • – (IP range)

gdzie:

  • xxx.yyy.yyy – jest to adres IP bramy,
  • natomiast maska jest określona dla sieci klasy C a dokładniej dla sieci mającej np. adres 192.168.70.xxx

Dobrze, aby 2 siec była podsiecią sieci 1, ale nie jest to konieczne. Należy jeszcze ustawić serwer proxy i bramę:

91                (Gateway/DNS/Proxy)

  • xxx.yyy.yyy (Host gateway)
  • (Primary DNS adress)
  • (Secondary DNS adress)
  • xxx.zzz.zzz[:p] (ISP http proxy adress)

gdzie:

  • xxx.yyy.yyy – jest to adres IP drugiej karty sieciowej
  • xxx.zzz.zzz – jest to adres serwera proxy
  • [:p] – port serwera proxy

Ustawienie NAT:

11 y         (Enable IP masquerade)

Konfiguracja na zmienny IP

Jeśli twój ISP dostarcza Ci zmienne IP, wówczas należy pierwsza kartę sieciowa (ta, która ma połączenie z modemem), skonfigurować jako klienta DHCP, a mianowicie:

72   (1st network)  
720 y (Use DHCP client.. .)
721 eth0 (Interfece namefo 1st network)
722 y (Enable DHCP client message logging)
723 y (Update DNS server settings by DHCP)

Nie musisz także ustawiać w takim przypadku bramy (911 Host gateway), gdyż freesco zrobi to za Ciebie.

Po takim skonfigurowaniu twój router sam powinien odczytywać adres IP przyznawany Ci przez twojego ISP.

Konfiguracja komputerów lokalnych

Adres przydzielony pierwszemu z komputerów w sieci z tego zakresu, co adres dla drugiej karty, najlepiej następny w kolei, ale nie taki sam jak dla karty drugiej.

Na Win98 robisz to następująco:

Otoczenie sieciowe->Wlasciwosci->kofigurqacja->Protokol TCP/IP- >Wlasciwosci->AdresIP

adres (konkretny dla tego komputera) maska 255.255.255.0 (to przykładowa)

Otoczenie sieciowe->Wlasciwosci->kofigurqacja->Protokol TCP/IP- >Wlasciwosci->Brama

adres karty sieciowej która łączy router z hubem

Zapisać zmiany i uruchomić komputer

Uwagi:

Użyte karty sieciowe są PnP dlatego zarówno IRQ jak i I/O ustawione są na 0. Można ewentualnie przydzielić IRQ na stale, np. dla pierwszej karty 10 a dla drugiej 11. Adres i port serwera proxy powinien dostarczyć ISP.

Przedstawione powyżej rozwiązania konfiguracyjne będą przydatne przy konfiguracji SDI, DSL i Neostrady. Dla osób, które chcą szybko i jak najmniejszym nakładem pracy uruchomić bezpieczny i stabilny serwer rozdzielający Internet w sieci lokalnej powyższe rozwiązanie jest optymalne i osoby te mogą zakończyć lekturę niniejszej pracy na tym rozdziale. Innym zaś proponuję instalację i konfiguracje pełnej dystrybucji linuxa8

  • Konfiguracja sieci w Windows 2000/XP

Po tym jak Windows zainstaluje kartę sieciową oraz wszystkie wymagane usługi należy odpowiednio skonfigurować połączenie!

Przejdź do „Panel Sterowania”-> „Połączenia sieciowe” wybierz „Połączenia Lokalne” a w nich „Właściwości”.

Ukaże Ci się nazwa zainstalowanej karty sieciowej oraz wszystkie potrzebne pakiety sieci!

 

Najważniejsze pakiety to „Klient sieci Microsoft Networks”, oraz „Protokół internetowy (TCP/IP) możesz zaznaczyć bądź odznaczyć „Udostępnianie plików i drukarek” (nie jest to konieczne do prawidłowego działania sieci).

Wybierz „Właściwości” Protokołu internetowego (TCP/IP)! Ukaże Ci się okno. W polu „Adres IP” wpisujesz swój adres IP, „Maska podsieci” 255.255.255.0,

„Bramka domyślna” – wpisujesz tam adres IP komputera, który podłączony jest do Internetu. DNSy TPsa to: 194.204.159.1 194.204.152.34

W tym momencie powinien działać Ci Internet, teraz konfigurujemy sieć! Aby to zrobić  wybierz „Zaawansowane” z „Właściwości” Protokołu internetowego (TCP/IP) i przejdź do zakładki „WINS.

Zaznacz „Włącz    system    NetBIOS     przez    TCP/IP” ° Sprawdź teraz czy należysz do odpowiedniej grupy roboczej (standardowo MSHOME) i czy posiadasz nazwę komputera!

Przejdź do „Panel Sterowania”-> „System” wybierz  zakładkę „Nazwa komputera”. Teraz wystarczy uruchomić ponownie komputer.

Testy wydajności

5/5 - (1 vote)
W tym rozdziale zostaną przedstawione wyniki przeprowadzonych testów wydajności nowego klastra. Przy projektowaniu testów były brane pod uwagę dwa zasadnicze aspekty: poprawność oraz szybkość działania. Testy zostały wykonane w laboratorium komputerowym na Wydziale Matematyki, Informatyki i Mechaniki Uniwersytetu Warszawskiego. Dostępne były dwa typy maszyn o następującej charakterystyce:

Parametr Maszyna typu A Maszyna typu B
Procesor 350 MHz 700 MHz
RAM 64 MB 128 MB
Sieć 100 Mb/s 100 Mb/s
SO Linux Linux

Do testowania został wykorzystany specjalnie w tym celu napisany program, którego zadaniem było generowanie odpowiedniej liczby równoległych żądań do systemu, uwzględniających przesłany przez system identyfikator sesji. Aby wyniki były bardziej miarodajne, program testujący był uruchamiany równolegle na kilku maszynach (w ten sposób wyniki zostały uniezależnione od wydajności konkretnej maszyny testującej, co miało szczególne znaczenie przy testowaniu połączeń szyfrowanych).

Po stronie serwera do testów zostały wykorzystane dwa typy aplikacji. Pierwsza aplikacja (dalej nazywana aplikacją sesyjną) działała w następujący sposób:

  1. Pobierała z żądania nazwę parametru oraz j ego wartość.
  2. Wstawiała tę parę do sesji.
  3. Zwracała wszystkie pary klucz-wartość znajdujące się w sesji.

Aplikacja sesyjna została napisana głównie w celu praktycznego udowodnienia poprawności działania klastra. Program testujący generując kolejne żądania, odwołujące się do tej samej sesji, sprawdzał czy wynik żądania zgadza się z oczekiwaniami. Jeżeli w wyniku nie znajdował się jeden z dodanych przez niego parametrów, to podnoszony był wyjątek i test kończył się niepowodzeniem. Należy zwrócić uwagę na fakt, iż z wydajnościowego punktu widzenia aplikacja jest skrajnie pesymistycznym przypadkiem wykorzystania klastra. Przetworzenie żądania powoduje znikome obciążenie serwera, jednocześnie zmuszając klaster do replikowania wciąż rosnących sesji.

Druga aplikacja (dalej nazywana aplikacją XSL) działała w następujący sposób:

  1. Przy pierwszym żądaniu ustawiała w sesji dwa parametry:
  2. ścieżkę do pliku zawierającego dane zapisane w formacie XML,
  3. ścieżkę do pliku zawierającego przekształcenie XSL prezentujące dane z pliku XML.
  4. Przy drugim żądaniu aplikacja pobierała oba parametry z sesji i wykonywała przekształcenie XSL na danych z pliku XML.

Aplikacja nieco lepiej odwzorowuje praktyczne zastosowanie serwera Tomcat. Co prawda nie komunikuje się z bazą danych, co ma miejsce w większości prawdziwych zastosowań serwerów aplikacyjnych, niemniej jednak wykonuje obliczenia mające na celu uatrakcyjnienie wyświetlanych informacji. Wykorzystuje bardzo modne ostatnio technologie XML oraz przekształcenia XSL oddzielające warstwę danych od warstwy prezentacji.

Każdy z przeprowadzonych scenariuszy testowych był wykonywany kilkakrotnie w celu zwiększenia wiarygodności wyników. Tabele wynikowe prezentują uśredniony czas. Podczas badań system zachowywał się stabilnie – standardowe odchylenie oscylowało pomiędzy 5%, a 15%. Ponieważ różnice w wynikach były nieznaczne, nie zajmowałem się badaniem odchylenia samego w sobie.

Test poprawności

Test poprawności został przeprowadzony na maszynach typu A. Program testujący generował kolejne żądania do aplikacji sesyjnej sprawdzając zgodność danych. Przy każdym żądaniu wielkość sesji była zwiększana o około 130 bajtów. Charakterystyka testu:

  • Serwer zarządca znaj dowal się wewnątrz jednego z serwerów Tomcat.
  • Przy każdym kolejnym żądaniu program testujący wybierał losowo jeden z węzłów, do którego przesyłał żądanie.
30 w. 50 ż. 60 w. 50 ż. 90 w. 50 ż. 30 w. 100 ż.
bez klastra 5 10 17 14
2 węzły 7 15 21 18
3 węzły 8 23 39 40
4 węzły 17 28 45 50
5 węzłów 35 45 74 100

Rys. 5.1. Wykres wyniku testów przy losowym wyborze serwera

Wykres na rys. 5.1 prezentuje czasy trwania kolejnych testów mierzone w sekundach. Zapis „30 w. 50 ż.” oznacza, że zostało wygenerowanych 30 wątków, z których każdy wysyłał kolejno bez opóźnień 50 żądań, sukcesywnie zwiększających sesję (każdy wątek miał osobny identyfikator sesji).

Podstawowym zadaniem testu było pokazanie poprawności działania modułu co zostało osiągnięte. Mimo skrajnie trudnych warunków pracy w jakich przeprowadzono test (tzn. ciągła zmiana kontekstu wykonania żądań bez jakiegokolwiek opóźnienia) moduł działał poprawnie. Testy kończyły się z 99,9 procentową poprawnością. Przy bardzo dużym obciążeniu czasami zdarzało się, że klaster przekazywał błąd (status odpowiedzi na żądanie 500), który był spowodowany przekroczeniem maksymalnego czasu oczekiwania na zajęcie sesji. Niemniej jednak nie wystąpiła sytuacja, w której program testujący zaobserwowałby niezgodność danych – czyli moduł nie dopuścił do odczytu (modyfikacji) nieaktualnej sesji.

Jak można się było spodziewać zwiększanie liczby węzłów w klastrze powodowało zwiększanie czasu trwania testu. Nie jest to wielkim zaskoczeniem zważywszy na charakterystykę przeprowadzonego testu. Nie powinno również być wielkim zaskoczeniem, że czas trwania testu na pojedynczym serwerze był najniższy. Pojedynczy serwer odwołuje się do danych bezpośrednio w pamięci operacyjnej i nie musi ich przesyłać przez sieć. Jeżeli dodatkowo żądanie nie generuje prawie żadnego obciążenia na serwerze, to obsługa nawet kilku tysięcy żądań będzie trwała bardzo krótko.

Drugi test został przeprowadzony w bardzo podobnych warunkach, z tym że system wykorzystywał zintegrowany serwer ruchu. Każdy z wątków testujących łączył się z serwerem ruchu, który na podstawie przesyłanego identyfikatora sesji wybierał węzeł aktualnie zajmujący sesję. Każdy z węzłów miał ustawiony czas opóźnienia wysyłania replik oraz opóźnienia zwolnienia sesji na 2 sekundy.

Rys. 5.2. Wykres wyniku testów przy zastosowaniu zintegrowanego serwera ruchu

Wykres na rys. 5.2 prezentuje wyniki testów mierzone w sekundach. Jak można zauważyć zastosowanie zintegrowanego serwera ruchu bardzo mocno polepszyło wydajność klastra. Prawdopodobnie zysk byłby nawet jeszcze większy przy odpowiednio dobrym zaimplementowaniu serwera ruchu. Z testów wynikało, że tak naprawdę wąskim gardłem tego testu mógł okazać się właśnie serwer ruchu. Niemniej jednak można zauważyć, że przy tej architekturze zwiększanie liczby węzłów w klastrze przestało negatywnie wpływać na wydajność systemu. W zasadzie różnice czasu po dodaniu kolejnych węzłów stają się nieznaczące.

Test wydajności

Test wydajności został przeprowadzony na maszynach typu B. Każdy wątek testowy wykonywał pierwsze żądanie do aplikacji XSL w celu ustawienia w sesji ścieżek do plików. W kolejnym żądaniu odbierał rezultat wykonania przekształcenia na pliku XML. Należy zwrócić uwagę na fakt, że w przeprowadzanym teście również były odwołania do replikowanych sesji, a nie tylko generowanie obliczeń. Charakterystyka testu:

  • Serwer zarządca znaj dował się w j ednym z serwerów Tomcat.
  • Testy były przeprowadzane bez użycia zintegrowanego serwera ruchu.
  • Aplikacja testująca wybierała kolejne węzły w sposób losowy.

Rys. 5.3. Wyniki testów aplikacji XSL

Wykres na rys. 5.3 prezentuje wyniki testów. Jak można zaobserwować zysk z zastosowania klastra jest niebagatelny w stosunku do pracy pojedynczego serwera. Dodanie kolejnych węzłów obniża czas trwania testu, co jest szczególnie widoczne przy obsłudze bardzo wielu żądań jednocześnie. Zysk z zastosowania klastra najlepiej widać dla 150 oraz 210 wątków. Pojedynczy serwer Tomcat bez klastra w ogóle nie przeszedł testu – serwer przestał odpowiadać i trzeba było go zrestartować. Czyli zainstalowanie klastra pozwoliło na obsługę znacznie większej liczby klientów jednocześnie, co tak naprawdę jest najważniejszym wyznacznikiem wydajności systemu.

Prawdopodobnie zastosowanie dobrze zaimplementowanego serwera ruchu pozwoliłoby na uzyskanie jeszcze lepszych wyników, szczególnie przy większej liczbie węzłów.

Test HTTPS

Ostatni z testów miał na celu pokazanie skuteczności działania klastra w przypadku stosowania połączeń szyfrowanych. Obliczenia związane z deszyfrowaniem połączeń zostały rozrzucone na wszystkie węzły w klastrze (dokładniejszy opis konfiguracji znajduje się w p. 4.4.2). Do testów wykorzystano maszyny typu B. Charakterystyka testu:

  • Serwer zarządca znaj dował się wewnątrz j ednego z serwerów Tomcat.
  • Do testów wykorzystano aplikację sesyjną.

Rys. 5.4. Wyniki testów przy wykorzystaniu połączeń szyfrowanych

Wykres na rys. 5.4 prezentuje wyniki przeprowadzonych testów. Co ciekawe przy wykorzystaniu połączeń szyfrowanych okazuje się, że zysk z zastosowania klastra osiąga się nawet dla skrajnie pesymistycznych przypadków z punktu widzenia klastra (aplikacja sesyjna). Obliczenia związane z szyfrowaniem i deszyfrowaniem są tak kosztowne, że złączenie wielu fizycznych maszyn rekompensuje straty związane z przesyłaniem replik sesji w sieci. Jak widać na wykresie pojedynczy serwer jest dużo wolniejszy od klastra, a szczególnie wyraźnie widać to przy dużym obciążeniu. Podczas testu z 90 wątkami serwer przestał odpowiadać i trzeba było go zrestartować.

Warto zwrócić uwagę na kształtowanie się różnic czasów pomiędzy klastrem złożonym z 3 węzłów a klastrem złożonym z 4 węzłów. Dla małej liczby równoległych żądań (15 w. 100 ż.) klaster z trzema węzłami okazuje się szybszy od tego z 4. Przy małym obciążeniu systemu wąskim gardłem staje się strata związana z przesyłaniem replik w sieci. Natomiast wraz ze wzrostem liczby równoległych żądań zysk z doinstalowania kolejnego węzła staje się coraz bardziej widoczny. Jest to bardzo ważna obserwacja z punktu widzenia administratora systemu. Zwiększenie liczby węzłów w klastrze musi iść w parze ze zwiększeniem liczby użytkowników systemu; w przeciwnym przypadku dodanie węzła spowoduje spadek wydajności systemu.

Test został przeprowadzony dla aplikacji sesyjnej, aby uwidocznić zysk jaki można osiągnąć przy instalacji klastra do obsługi połączeń szyfrowanych. Jeżeli test zostanie przeprowadzony dla bardziej wymagającej aplikacji, to można oczekiwać, że wyniki będą jeszcze korzystniejsze.

Lokalne sieci komputerowe

5/5 - (1 vote)

Specyfika sieci lokalnych

Sieci lokalne posiadają swoją specyfikę przede wszystkim w warstwach najniższych modelu OSI. W celu uzyskania dużych szybkości transmisji oraz małej stopy błędów stosuje się specyficzne rodzaje łączy i techniki transmisji, co znajduje swoje odzwierciedlenie w warstwach: fizycznej i liniowej. Wszystkie stacje dołączone do LSK(lokalna siec komputerowa) korzystają ze wspólnego medium transmisyjnego. Pojawia się, więc tutaj problem bezkolizyjnego dostępu do tego medium (np. te same stacje nie mogą zacząć jednocześnie nadawania). W celu rozwiązania tego problemu zdecydowano się na rozbicie warstwy liniowej na dwie podwarstwy:

  • podwarstwę dostępu, niższą (odpowiedzialną za bezkonfliktowy dostęp do łączy),
  • podwarstwę łącza logicznego, wyższą (realizującą pozostałe funkcje).

Normy ISO sieci komputerowych

Normy ISO dla sieci komputerowych stanowią zbiór standardów, które określają zasady i metody stosowane przy projektowaniu, budowie i zarządzaniu sieciami komputerowymi. Międzynarodowa Organizacja Normalizacyjna (ISO) opracowała wiele norm, które mają na celu zapewnienie zgodności i efektywności w komunikacji sieciowej. Jednym z najważniejszych standardów w tej dziedzinie jest model OSI (Open Systems Interconnection), który definiuje sposób, w jaki urządzenia sieciowe komunikują się ze sobą.

Model OSI jest teoretyczną architekturą, która dzieli procesy komunikacyjne na siedem warstw. Każda z tych warstw ma określoną funkcję, zaczynając od warstwy fizycznej, odpowiedzialnej za transmisję bitów, aż po warstwę aplikacji, która zapewnia interakcję użytkownika z aplikacjami sieciowymi. Dzięki temu modelowi możliwe jest zrozumienie i zarządzanie skomplikowanymi procesami komunikacji w sieci komputerowej, a także rozwiązywanie problemów związanych z przesyłaniem danych.

Norma ISO/IEC 7498-1 określa ogólną architekturę sieci komputerowych, bazując na modelu OSI. Dokument ten stanowi fundament dla wielu innych norm i wytycznych w dziedzinie projektowania sieci, zapewniając wspólne zasady dla różnych technologii komunikacyjnych. Jest to kluczowy standard, który pozwala na interoperacyjność systemów oraz tworzenie skalowalnych i elastycznych rozwiązań sieciowych.

Ważnym dokumentem w kontekście sieci komputerowych jest również ISO/IEC 8802, który definiuje standardy dotyczące technologii Ethernet i innych sieci lokalnych (LAN). Norma ta szczegółowo opisuje fizyczne aspekty sieci, takie jak rodzaje kabli i urządzeń, oraz zasady działania warstwy łącza danych. Jest to szczególnie ważne w kontekście projektowania infrastruktury sieciowej, która musi być kompatybilna z różnymi technologiami transmisji danych.

W dzisiejszych czasach, oprócz norm dotyczących samej infrastruktury, istotne są również standardy związane z bezpieczeństwem sieci. ISO/IEC 27001, choć skupia się głównie na zarządzaniu bezpieczeństwem informacji, ma także kluczowe znaczenie dla ochrony sieci komputerowych przed zagrożeniami. Norma ta określa wymagania dotyczące systemu zarządzania bezpieczeństwem informacji (ISMS), pomagając organizacjom w ochronie danych przechowywanych i przesyłanych w sieci komputerowej.

Normy ISO są fundamentem dla budowania bezpiecznych, efektywnych i interoperacyjnych sieci komputerowych. Dzięki tym standardom, różnorodne technologie mogą współpracować, a dane mogą być przesyłane w sposób niezawodny i bezpieczny. Normy te pomagają także w zarządzaniu rozwojem infrastruktury sieciowej, co jest niezbędne w obliczu rosnących wymagań związanych z przepustowością, bezpieczeństwem i skalowalnością nowoczesnych systemów sieciowych.

Niektóre zasady dostępu do łącza wymagają dodatkowych, specjalnych usług warstwy fizycznej. Nie można, łączyć w dowolny sposób rozwiązań odnośnie podwarstwy dostępu i warstwy fizycznej. Zalecenia i normy dotyczące LSK (obecnie są to już standardy) zebrano w dokumentach ISO o numerach 8802.X. X oznacza poszczególne warianty.

Rodzaje transmisji, elementarne konfiguracje łączy

Transmisja w paśmie podstawowym (baseband) – polega na przesłaniu ciągu impulsów uzyskanego na wyjściu dekodera (i być może lekko zniekształconego). Widmo sygnału jest tutaj nieograniczone. Jest to rozwiązanie dominujące w obecnie istniejących LSK.

Transmisja szerokopasmowa (broadband) polega na tym, że za pomocą przebiegu uzyskanego na wyjściu dekodera jest modyfikowany (modulowany) sygnał sinusoidalny o pewnej częstotliwości (zwanej częstotliwością nośną). Modulacji może podlegać dowolny parametr przebiegu sinusoidalnego: amplituda, częstotliwość lub faza. Tak zmodulowany przebieg sinusoidalny jest przekazywany w tor transmisyjny. Widmo takiego przebiegu mieści się w pewnym ściśle określonym przedziale częstotliwości, którego środkiem jest częstotliwość nośna, a szerokość nie przekracza dwukrotnej szybkości sygnalizacji (częstotliwości sygnału modulującego). Istnieją rozwiązania, które pozwalają jeszcze zawęzić to pasmo. Każde łącze charakteryzuje się pewnym pasmem przenoszenia sygnałów. Pasmo to dzieli się na części (kanały), a w każdej z nich przesyła się sygnał o innej częstotliwości nośnej. Można więc w jednym łączu przesyłać sygnał telewizyjny, informację cyfrową itd.

W każdej takiej konfiguracji może odbywać się transmisja:

  1. jednokierunkowa (simplex) – gdy łącze umożliwia propagację sygnału tylko w jednym kierunku. Odbiornik nie może przesłać odpowiedzi. Często ten rodzaj transmisji wykorzystywany jest w układach typu master-slave. Przykładem może być transmisja radiowa;
  2. dwukierunkowa (duplex) – w tym przypadku wyróżnia się transmisję naprzemienną (half duplex) – przesyłanie w dowolnym kierunku, ale tylko w jednym w danej chwili, wykorzystuje się system sygnalizacji wskazujący, że jedno urządzenie zakończyło nadawanie lub odbiór, transmisję w tym trybie można zrealizować przy użyciu kabla dwuprzewodowego (np. skrętka), typowy przykład takiej transmisji to komunikacja za pomocą CB – oraz transmisję równoczesną (full duplex) – możliwe jest przesyłanie jednoczesne sygnału w dwóch kierunkach bez jego zniekształcania, w sieciach cyfrowych konieczne są dwie pary przewodów do utworzenia połączenia.

W konfiguracjach wielopunktowych może się zdarzyć sytuacja, w której kilka nadajników zacznie równocześnie emisję sygnału, co spowoduje wzajemne zniekształcenie nadawanych sygnałów. Taka sytuacja nazywa się kolizją. W chwili kolizji całkowita moc sygnału w łączu znacznie się zwiększa, zarówno nadajnik jak i odbiornik muszą być odpowiednio przygotowane do takich warunków pracy. W niektórych rozwiązaniach LSK wprowadza się układy umożliwiające wykrycie kolizji. Działają one na ogół według jednej z dwóch zasad:

  1. analizowana jest moc sygnału odbieranego. Stwierdzenie przekroczenia przez tę moc pewnego poziomu progowego świadczy o wystąpieniu kolizji. Metoda ta jest zawodna w przypadku, gdy w miejscu zainstalowania odbiornika moc kolidujących sygnałów znacznie się różni;
  2. porównywany jest sygnał emitowany przez nadajnik z sygnałem odbieranym. Metoda ta jest możliwa do zastosowania tylko przez uczestników kolizji. Chcąc zapewnić jednoczesne wykrycie kolizji przez wszystkich uczestników korzystających z łącza narzuca się wymaganie emitowania specjalnego sygnału przez stację, która wykryła kolizję;

Wyposażenie do transmisji danych

Istnieje duże różnorodność sprzętu służącego do transmisji danych, określanego skrótem DCE (Data Communication Equipment) Najczęściej są one powiązanie z urządzeniami końcowymi DTE (Data Terminal Equipment). Urządzenia DCE znajdują się pomiędzy urządzeniami DTE i linią lub kanałem transmisyjnym, umożliwiają podłączenie urządzeń DTE do sieci komunikacyjnej oraz pełnią funkcję terminatora łącza i zapewniają w nim synchronizację. Przykładem urządzenia DCE jest modem.

Interfejsy urządzeń DCE i DTE zdefiniowane są w warstwie fizycznej modelu OSI. W urządzeniach DCE/DTE najpowszechniej stosowane są standardy przyjęte przez EIA: RS-232-C i RS-232-D oraz V.24 komitetu CCITT. Inne standardy to: EIA RS-366-A, CCITT X.20, X.21 i V.35.

Implementacja

5/5 - (1 vote)
Mimo bardzo podobnej architektury i koncepcji rozwiązania przy implementacji w zasadzie nie udało się wykorzystać kodu napisanego przez Hanika. W skład nowego modułu weszło jedynie kilka plików źródłowych z poprzedniej implementacji, zawierających mechanizm podłączenia modułu do serwera. W szczególności są to klasy:

  • apache.catalina.cluster.session.SimpleTcpReplicationManager,
  • apache.catalina.cluster.session.ReplicatedSession,
  • apache.catalina.cluster.tcp.ReplicationValve.

Nakład pracy jaką należałoby włożyć w celu dostosowania kodów źródłowych starego modułu do celów nowego projektu byłby porównywalny ze stworzeniem całości od nowa. Dlatego bardziej sensowne okazało się zaimplementowanie całego modułu od początku.

Moduł został napisany w języku Java (wersja 1.4), przy użyciu standardowych bibliotek, dostarczanych wraz z instalacją środowiska wykonywalnego Javy lub z dystrybucją serwera Jakarta-Tomcat. Wybór języka programowania został zdeterminowany przez technologię serwera Tomcat. Ponieważ cały system został zaimplementowany w języku Java, nie było powodu, aby wprowadzać inny język.

Kod modułu był pisany pod kątem maksymalizowania wydajności. Ponieważ zazwyczaj w tego typu systemach wąskim gardłem staje się przepustowość sieci, główna część uwagi podczas tworzenia projektu była poświęcona kwestii minimalizowania ilości przesyłanych informacji. Wiąże się to z wyeliminowaniem zbędnych pakietów (por. p. 4.3.1, 4.3.2) oraz z mechanizmami buforowania (por. p. 4.3.4). Dodatkowym utrudnieniem podczas pisania było silnie zrównoleglone środowisko pracy modułu. Serwer WWW pracuje wielowątkowo, obsługując nawet kilkaset żądań jednocześnie. Dobrze napisany moduł klastra musi być zabezpieczony przed równoległym dostępem, jednocześnie pozwalając na wykonywanie możliwie jak największej liczby operacji w tym samym czasie. Zbyt mała liczba rozłącznych sekcji krytycznych spowolni działanie modułu, tworząc wąskie gardła. Z kolei zbyt częste wywołania wejścia i wyjścia z sekcji krytycznej może negatywnie wpływać na wydajność i utrudniać wykrywanie błędów.

Dodatkową ważną kwestią, decydującą o sposobie budowania modułu była potrzeba działania w dwóch różnych trybach:

  1. Jako klient, zgłaszający się do serwera zarządcy.
  2. Jako serwer zarządca.

Zakłada się, że w drugim trybie moduł może pracować zarówno wewnątrz serwera Tomcat, z wykorzystaniem części klienckiej mechanizmu synchronizacji, jak i w niezależnej aplikacji (por. p. 4.3.7), wykorzystującej tylko część serwerową mechanizmu. Dokładniejszy opis zastosowanego rozwiązania znajduje się w p. 4.3.6.

W dalszej części pracy opisuję sposób implementowania poszczególnych części systemu, zaczynając od mechanizmu transportowania danych w sieci, a kończąc na algorytmie synchronizacji oraz równoważenia obciążenia. W celu uproszczenia notacji został zastosowany skrót org. . oznaczający pakiet

org.apache.catalina.cluster.

Warstwa transportująca

Ponieważ nowy klaster ma być rozwiązaniem tanim i łatwym w instalacji, jako mechanizm transportujący został wykorzystany protokół TCP/IP, przy użyciu którego komputery mogą się komunikować niemalże w każdej dostępnej sieci. Drugim bardzo ważnym czynnikiem, który spowodował wybór tej technologii jest powszechność gotowych, sprawdzonych implementacji (obsługa TCP/IP jest zaimplementowana w standardowych klasach Javy). Charakterystyka architektury klastra (połączenia każdy z każdym) sugerowałaby wykorzystanie protokołu rozgłoszeniowego, niemniej jednak brak mechanizmów gwarantujących dostarczenie danych oraz sprawdzenia ich poprawności, spowodował wykluczenie tego rozwiązania z projektu. Do poprawności działania klastra niezbędna jest gwarancja dostarczenia danych w niezmienionej postaci. Taką gwarancję daje protokół TCP/IP.

Na implementację warstwy transportującej składają się następujące klasy:

  1. .transport.DestinationManager,
  2. .transport.DestinationAddress,
  3. .transport.socket.ServerSocketListener,
  4. .transport.socket.ClientSocketListener,
  5. .transport.socket.LoopbackSocketListener.

Kluczową rolę w mechanizmie transportującym odgrywa klasa DestinationManager. Zawiera ona metody umożliwiające dodawanie/odejmowanie adresów dostępnych komputerów oraz umożliwia odbieranie i wysyłanie danych.

Każdy serwer w klastrze identyfikowany jest poprzez unikatowy klucz. Na klucz składa się adres IP oraz numer portu. Klasa DestinationAddress reprezentuje adresy serwerów w module, jednocześnie implementując interfejs org. .Member. W klasie została nadpisana metoda eąuais ( , która sprawdza zgodność adresu IP oraz portu porównywanych obiektów. Poza tym została zaimplementowana metoda compareTo (DestinationAddress), w której porównywane są adresy IP lub w przypadku ich równości numery portów. Metoda ta jest wykorzystywana podczas wybierania strony aktywnej/biernej przy nawiązywaniu połączenia (zostanie to dokładniej opisane w dalszej części punktu).

Obowiązkiem obiektu DestinationManager jest obsługa wszelkich problemów związanych z połączeniem i przesyłaniem danych. Sporą wadą protokołu TCP/IP jest łatwość zerwania połączenia – każde połączenie jest uznawane za aktywne dopóki są otrzymywane pakiety.

Niestety, wystarczy, że z powodu przeciążenia sieci lub systemu operacyjnego pakiety zaczną się znacząco opóźniać i połączenie może zostać zerwane. Ponieważ w zastosowanej architekturze spójność klastra jest kontrolowana za pomocą aktywności połączeń, aby ograniczyć liczbę omyłkowych decyzji o awarii węzłów, implementacja warstwy transportującej umożliwia przezroczyste odtwarzanie chwilowo zerwanych połączeń. Po utracie połączenia system przez pewien czas próbuje odtworzyć kanał komunikacyjny; jeżeli się to nie powiedzie, to informuje wszystkich zarejestrowanych słuchaczy o utracie adresata.

Mechanizm powiadamiania o utracie połączenia jest wykorzystywany przez klaster do podejmowania decyzji o awarii węzłów. W przypadku zwykłego węzła znaczenie ma tylko informacja o zerwaniu połączenia z serwerem zarządcą – węzeł musi zerwać wszystkie pozostałe połączenia i próbować odnowić komunikację z zarządcą. Z kolei w przypadku serwera zarządcy informacja o zerwaniu połączenia powoduje podjęcie decyzji o jego odrzuceniu z klastra.

Ważną cechą obiektu klasy DestinationManager jest fakt, że dany adresat będzie uznawany przez obiekt jako aktywny dopóki nie zostanie sxplicits wywołane RemoveDestination (DestinationAddress). Ten fakt ułatwia implementację mechanizmu replikacji – węzeł wysyła dane do wszystkich pozostałych węzłów, niezależnie od tego czy są one dla niego dostępne czy nie. Obiekt DestinationManagei po prostu będzie bez końca ponawiał próbę wysłania lub stwierdzi fakt poprawnego zakończenia, jeżeli w międzyczasie adresat zostanie usunięty z listy aktywnych.

Aby uniknąć aktywnego oczekiwania na grupie połączeń, każdy kanał komunikacyjny ma swój własny wątek, który go obsługuje. Istnieją trzy typy połączeń:  ServerSocketListene: ,    ClientSocketListener      oraz

LoopbackSocketListener. Diagram na rys. 4.8 przedstawia hierarchię klas.

Rys. 4.8. Hierarchia klas warstwy transportującej

W celu zminimalizowania liczby przesyłanych pakietów w sieci, pomiędzy każdymi dwoma węzłami otwierane jest tylko jedno połączenie. Wyróżnia się stronę bierną i aktywną. Strona bierna, czyli obiekt klasy ServerSocketListene , nasłuchuje na porcie identyfikującym węzeł, oczekując na zainicjowanie połączenia przez stronę aktywną. Strona aktywna, czyli obiekt klasy clientSocketListene , nawiązuje komunikację łącząc się na odpowiedni port adresata.

Ponieważ strona bierna nie może zidentyfikować strony aktywnej (nie jest w stanie poznać numeru portu, na którym nasłuchuje strona aktywna, a jedynie adres IP, z którego się łączy), więc węzeł inicjujący połączenie wysyła w pierwszej kolejności numer swojego portu. Rola w połączeniu jest ustalana na podstawie wartości, którą przekaże metoda compareTo (DestinationAddress). Poniższy kod jest wykonywany podczas tworzenia połączenia W obiekcie DestinationManager:

if (oAddr.compareTo(oLocalAddr) < 0)

oCL = new ServerSocketListener(oAddr, this); else if (oAddr.compareTo(oLocalAddr) > 0)

oCL = new ClientSocketListener(this.oLocalAddr, oAddr, this); else

throw new RuntimeException(„Will not add localhost”);

Do prawidłowego działania systemu bardzo istotne jest, aby obie strony w tym samym momencie zaprzestały prób odtworzenia zerwanego połączenia. Sytuacja, w której strona aktywna dochodzi do wniosku, że połączenie jest zerwane, natomiast strona bierna wciąż oczekuje na odtworzenie kanału komunikacyjnego, może doprowadzić do błędnego działania systemu. Strona aktywna mogłaby przedsięwziąć pewne kroki związane z zerwaniem połączenia, a następnie ponowić próbę nawiązania komunikacji. Wtedy strona bierna odtworzy połączenie, niestety bez powiadamiania słuchaczy o zerwaniu.

Schemat procesu nawiązywania połączenia jest przedstawiony na rys. 4.9.

Rys. 4.9. Diagram nawiązywania połączenia

Obiekt DestinationManagei podczas tworzenia otwiera port do nasłuchu. W momencie próby nawiązania połączenia (powrót z metody accept ()), menedżer sprawdza czy istnieje obiekt konektora obsługujący adres zgłaszającego się komputera. Jeżeli istnieje, to wywołuje na nim metodę Setchannel (socket , tym samym kończąc procedurę nawiązywania połączenia. Jeżeli nie istnieje, to wywołuje na obiekcie klasy '4ainSyncServer (dokładniej o tej klasie będzie mowa w p. 4.3.6), metodę canAccept (DestinationAddress). Jeżeli metoda przekaże wartość pozytywną, to menedżer wywołuje sam dla siebie metodę CreateDestination z nowym adresatem jako argumentem. W tym momencie cała procedura nawiązywania połączenia zaczyna się na nowo. Taki mechanizm umożliwia serwerowi zarządcy akceptowanie połączeń z nowymi, nieznanymi wcześniej węzłami.

Jedyna różnica w konektorach biernym i aktywnym występuje w metodzie Connect (). Konektor bierny w tej metodzie przechodzi w stan oczekiwania na wywołanie metody Setchannel (Socketchannel , natomiast konektor aktywny nawiązuje połączenie i wysyła jako pierwsze 4 bajty swój numer portu. Oba konektory w przypadku przechwycenia jakiegokolwiek wyjątku wywołują metodę ReConnect ( , która próbuje odnowić zerwane połączenie.

Poza dwoma podstawowymi typami połączeń zostało jeszcze stworzone połączenie zwrotne, obiekt klasy LoopbackSocketListener. Wszystkie wysyłane przez niego dane od razu przekierowywane są do funkcji obsługi wiadomości sieciowych, nie wywołując niepotrzebnie funkcji systemowych. Jest on wykorzystywany podczas przesyłania danych od serwera zarządcy do serwera Tomcat w przypadku, gdy serwer Tomcat jest jednocześnie serwerem zarządcą. Architektura rozwiązania wymusiła taki mechanizm – serwer zarządca nie wie nic o istnieniu serwera Tomcat. Jego zadanie sprowadza się jedynie do odbierania i wysyłania odpowiednich komunikatów. Takie podejście umożliwia odseparowanie serwera zarządcy od Tomcata (por. p. 4.3.7).

Odbieranie danych z sieci

Każdy konektor posiada swoją pulę buforów, do których może wpisywać pobrane z sieci informacje (maksymalna liczba dostępnych buforów jest konfigurowalna). Po odebraniu danych z sieci konektor pobiera kolejny wolny bufor, przepisuje do niego wiadomość i wykonuje na obiekcie DestinationManager metodę:

AddReadyBuffer(DestinationAddress oFromAddr, ExtendableByteBuffer oData) .

Po zakończeniu obsługi wiadomości na obiekcie ExtendableByteBuffer musi zostać wywołana metoda ReturnToQueue (), aby konektor mógł ponownie wykorzystać bufor do odebrania danych. Jeżeli liczba wolnych buforów spadnie do zera, to moduł wstrzyma odbiór danych, tym samym chroniąc system przed nadmiernym zużyciem pamięci.

Implementacja warstwy transportującej jest bardzo silnie zależna od protokołu TCP/IP. Przenośność i uogólnianie części transportującej nie były głównymi czynnikami decydującymi o kształcie końcowego kodu. Najważniejsza była wydajność tej części modułu, ponieważ to od niej zależała wydajność całego projektu. Takie zabiegi jak tworzenie pojedynczych połączeń, osobne wątki dla każdego kanału komunikacyjnego czy kolejki buforów miały na celu optymalizację modułu klastra. Mechanizm odtwarzania połączeń miał na celu zabezpieczenie klastra przed przypadkowym rozbiciem oraz ułatwienie implementacji samego mechanizmu replikowania sesji.

Komunikacja w klastrze

Komunikacja w klastrze odbywa się za pomocą warstwy transportującej. Aby możliwe było przesłanie danych konieczne jest wcześniejsze utworzenie adresata. W celu optymalizacji został stworzony model komunikacji bezstanowej – to znaczy wysłany komunikat zawiera pełen zbiór informacji potrzebnych do jego przetworzenia (analogicznie do modelu komunikacji w serwerach HTTP). Nie było potrzeby tworzenia skomplikowanych w implementacji dialogów między stronami. Przesyłane wiadomości mają następujący format:

  • 32 bity – długość przesyłanej wiadomości.
  • 8 bitów – typ wiadomości.
  • Kolejne bity zawierają dane zależne od typu wiadomości.

Typy wiadomości można podzielić na dwa zbiory:

  1. Wiadomości przesyłane między dwoma zwykłymi węzłami.
  2. Wiadomości przesyłane między zwykłym węzłem i serwerem zarządcą.

Wiadomości przesyłane między dwoma zwykłymi węzłami sessions_add – dodanie nowej lub modyfikacja istniejącej sesji. W sekcji danych znajduje się identyfikator sesji, kontekst oraz zserializowane dane sesji.

Wiadomości przesyłane między zwykłym węzłem i serwerem zarządcą Wiadomości przesyłane od serwera zarządcy do zwykłego węzła:

  • destinations_ade – dodanie nowego węzła do klastra. W sekcji danych przesyłany jest adres nowego węzła.
  • destination_remove – usunięcie węzła z klastra. W sekcji danych przesyłany jest adres węzła.
  • obtained_session – sesja została przyznana węzłowi. W sekcji danych znajduje się identyfikator sesji, kontekst oraz aktualny numer wersji (jeżeli węzeł posiada mniejszy numer oznacza to, że z jakiś powodów nie otrzymał repliki ostatnich zmian i musi wstrzymać modyfikację sesji do czasu otrzymania najświeższych danych).
  • session_existance – informacja czy podana sesja istnieje. W sekcji danych znajduje się identyfikator sesji, kontekst oraz 1 bajt z informacją czy sesja istnieje w klastrze czy nie. Komunikat jest wysyłany w odpowiedzi na

CHECK_SESSION_EXISTANCE.

  • check_session_version – prośba o odesłanie numeru wersji sesji o podanym identyfikatorze. W sekcji danych przesyłany jest identyfikator sesji oraz kontekst. Komunikat jest wysyłany w momencie próby odzyskania sesji zajmowanych przez węzeł, który doznał awarii. Każdy węzeł w klastrze odsyła numer wersji, a serwer zarządca na tej podstawie wybiera węzeł, który zreplikuje swoją kopię danych do pozostałych członków.
  • s e s s i on s_remove – usunięcie sesji. W sekcji danych znajduje się tablica identyfikatorów sesji oraz kontekstów. Komunikat jest wysyłany w momencie wygaśnięcia sesji. Serwer zarządca podejmuje decyzję o zakończeniu życia sesji analogicznie do pojedynczego serwera Tomcat. Jeżeli przez odpowiednio długi okres żaden serwer nie poprosi o dostęp do sesji, to zostaje ona uznana za nieaktywną.
  • sessions_replicate_with_sync – wymuszenie procesu replikacji. W sekcji danych znajduje się adres węzła, do którego należy wysłać replikę (jeżeli jest pusty, to należy rozesłać repliki do wszystkich węzłów) oraz tablica identyfikatorów sesji, które należy replikować. Węzeł, który odbierze komunikat po zakończeniu replikacji musi zwolnić wszystkie sesje, ponieważ serwer zarządca przed wysłaniem wiadomości ustawia blokady na adresata. Mechanizm ten zabezpiecza przed niebezpieczeństwem wprowadzania zmian w sesjach przez inny węzeł w czasie replikowania. Wysłane repliki mogłyby nadpisać nowo wprowadzone zmiany.

Wiadomości przesyłane od zwykłego węzła do serwera zarządcy:

  • obtain_session – zajęcie sesji. W sekcji danych znajduje się identyfikator zajmowanej sesji oraz kontekst.
  • release_session – zwolnienie sesji. W sekcji danych znajduje się identyfikator zwalnianej sesji, kontekst, numer wersji sesji oraz liczba zwolnień (zazwyczaj 1). Może się zdarzyć, że węzeł posiadając blokadę na sesji otrzyma od serwera zarządcy komunikat sessions_replicate_with_sync (na przykład z powodu zgłoszenia się nowego węzła do klastra). Wtedy węzeł musi zwolnić sesję więcej niż raz, wysyłając w tym celu liczbę zwolnień.
  • new_session_member – zgłoszenie się nowego węzła w klastrze. W sekcji danych znajduje się słownik par: identyfikator sesji (wraz z kontekstem), numer wersji. Komunikat jest wysyłany za każdym razem, gdy nastąpi zerwanie połączenia między zwykłym węzłem a serwerem zarządcą. W przypadku zupełnie nowego węzła słownik będzie pusty.
  • session_created – utworzenie sesji. W sekcji danych znajduje się identyfikator sesji oraz kontekst. Komunikat jest wysyłany zaraz po utworzeniu sesji. Wysłanie komunikatu jest konieczne, aby pozostałe węzły mogły się dowiedzieć poprzez komunikat check_session_existance o istnieniu tej sesji zanim twórca zakończy proces replikacji.
  • check_session_existance – sprawdzenie istnienia sesji. W sekcji danych znajduje się identyfikator sesji oraz kontekst. Komunikat jest wysyłany, jeżeli węzeł otrzyma żądanie odwołujące się do nieistniejącej sesji. Ponieważ sesja mogła być stworzona na innym węźle, ale jeszcze nie doszła replika, serwer wpierw sprawdza u zarządcy czy identyfikator jest aktywny.

Po odebraniu komunikatu z sieci tworzone jest zadanie (więcej o zadaniach będzie mowa w p. 4.3.3):

  • . task. SessionReceivedTask — W przypadku, gdy moduł działa wewnątrz serwera Tomcat  (zadanie tworzone jest w obiekcie org..transport.TransportCluster).
  • . task.MessageReceivedTask — W przypadku, gdy moduł działa jako niezależny serwer zarządca (zadanie tworzone jest w obiekcie org..transport.DestinationManager).

Zadanie SessionReceivedTask dziedziczy po MessageReceivedTask dokładając kilka możliwych typów wiadomości, które może obsługiwać. W szczególności są to wiadomości odbierane przez zwykłe węzły od serwera zarządcy lub wiadomości wymieniane między zwykłymi węzłami. Zakłada się, że serwer zarządca nie musi nic wiedzieć o menedżerze sesji. Natomiast iessionReceivedTask posiada atrybut wskazujący na menedżera sesji – niezbędne podczas przetwarzania takich komunikatów jak chociażby sessions_add.

Zadania tworzone na potrzeby przetwarzania komunikatów posiadają specjalną kolejkę zadań, gwarantującą, że komunikaty będą przetwarzane w kolejności, w której nadeszły (lub ewentualnie równolegle).

Mechanizm kolejki zadań zależnych

Na potrzeby projektu została stworzona wyspecjalizowana kolejka do przetwarzania zadań. Kolejka posiada swoją własną pulę wątków przetwarzających instrukcje. W ten sposób istnieje możliwość zlecania zadań, które mają się wykonać asynchronicznie (jak np. replikacja sesji). Wątki tworzone są raz, w momencie tworzenia kolejki, a ich praca sprowadza się do oczekiwania na nadejście kolejnego zadania, które mogłyby wykonać. Jeżeli zadań nie ma, to wątki przechodzą w stan uśpienia. Zmieniając liczbę wątków w kolejce można kontrolować zużycie zasobów systemowych przez moduł klastra (szerzej o konfigurowaniu klastra będzie mowa w p. 4.4).

Kolejka zadań posiada dodatkowe, bardzo przydatne możliwości:

  1. definiowania zadań, które zostaną wykonane z opóźnieniem (np. zwolnienie sesji przy wykorzystaniu buforowania);
  2. definiowania zależności między zadaniami – czyli zadanie zostanie wystartowane dopiero po wykonaniu innych zadań (np. zwolnienie sesji po zakończeniu wykonywania zadań replikacji);
  3. restartowania zadania, czyli ponownego wrzucenia zadania do kolejki, w przypadku błędu (np. ponawianie prób replikowania sesji do danego węzła).

Każde zadanie musi dziedziczyć po abstrakcyjnej klasie org. .task.Task. Klasa zawiera w szczególności abstrakcyjną metodę internalRun (), w której podklasy umieszczają kod zadania. Klasa zawiera metodę AddListener (Listener), poprzez którą można dołączyć słuchaczy do zadania. Słuchacze implementują interfejs

org..task.Listener:

public interface Listener {

public void WakeUp(boolean bError);

}

W momencie zakończenia wykonywania zadania dla każdego dołączonego słuchacza wywoływana jest metoda wakeup (boolean bError), z argumentem informującym czy zadanie zakończyło się z błędem czy nie (błąd jest wynikiem zgłoszenia przez zadanie wyjątku). Ten mechanizm jest wykorzystywany przy implementacji zależności między zadaniami. Po prostu klasa Task implementuje interfejs słuchacza, a w metodzie WakeUp (boolean) zmniejsza licznik zadań, na które oczekuje. W momencie, gdy licznik spadnie do zera, zadanie samo się inicjuje, dodając się do kolejki:

public void WakeUp(boolean bError) { this.DecTasks () ;

}

public synchronized void DecTasks() { nTasks–;

Start();

}

public void Start()     {

if (nTasks <= 0)       {

if (this.nTimeoutFromStart > 0)

this.SetTime(System.currentTimeMillis()               +

nTimeoutFromStart); oTaskQueue.AddTask(this);

}

}

Jeżeli zadanie ma się wykonać tylko w przypadku poprawnego zakończenia wszystkich zadań zależnych, to należy przeimplementować w podklasie metodę WakeUp (boolean , zmniejszając licznik zależności tylko w przypadku braku błędu. Ten mechanizm został wykorzystany przy implementacji zadania zwalniania sesji (klasa org. .task. ReleaseSessionTask):

public void WakeUp(boolean bError) { if (! bError)

super.WakeUp(bError) ;

}

Zadanie zwolnienia sesji zależy od zadań replikacji sesji do poszczególnych węzłów. Może się ono wykonać tylko w przypadku poprawnego zakończenia wszystkich zadań replikacyjnych (co jest równoznaczne z poprawnym rozesłaniem replik do wszystkich węzłów w klastrze). Jeżeli wystąpi nieoczekiwany błąd podczas wykonywania zadań replikujących (np. brak pamięci w systemie), to sesja nie zostanie zwolniona, co zabezpieczy system przed groźbą utraty danych.

Na rys. 4.10 znajduje się hierarchia klas najważniejszych zadań zdefiniowanych w systemie.

Rys. 4.10. Diagram hierarchii zadań

Opis zadań:

  1. sendingTask – abstrakcyjna klasa, zawierająca metodę Send (DestinationAddress, ByteBuffer), która umożliwia wysłanie bufora z danymi do konkretnego adresata. Można skonfigurować zadanie w dwóch różnych trybach:
  2. Operacja wysyłania ma być blokująca – tzn. powrót z metody 3end () nastąpi dopiero po faktycznym wysłaniu danych.
  3. Błąd podczas wysyłania ma powodować restart zadania.
  4. BufferSendingTast – klasa w metodzie internaiRun () wywołuje metodę send () z nadklasy. Klasa jest wykorzystywana do generowania zadań wysyłających proste komunikaty (np. komunikat o typie j bt ai u se s s i oh ).
  5. sessionPropagateTask – klasa jest odpowiedzialna za wysłanie repliki konkretnej sesji do konkretnego adresata. W metodzie InternaiRun () serializuje obiekt sesji i próbuje wysłać dane do węzła (wywołując metodę Send () z nadklasy). Klasa wykorzystuje tryb restartowania w przypadku błędu. W ten sposób, jeżeli z jakiegoś powodu wysłanie danych zaczyna się opóźniać, to nie blokuje niepotrzebnie pamięci zserializowanymi danymi sesji i co ważniejsze przy kolejnym uruchomieniu zadania ponawia próbę replikacji, ale już być może z nowszą wersją sesji, zmniejszając w ten sposób liczbę przesyłanych informacji (tworzenie zadań replikacyjnych zostanie opisane w p. 4.3.5). Ponadto, jeżeli system wykorzystuje buforowanie, to przy definicji zadania ustala się opóźnienie w wykonaniu (por. p. 4.3.4).
  6. ReieaseSessionTask – zadania tej klasy są odpowiedzialne za zwalnianie sesji w serwerze zarządcy. System podczas tworzenia ustawia zależność tego zadania od wszystkich zadań replikacyjnych sesji. Proces zwolnienia jest uruchamiany dopiero po poprawnym przesłaniu replik do wszystkich węzłów w klastrze. W przypadku wykorzystywania buforowania system dodatkowo opóźnia start zadania już po wykonaniu wszystkich replikacji (szerzej na ten temat będzie mowa w p. 4.3.4).
  7. MessageReceivedTask – zadanie tej klasy tworzone jest po odebraniu wiadomości z sieci. Zadanie zawiera dane komunikatu oraz adres węzła, który je przysłał. Przetwarzanie wiadomości wykonywane jest w odrębnym wątku, co powoduje, że nie następuje blokowanie wątku odbierającego dane z sieci. W ten sposób zapewniane jest maksymalne zrównoleglenie obliczeń wykonywanych przez moduł klastra, co może nie być bez znaczenia w przypadku serwerów wieloprocesorowych.
  8. SessionReceivedTask — klasa dziedziczy po MessageReceivedTask dodając w metodzie internaiRun () obsługę komunikatów charakterystycznych w sytuacji, gdy moduł jest zanurzony wewnątrz serwera Tomcat, jak np. komunikat

W systemie zostały stworzone dwie odrębne kolejki zadań:

  • dla zadań przetwarzających odebrane z sieci komunikaty oraz
  • dla pozostałych zadań występujących w systemie (czyli w przeważającej liczbie zadań wysyłających komunikaty).

Potrzeba odizolowania tych zadań wynikła z faktu, że zadania przetwarzania wiadomości odebranych nie mogą być blokowane przez zadania wysyłające dane.

Można sobie wyobrazić sytuację, gdy wszystkie wątki w kolejce zostały wstrzymane przy próbie wysłania danych i nie ma wolnego wątka, który opróżniłby bufory z odebranymi wiadomościami. Bardzo często to właśnie szybkie przetworzenie odebranych informacji będzie miało krytyczny wpływ na wydajność systemu. W pakietach odbieranych będą informacje o przydzieleniu sesji (komunikat obtained_sessio: ) – zinterpretowanie tego komunikatu powoduje bezpośrednie wznowienie wykonywania zgłoszenia wygenerowanego przez użytkownika systemu.

Moduł klastra umożliwia konfigurowanie liczby wątków dołączonych do każdej z kolejek (opis konfiguracji znajduje się w p. 4.4).

Implementacja kolejki zadań

Do implementacji kolejki zostało wykorzystane drzewo (standardowa klasa Javy j ava. utii. TreeSei) z wartościami posortowanymi zgodnie z czasem wykonania. Zadania, które mają być wykonane bez opóźnienia wstawiane są do drzewa z małymi wartościami, natomiast te, które mają się wykonać po upływie pewnego czasu są wstawiane z liczbą milisekund określającą czas wykonania.

Każdy wątek podłączony do drzewa w nieskończonej pętli pobiera zadanie z kolejki (JorkerQueue. GetTask () – wywołanie metody jest blokujące i w przypadku braku zadań powoduje wstrzymanie wykonywania). Następnie dla pobranego zadania wywołuje metodę Run ( , która obudowuje wywołanie tnternaiRun ().

Głównym powodem stworzenia kolejki zadań zależnych była potrzeba realizacji procesu zwalniania sesji dopiero po udanym zakończeniu rozsyłania kopii do wszystkich węzłów klastra. Drugim, nie mniej ważnym powodem było umożliwienie realizacji pewnych zadań z opóźnieniem, jak np. wysłanie repliki po pewnym czasie, aby ewentualnie umożliwić użytkownikowi wprowadzenie kolejnych zmian i ominąć wysłanie wcześniejszej wersji.

Skuteczność i wydajność systemów rozproszonych w bardzo dużym stopniu zależy od zastosowanych metod buforowania. Wszelkiego rodzaju opóźnianie wysłania danych w celu ich zagregowania czy eliminowanie przesyłania niepotrzebnych wiadomości powodują, że system może w znacznym stopniu przyspieszyć swoje działanie. Stworzony moduł klastra również zawiera mechanizmy usprawniające jego działanie.

Buforowanie

W systemie zostało zastosowane buforowanie w dwóch różnych etapach:

  1. Opóźnianie momentu replikacji sesji.
  2. Opóźnianie momentu zwalniania sesji.

Oba typy buforowania są możliwe do zastosowania tylko w przypadku wykorzystania zintegrowanego serwera ruchu. Jeżeli serwer rozdzielający zadania na poszczególne węzły nie będzie posiadał informacji o węźle aktualnie zajmującym sesję, to buforowanie na poziomie sesji może jedynie niepotrzebnie opóźniać działanie klastra. Jeżeli natomiast posiada takie informacje, to będzie przekierowywał żądania do węzła, który aktualnie okupuje sesję, co umożliwia węzłom opóźnianie momentu przekazania sesji.

Opóźnianie momentu replikacji sesji

Każde zadanie replikujące posiada numer sesji oraz adres węzła, do którego ma wysłać replikę. Moduł dla każdego węzła przechowuje informację o stworzonych, ale nie rozpoczętych zadaniach replikujących, z możliwością wyszukiwania po identyfikatorze sesji (słownik, w którym kluczami są identyfikatory). W momencie zakończenia przetwarzania żądania, system tworząc zadania replikujące sprawdza czy nie istnieje już identyczne zadanie, które jeszcze nie zdążyło się wykonać. Jeżeli istnieje, to nie ma potrzeby tworzenia kolejnego zadania, bo istniejące tak czy owak w momencie wykonania pobierze najświeższe dane sesji. Należy tylko do zbioru słuchaczy istniejącego zadania dodać obiekt klasy ReieaseSessionTas , aby w odpowiednim momencie zwolnić sesję.

Takie podejście gwarantuje, że nawet jeżeli wiele wątków jednocześnie będzie przetwarzało żądania odwołujące się do tej samej sesji, to tak czy owak zostanie stworzone tylko jedno zadanie replikujące, zmniejszając w ten sposób liczbę przesyłanych informacji. Dodatkowo mechanizm pozwala na łatwą realizację koncepcji opóźniania procesu replikacji. Wystarczy, że podczas tworzenia zadania replikującego moduł wstawi opóźnienie w jego wykonanie. Jeżeli w czasie oczekiwania zostanie przetworzone kolejne żądanie (zmieniające dane sesji), to moduł ominie wysłanie wcześniejszej wersji. W ten sposób doprowadza się do sytuacji, gdzie wydajność klastra przestaje zależeć od częstotliwości zgłaszania się użytkowników. W rezultacie sesja będzie replikowane co pewien czas, niezależnie od tego czy użytkownik zgłosi się do systemu raz czy bardzo wiele razy. Dobór długości opóźnienia nie jest rzeczą zupełnie trywialną – jeżeli będzie za małe, to buforowanie może nie przynosić oczekiwanych rezultatów. Z kolei jeżeli opóźnienie będzie za duże, to system straci swoją główną zaletę – czyli dynamiczne równoważenie obciążenia. Doprowadzi to do sytuacji, gdzie każda sesja jest na stałe przypisana do konkretnego węzła – czyli analogicznie do koncepcji zastosowanej w serwerze Bea Weblogic 8.0 (por. p. 2.3.2.1), a cały nakład związany z synchronizowaniem sesji okaże się zbędny.

Opóźnianie wysłania zmienionych danych zwiększa niebezpieczeństwo utraty zmian. Jeżeli nastąpi awaria węzła, to może to doprowadzić do utraty nie tylko właśnie przetwarzanych sesji, ale również tych, które były przetworzone wcześniej, ale oczekiwały na moment replikacji. Problem ten został rozwiązany przez tworzenie jednego zadania replikacyjnego bez opóźnienia. To znaczy moduł po przetworzeniu żądania wybiera losowo jeden węzeł, dla którego tworzy zadanie wysłania repliki z natychmiastowym czasem wykonania. W ten sposób w każdej chwili najświeższe dane sesji znajdują się przynajmniej na dwóch maszynach. W razie awarii dane sesji zostaną odzyskane z drugiej maszyny (patrz opis komunikatów

CHECK_SESSION_VERSION oraz SESSION_VERSION W p. 4.3.2).

Opóźnianie momentu zwalniania sesji

Poza opóźnianiem wysłania pakietów z kopią najnowszej wersji sesji można również opóźniać moment zwolnienia sesji. Wydajność klastra jest mierzona szybkością reakcji systemu na zgłoszenie użytkownika. Im reakcja jest szybsza, tym lepiej. Niestety architektura zaimplementowanego klastra wymaga, aby przed modyfikacją danych użytkownika system zablokował sesję w serwerze zarządzającym. Operacja ta jest dosyć kosztowna – wymaga przesłania dwóch pakietów w sieci (prośba o zablokowanie i odpowiedź). Jeżeli węzeł opóźni moment oddania sesji, to może przetworzyć kilka kolejnych żądań bez potrzeby ponownego zajmowania sesji. Oczywiście nie można przesadzić z długością opóźnienia, aby nie doprowadzić do sytuacji opisanej w poprzednim punkcie, gdy klaster zaczyna się zachowywać tak, jakby istniały stałe przypisania sesja – węzeł macierzysty.

Warto zwrócić uwagę na fakt, że blokada jest przyznawana całemu węzłowi i wszystkie wątki wewnątrz serwera mogą korzystać z danych sesji bez potrzeby ponownego wysyłania prośby o jej przyznanie. W danym momencie tylko jeden wątek wysyła komunikat z prośbą o zablokowanie sesji. Wszystkie kolejne wątki, odwołujące się do sesji będą czekały na zakończenie wcześniej rozpoczętej procedury. Podobnie wygląda proces zwalniania – dopiero ostatni zwalniający wątek wyśle faktycznie komunikat do serwera zarządcy. Wszystkie wcześniejsze po prostu zmniejszą licznik odwołań.

Znając podstawowe mechanizmy działające w module można przeanalizować algorytm przetwarzania żądania. Ścieżka wykonania algorytmu rozpoczyna się w momencie zgłoszenia przez użytkownika żądania, a kończy w momencie wysłania do serwera zarządcy wiadomości zwalniającej sesję.

Algorytm przetwarzania żądania

Opisywana ścieżka przetwarzania żądania rozpoczyna się już w konkretnym węźle, czyli serwerze Tomcat. Sposób działania systemu na poziomie zarządcy ruchu zostanie opisany w p. 4.3.7. Koniec opisywanego procesu wyznaczany jest przez wysłanie danych z serwera Tomcat oraz przez zwolnienie blokady sesji użytkownika.

Na rys. 4.11 znajduje się diagram przepływów ukazujący najbardziej charakterystyczny przypadek obsługi żądania. Diagram przedstawia zgłoszenie klienta z numerem sesji, którą należy zablokować w serwerze zarządzającym.

Rys. 4.11. Diagram przepływ u podczas obsługi żądania

Klient generuje zgłoszenie, które zostaje wysłane do serwera Tomcat. Serwer inicjuje wykonanie strumienia przetwarzania żądań (por. p. 3.3.2). Wśród załączonych wyzwalaczy występuje również wyzwalacz klasy ReplicationValve (analogicznie do implementacji Filipa Hanika). W metodzie invoke(Request, Response, Context) wyzwalacz wznawia przetwarzanie strumienia w celu wykonania Zgłoszenia. Po powrocie Z metody invokeNext (Reąuest, Response, Context) program sprawdza czy żądanie posiada sesję oraz czy sesja jest dzielona przez cały klaster. Jeżeli tak, to zwiększa wersję sesji, tworzy dla każdego węzła w klastrze zadanie replikacyjne oraz tworzy zadanie odblokowania sesji, które wykona się po rozesłaniu wszystkich kopii. Następnie kończy działanie, tym samym kończąc proces przetwarzania żądania. Wszystkie stworzone zadania wykonane zostaną asynchronicznie przez wątki obsługujące kolejkę zadań.

Oczywiście zadania replikacyjne zostaną stworzone tylko pod warunkiem, że w systemie nie występowały już wcześniej zdefiniowane identyczne zadania. Po wykonaniu replikatorów (zadań replikacyjnych) do kolejki trafia zadanie odblokowania sesji. W czasie uruchomienia sprawdza czy inne wątki aktualnie nie używają sesji. Jeżeli nie, to ustawia w strukturach danych, że sesja nie jest zablokowana i wysyła komunikat do serwera zarządcy w celu faktycznego odblokowania. Od tego momentu każdy wątek, który spróbuje się odwołać do sesji będzie musiał najpierw zablokować ją u zarządcy. Tutaj warto zwrócić uwagę na implementację procesu przydzielania i zwalniania zasobu. Nawet jeżeli zostaną wysłane równolegle dwa pakiety: jeden z prośbą o zwolnienie, a drugi o zablokowanie sesji, to ponieważ serwer zlicza ile razy semafor został podniesiony i opuszcza go dokładnie tyle razy ile wysłany pakiet to specyfikuje, nie będzie niebezpieczeństwa wejścia do sekcji krytycznej bez podniesienia semafora. Po prostu jeden pakiet zmniejszy licznik, a drugi go zwiększy – kolejność nie będzie odgrywała roli.

Proces tworzenia sesji

Jeżeli wygenerowane żądanie nie posiadało wcześniej utworzonej sesji, a aplikacja odwoła się do niej, to serwer Tomcat standardowo wywoła dla menedżera sesji metodę createSession (). Ponieważ dla aplikacji zadeklarowanych jako rozproszone (tag <distributable/> w pliku web.xml) menedżerem jest obiekt klasy org. . server. SessionManage , wywołanie to zostanie przechwycone przez moduł klastra. Menedżer utworzy sesję (analogicznie jak w zwykłych menedżerach), ale sesja będzie instancją klasy org. . session. ReplicatedSession (podklasa org . apache . catalina . session . StandardSessic ). Dodatkowo menedżer wygeneruje zadanie wysłania wiadomości session_createe do serwera zarządcy informujące o stworzeniu nowego identyfikatora (zadanie będzie wykonywane w tle). Serwer zarządca przetwarzając tę wiadomość przy okazji podniesie semafor dla nowej sesji a konto węzła, który ją stworzył (aby nie trzeba było wysyłać kolejnego pakietu z prośbą o przyznanie sesji).

Oprócz wysłania wiadomości menedżer ustawi w globalnych strukturach danych, że sesja została przydzielona temu węzłowi. Na tym wywołanie metody createSession () się kończy. Dalej następuje przetwarzanie analogiczne do sytuacji, gdy sesja była utworzona wcześniej.

Proces sprawdzania istnienia sesji

Kolejnym przypadkiem jaki może się wydarzyć jest odwołanie do sesji, która nie jest zarejestrowana w menedżerze. Są dwie możliwości zaistnienia takiej sytuacji (nie licząc złośliwych żądań generowanych przez włamywaczy):

  1. Sesja już wygasła w klastrze.
  2. Węzeł nie otrzymał jeszcze pakietu sessions_add od twórcy sesji.

O ile w pierwszym przypadku menedżer przez pewien czas może zachowywać informacje o wygasłych sesjach i bez potrzeby komunikowania się z zarządcą po prostu tworzyć nową sesję, o tyle w drugim przypadku konieczne jest wysłanie zapytania.

Obiekt klasy SessionManager w metodzie findSession(String sessionID)

wykonuje następujący kod:

public Session findSession(String sSessionID) throws java.io.IOException { return findSession(sSessionID, true);

}

public Session findSession(String sSessionID, boolean bCreate) throws java.io.IOException { if (sSessionID == null) return null;

Session oSession = super.findSession(sSessionID); if (oSession == null && sSessionID != null) {

// sprawdzamy czy sesja istnieje w klastrze

if (oSyncServer.CheckExistance(new SessionContext(sSessionID, this.getName())))  {

synchronized (sessions) {

oSession = super.findSession(sSessionID);

if ( oSession == null)  {

// sesja istnieje, ale my wciąż jej nie mamy // dlatego tworzymy pustą, aby wątek mógł // przy odwołaniu rozpocząć procedurę // blokowania sesji. oSession =

this.createSession(sSessionID, false);

}

}

}

return oSession;

Obiekt oSyncServer jest instancją klasy org. .server.SyncManager (klasa została szerzej opisana w p. 4.3.6). Każdy węzeł klastra zawiera dokładnie jeden obiekt tej klasy, współdzielony przez wszystkie menedżery sesji. Metoda checkExistance (SessionContext) działa analogicznie do procedury zajmowania sesji. To znaczy pierwszy wątek inicjuje faktyczną procedurę sprawdzania u serwera zarządcy (wysyła komunikat check_session_existanc ), a wszystkie kolejne jedynie czekają na odpowiedź. Jeżeli okaże się, że w klastrze istnieje sesja o podanym identyfikatorze, to menedżer stworzy pusty obiekt i pozwoli na dalsze wykonywanie wątku. Nie istnieje tu niebezpieczeństwo rozspójnienia, ponieważ mimo stworzenia pustej sesji nie została ustawiona na niej blokada. Czyli wątek, który będzie się odwoływał do danych sesji, tak czy owak będzie musiał ją najpierw zablokować. Z kolei, aby blokada się udała musi zakończyć się proces replikacji, który spowoduje, że pusty do tej pory obiekt sesji zostanie w końcu zasilony danymi.

Należy tu zwrócić uwagę na fakt, że w przypadku wykorzystania zintegrowanego serwera ruchu węzły nie będą miały potrzeby generowania dodatkowych zapytań do serwera zarządcy. Jeżeli jakaś sesja będzie w danym momencie zajęta, to żądanie będzie przekierowane do zajmującego ją węzła. Jeżeli nie będzie przez nikogo zajęta, to będzie to oznaczało, że tak czy owak wszystkie węzły posiadają kopię tej sesji i nie będą musiały się pytać serwera czy istnieje.

Proces blokowania sesji poprzez odwołanie

W celu zminimalizowania niepotrzebnych operacji blokowania oraz replikowania sesji moment wejścia do sekcji krytycznej został przeniesiony w miejsce faktycznego odwołania do danych sesji. Czyli jeżeli użytkownik wygeneruje żądanie, które nie będzie zaglądało do danych sesji (nie zostaną wywołane na sesji metody

getAttribute(String), setAttribute(String, Object) itp.), to nie spowoduje

to żadnego ruchu po stronie klastra.

W dalszej części tego punktu opisano sposób zaimplementowania tego mechanizmu.

Obiekt klasy ReplicatedSession nadpisuje wywołania wszystkich metod związanych z pobieraniem lub ustawianiem danych w sesji (czyli m.in. getAttribute ( String , setAttribute(String, Object ). W każdej Z ty ch metod zanim zostanie wykonana metoda z nadklasy sprawdzane jest czy odwołujący się wątek zablokował już tę sesję. Jeżeli nie, to wywoływana jest metoda obtainSession(string sessioniD) na menedżerze sesji. To wywołanie z kolei blokuje sesję u serwera zarządcy (synchronicznie) lub zwiększa licznik odwołań do już zajętej sesji. Po przetworzeniu żądania (w wyzwalaczu ReplicationValv ) sprawdzane jest czy wątek zajmował sesję. Jeżeli tak, to inicjowana jest replikacja oraz zwolnienie sesji.

Niestety istnieje tu hipotetyczne niebezpieczeństwo, że jeżeli aplikacja przetwarzając żądanie stworzy nowy wątek, który odwoła się do sesji, to później sesja ta nie zostanie zwolniona. Wątek założy blokadę, której później nie będzie w stanie zdjąć. Jednak sytuacja taka jest na tyle specyficzna, że raczej istnieje małe prawdopodobieństwo, że programiści zdecydują się na jej realizację w rzeczywistych aplikacjach. Nawet gdyby ktoś chciał zaimplementować taką architekturę rozwiązania, to wystarczy, że do nowego wątku przekaże już pobrane z sesji atrybuty, a po zakończeniu jego wykonywania wpisze je z powrotem.

Tak czy owak w najgorszym wypadku węzeł po prostu nie zwolni sesji, co przy wykorzystaniu zintegrowanego serwera ruchu nie spowoduje zaprzestania działania aplikacji. Wszystkie żądania będą kierowane na jedną maszynę bez możliwości zmiany kontekstu wykonania. Atutem zastosowania klastra będzie natomiast wciąż trwający proces replikowania sesji, co może okazać się nie bez znaczenia w przypadku awarii tego węzła.

Cała logika związana z blokowaniem, zwalnianiem czy replikowaniem sesji znajduje się w klasie menedżera sesji (org.. server. sessionManagei) oraz klasie samej sesji ( rg. . session. ReplicatedSessio ). Niemniej jednak większość kodu niezbędnego do komunikacji z serwerem zarządcą jak i kod samego serwera zarządcy znajduje się W dwóch klasach: org. . server .MainSyncServer oraz

org..server.SyncManager.

Serwer zarządca

Głównym celem implementacji serwera zarządcy była możliwość wykorzystania tego samego kodu w dwóch przypadkach:

  1. Serwer zarządca jest jednym z węzłów klastra (zamieszczony wewnątrz Tomcata).
  2. Serwer zarządca jest osobnym programem, który nie ma nic wspólnego z klasami Tomcata.

Aby uzyskać taką dwoistość modułu, zastosowano mechanizm dziedziczenia w podejściu obiektowym. Implementacja bazowa serwera zarządcy opiera się na klasie org. . server.MainSyncServer oraz klasie implementującej warstwę transportującą — org. . server. DestinationManager. Zastosowanie modułu wewnątrz serwera Tomcat staje się możliwe poprzez dodanie klas dziedziczących po klasach bazowych.

W wywołaniach nadpisanych metod został dodany kod specyficzny dla serwera Tomcat. W szczególności został zaimplementowany mechanizm zdalnego lub lokalnego (w zależności od konfiguracji) odwoływania się do serwera zarządcy. Jeżeli moduł ma działać jako klient zdalnego serwera zarządcy, to wszystkie odwołania do
metod z klasy SyncManager powodują wygenerowanie odpowiednich komunikatów w sieci. Natomiast w przypadku, gdy moduł wewnątrz Tomcata pełni jednocześnie rolę serwera zarządcy, wtedy klasa SyncManager wywołuje kod z nadklasy, czyli MainSyncServer. Czyli tak naprawdę zainstalowanie pojedynczego serwera w klastrze (w trybie serwera zarządcy) nie spowoduje znaczącego spadku wydajności w stosunku do sytuacji, gdy serwer ten będzie działał w ogóle bez modułu klastra. Taka informacja może mieć duży wpływ na podjęcie decyzji o instalacji środowiska rozproszonego. Administrator instalując klaster nie jest zmuszony do natychmiastowego podłączenia wielu komputerów, w celu zrekompensowania spadku mocy obliczeniowej. Pojedyncza maszyna będzie działała równie wydajnie jak przed podłączeniem modułu.

Wydajność klastra w dużej mierze zależy od oprogramowania rozdzielającego zadania na poszczególne jego węzły. Szczególnie istotne jest to w przypadku przedstawionego w pracy rozwiązania. Algorytm, który nie wykorzystuje informacji o aktualnych przydziałach sesji, spowoduje osłabienie mocy przerobowej systemu i uniemożliwi wykorzystanie buforowania.

Serwer ruchu

Zasadniczym celem pracy było napisanie i przedstawienie działającego modułu klastra w serwerze Tomcat. Niemniej jednak, aby móc w całości ukazać działanie rozwiązania konieczne stało się napisanie zintegrowanego serwera przekierowującego żądania do poszczególnych maszyn klastra. Niestety nie udało się znaleźć gotowego programu, który odznaczałby się następującymi cechami:

  • Napisany w języku Java z dostępnym kodem źródłowym.
  • Bardzo wydajny (przekierowania na poziomie TCP/IP).
  • Buforujący pulę połączeń.

Dlatego w ramach pracy został napisany serwer ruchu jednocześnie działający jako serwer zarządca. Implementację należy traktować jako wzorcowy przykład rozwiązania, a nie jako docelowy i w pełni działający serwer do przeki ero wy wania żądań.

Serwer został w całości napisany w języku Java z wykorzystaniem klas bazowych z modułu klastra. Schemat działania programu jest stosunkowo prosty:

  1. Przy starcie otwiera port, na którym będzie przyjmował żądania od klientów.
  2. Tworzy i inicjuje obiekty serwera zarządcy.
  3. W momencie, gdy jakiś węzeł klastra zgłosi się do serwera zarządcy jednocześnie dodawany jest do listy aktywnych serwerów Tomcat.
  4. Przy zgłoszeniu klienta program wybiera serwer Tomcat z listy aktywnych i zaczyna się zachowywać jak serwer pośredniczący, przekazując dane między klientem a serwerem.
  5. Jeżeli któraś ze stron zakończy połączenie, to program automatycznie kończy połączenie z drugiej strony.
  6. W momencie zgłoszenia awarii węzła przez oprogramowanie serwera zarządcy jest on automatycznie usuwany z listy aktywnych serwerów Tomcat.

Szczegóły implementacyjne

Dla każdego aktywnego serwera Tomcat trzymana jest pula połączeń (jej wielkość jest konfigurowalna). Każde połączenie jest zadaniem, które w momencie uruchomienia powoduje rozpoczęcie czytania z kanału komunikacyjnego. Jednocześnie obiekt zadania posiada metodę write (ByteBuffer , która umożliwia pisanie danych do połączenia. Przed ponownym uruchomieniem zadania (wywołaniem metody Restart o) ustawiane są referencje między zadaniem obsługującym połączenie z serwerem, a zadaniem obsługującym połączenie z klientem. W ten sposób później wszystkie odebrane informacje przez jeden obiekt zostają przesłane do drugiego (tworząc pomost dla danych). Różnice między zadaniami klienta a serwera występują w zachowaniu na początku i końcu.

Zadanie połączenia klienta na początku, zanim zostanie sparowane z zadaniem serwerowym, czyta nagłówek żądania w celu sprawdzenia czy nie odwołuje się ono do konkretnej sesji. Jeżeli tak, to program sprawdza czy podana sesja nie jest aktualnie zajmowana przez jeden z węzłów. Jeżeli jest zajmowana, to zadanie jako odbiorcę wybiera połączenie z puli tego węzła. W przeciwnym przypadku zadanie wybiera serwer posiadający najwięcej nieużywanych połączeń.

Z kolei zadanie serwerowe po skończeniu obsługiwania klienta odnawia połączenie z serwerem, aby przy obsłudze kolejnego żądania nie trzeba było tracić czasu na nawiązywanie połączenia. Istotne jest, aby odpowiednio skonfigurować połączenia w serwerach – tzn. dopuszczalny czas bezruchu na połączeniu musi być odpowiednio długi, aby połączenia nie były zbyt szybko zrywane przez serwer. Jeżeli połączenie zostanie zerwane zanim jakiś klient zacznie je wykorzystywać, to obsługa żądania zostanie wydłużona o czas odnowienia połączenia.

Wykorzystanie zadań umożliwiło dynamiczny przydział wątków do obsługi wszystkich połączeń ze wszystkich serwerów jednocześnie. W ten sposób można zwiększyć liczbę oczekujących połączeń bez zwiększania liczby wątków. Dynamiczny przydział wątków ze wspólnej puli powoduje, że rozwiązanie dużo lepiej adaptuje się do aktualnego zapotrzebowania na połączenia.

Warto zwrócić uwagę, że zastosowane rozwiązanie umożliwia wykorzystanie opcji protokołu HTTP 1.1, Connection: Keep-Aiive. Opcja pozwala przeglądarce na wykorzystanie raz otwartego połączenia dla obsługi kilku osobnych żądań. Po prostu żadna ze stron nie zerwie połączenia, tym samym zachowując aktywny pomost w serwerze ruchu.

Wadą zaproponowanego rozwiązania jest brak interpretera nagłówka protokołu HTTP. Gdyby program był w stanie poprawnie interpretować nagłówek mógłby zachowywać otwarte połączenia z każdym z węzłów, bez potrzeby ich odnawiania (do tego niezbędna byłaby kontrola długości przesyłanych danych). Wtedy również w przypadku trzymania połączeń typu Keep-Alive można by było dynamicznie zmieniać serwer, który obsłuży kolejne żądanie. Niestety stopień skomplikowania takiego interpretera wykracza poza ramy tej pracy.

Zarówno serwer ruchu jak i sam moduł klastra zawierają szereg parametrów, które umożliwiają dostrojenie systemu w zależności od zastosowania. W kolejnym punkcie opisano parametry oraz przedstawiono różne dodatkowe wskazówki, którymi mogą się kierować administratorzy klastra.

Protokoły sieciowe

5/5 - (1 vote)
Protokół (ang. protocol) – Zbiór sygnałów używanych przez grupę komputerów podczas wymiany danych (wysyłania, odbierania i kontroli poprawności informacji). Komputer może używać kilku protokołów. Np. jednego do komunikacji z jednym systemem, a drugiego z innym.

Protokołem w sieci komputerowej nazywamy zbiór powiązań i połączeń jej elementów funkcjonalnych. Tylko dzięki nim urządzenia tworzące sieć mogą się porozumiewać. Podstawowym zadaniem protokołu jest identyfikacja procesu, z którym chce się komunikować proces bazowy. Z uwagi na to, że zwykle w sieci pracuje wiele komputerów, konieczne jest podanie sposobu określania właściwego adresata, sposobu rozpoczynania i kończenia transmisji, a także sposobu przesyłania danych. Przesyłana informacja może być porcjowana – protokół musi umieć odtworzyć informację w postaci pierwotnej. Ponadto informacja może z różnych powodów być przesłana niepoprawnie – protokół musi wykrywać i usuwać powstałe w ten sposób błędy. Różnorodność urządzeń pracujących w sieci może być przyczyną niedopasowania szybkości pracy nadawcy i odbiorcy informacji – protokół powinien zapewniać synchronizację przesyłania danych poprzez zrealizowanie sprzężenia zwrotnego pomiędzy urządzeniami biorącymi udział w transmisji. Ponadto z uwagi na możliwość realizacji połączenia między komputerami na różne sposoby, protokół powinien zapewniać wybór optymalnej – z punktu widzenia transmisji – drogi.

Protokoły sieciowe – zapewniają usługi łączy systemów komunikacyjnych, obsługują adresowanie, informacje routingu, weryfikację błędów oraz żądania retransmisji. Obejmują także procedury dostępu do sieci, określone przez wykorzystywany rodzaj sieci. Najpopularniejsze protokoły sieciowe to:

  • IP (Internet Protocol), część zestawu protokołów TCP/IP,
    • APPN (Advanced Peer-to-Peer Networking) firmy IBM,
    • CONS (OSI Connection-Oriented Network Service),
    • CLNS (OSI Connectionless Network Service),
    • IPX, część zestawu protokołów SPX/IPX firmy Novell,
    • Interfejsy Microsoft NetBEUI,
    • AppleTalk DDP (Datagram Delivery Protocol).
    Trzy najczęściej używane protokoły w sieciach lokalnych i w internecie to TCP/IP, SPX/IPX i NetBEUI

TCP/IP

OSI – model OSI, czyli powiązania między protokołami TCP/IP. Chyba najczęściej używany, zarówno dla sieci lokalnych jak i połączenia z internetem.

• TCP – Protokół sterowania transmisją (ang. Transmission Control Protocol) jest protokołem obsługi połączeniowej procesu użytkownika, umożliwiającym niezawodne i równoczesne (ang. full-duplex) przesyłanie strumienia bajtów. W większości internetowych programów użytkowych stosuje się protokół TCP. TCP korzysta z protokołu IP, więc całą rodzinę protokołów nazywamy TCP/IP.
• UDP – Protokół datagramów użytkownika (komunikaty przesyłane między systemami jeden niezależnie od drugiego) (ang. User Datagram Protocol) jest protokołem obsługi bezpołączeniowej procesów użytkownika. W odróżnieniu od protokołu TCP, który jest niezawodny, protokół UDP nie daje gwarancji, że datagramy UDP zawsze dotrą do celu.
• ICMP – Protokół międzysieciowych komunikatów sterujących (ang. Internet Control Message Protocol) obsługuje zawiadomienia o błędach i informacje sterujące między bramami (ang. gateway) a stacjami (ang. host). Chociaż komunikaty ICMP są przesyłane za pomocą datagramów IP, są one zazwyczaj generowane i przetwarzane przez oprogramowanie sieciowe TCP/IP, a nie przez procesy użytkownika.
• IP – Protokół międzysieciowy (ang. Internet Protocol) obsługuje doręczanie pakietów dla protokołów TCP, UDP oraz ICMP. Procesy użytkownika normalnie nie muszą komunikować się z warstwą IP.
• ARP – Protokół odwzorowania adresów (ang. Address Resolution Protocol) służy do odwzorowania adresów internetowych na adresy sprzętowe. Ten protokół i protokół RARP nie jest używany we wszystkich sieciach, lecz tylko w niektórych.
• RARP – Protokół odwrotnego odwzorowywania adresów (ang. Reverse Address Resolution Protocol) służy do odwzorowywania adresów sprzętowych na adresy internetowe.

IPX/SPX

IPX/SPX – jest to zestaw protokołów firmy Novell, bierze on nazwę od swoich dwóch głównych protokołów: międzysieciowej wymiany pakietów IPX i sekwencyjnej wymiany pakietów SPX. Ten firmowy stos protokołów został oparty na protokole systemów sieciowych firmy Xerox, wykorzystywanym w pierwszej generacji Ethernet. Wymiana IPX/SPX zyskała na znaczeniu we wczesnych latach 80, jako integralna część systemu Novell Netware. Netware stał się faktycznym standardem sieciowego systemu operacyjnego dla sieci lokalnych pierwszej generacji. Protokół IPX w dużym stopniu przypomina IP. Jest bezpołączeniowym protokołem datagramowym, który nie wymaga ani nie zapewnia potwierdzenia każdego transmitowanego pakietu. Protokół IPX polega na SPX w taki sam sposób, w jaki protokół IP polega na TCP w zakresie porządkowania kolejności i innych usług połączeniowych warstwy 4. Stos protokołów IPX/SPX obejmuje cztery warstwy funkcjonalne: dostępu do nośnika, łącza danych, Internetu i aplikacji. Głównym protokołem warstwy aplikacji jest protokół rdzenia NetWare ( NCP). Protokół NCP można bezpośrednio sprzęgnąć zarówno z protokołem SPX, jak i IPX. Jest wykorzystywany do drukowania, współdzielenia plików, poczty elektronicznej i dostępu do katalogów. Innymi protokołami warstwy aplikacji są: protokół informacyjny trasowania, firmowy protokół ogłoszeniowy usługi i protokół obsługi łącza systemu NetWare. Protokół warstwy Internetu SPX jest protokołem połączeniowym i może być wykorzystywany do przesyłania danych między klientem serwerem, dwoma serwerami czy dwoma klientami. Tak jak w przypadku TCP, protokół SPX zapewnia niezawodność transmisjom IPX, zarządzając połączeniem i udostępniając sterowanie strumieniem danych, kontrolę błędów i porządkowanie kolejnych pakietów.

NetBEUI

NetBEUI – interfejs NetBEUI został opracowany przez IBM i wprowadzony na rynek w 1985 roku. Jest stosunkowo małym ale wydajnym protokołem komunikacyjnym LAN. NetBEUI jest wyłącznie protokołem transportu sieci LAN dla systemów operacyjnych Microsoft. Nie jest trasowany. Dlatego jego implementacje ograniczają się do warstwy 2, w których działają wyłącznie komputery wykorzystujące systemy operacyjne firmy Microsoft. Aczkolwiek staje się to coraz mniejszą przeszkodą, to jednak ogranicza dostępne architektury obliczeniowe i aplikacje technologiczne. Zalety korzystania z protokołu NetBEUI są następujące: Komputery korzystające z systemów operacyjnych lub oprogramowania sieciowego firmy Microsoft mogą się komunikować. NetBEUI jest w pełni samodostrajającym się protokołem i najlepiej działa w małych segmentach LAN. Ma minimalne wymagania odnośnie pamięci. Zapewnia doskonałą ochronę przed błędami transmisji, a także powrót do normalnego stanu w razie ich wystąpienia. Wadą protokołu NetBEUI jest fakt, że nie może być trasowany i niezbyt dobrze działa w sieciach WAN.