Wprowadzenie

W ciągu ostatniej dekady dało się zaobserwować wzrost popularności darmowych systemów operacyjnych wywodzących się z systemu Unix. Przyczyną tego jest z jednej strony rozwój Internetu i związane z nim zapotrzebowanie na systemy dla serwerów sieciowych, a z drugiej -- coraz większa moc obliczeniowa i pojemność pamięci komputerów osobistych, pozwalające korzystać z systemów uniksowych użytkownikom indywidualnym.

Aby bezpłatne oprogramowanie miało szanse na rozwój, nierzadko jest ono dystrybuowane wraz z pełnym kodem źródłowym. Daje to użytkownikom możliwości współtworzenia programów i wyszukiwania błędów w kodzie, ale też -- a może przede wszystkim -- analizowania rozwiązań programowych zastosowanych przez twórców systemów. Tam, gdzie istnieje kilka konkurencyjnych produktów z dostępnymi kodami źródłowymi, można dokonywać analiz porównawczych kodu. Taka sytuacja ma miejsce na rynku systemów operacyjnych, ponieważ jest dostępnych kilka systemów uniksowych rozprowadzanych na licencji GPL bądź BSD. Systemy te cieszą się dużym powodzeniem w środowiskach akademickich i w firmach internetowych.

Szczególnie cenionymi platformami dla serwerów internetowych są Linux i systemy z rodziny BSD. W obu przypadkach administratorzy systemów cenią stabilność i wydajność kodu sieciowego, a także jego dużą zgodność ze standardami, jakkolwiek pojawiają się też pewne kontrowersje. Można się zetknąć z opiniami wyrażanymi przez zwolenników systemów BSD, że kod Linuksa jest niezbyt wydajny, niestabilny i w wielu miejscach niechlujnie napisany. Ma to być wynikiem specyficznego modelu rozwoju jądra Linuksa: rozproszonego, słabo skoordynowanego, ewolucyjnego -- bez wcześniejszego wykonania projektu. Z kolei kod BSD, rozwijany od wielu lat i stanowiący podstawę wielu komercyjnych i niekomercyjnych systemów, ma być wydajny, stabilny, doskonale przetestowany, dobrze zaprojektowany. Podobne argumenty rzadko kiedy zbliżają się do poziomu szczegółów, dlatego trudno dać im wiarę. Brakuje rzetelnych porównań mechanizmów sieciowych implementowanych w jądrach konkurencyjnych systemów. Czy rzeczywiście rozwiązanie projektowane w czasach, gdy dostępne komputery dysponowały niewielką pamięcią, a o komercyjnym wykorzystaniu Internetu i stronach WWW nikt jeszcze nie myślał, jest wydajniejsze od stosunkowo nowego Linuksa? Czy kod Linuksa musi być źle napisany tylko dlatego, że powstawał nieco chaotycznie?

Celem niniejszej pracy jest udzielenie choćby częściowych odpowiedzi na te pytania. Zasadniczą część pracy stanowi analiza mechanizmów komunikacji sieciowej w wybranych systemach operacyjnych, dla których jest dostępny kod źródłowy: Linux i FreeBSD, a także NetBSD i OpenBSD. Cel analizy jest trojaki. Po pierwsze -- opisanie najważniejszych struktur danych i funkcji przesyłu danych używanych w implementacjach Linuksa i FreeBSD. Po drugie -- zbadanie podobieństw i różnic między tymi implementacjami oraz odstępstw od wzorcowej architektury warstwowej protokołów określonej przez model ISO OSI. Po trzecie -- wykrycie za pomocą eksperymentów różnic w wydajności działania implementacji Linuksa, FreeBSD, NetBSD i OpenBSD, diagnoza możliwych przyczyn tych różnic oraz zbadanie, jak przyspieszenie działania fragmentu kodu sieciowego może wpłynąć na wydajność całej implementacji i ewentualne dokonanie poprawek w implementacji Linuksa, które przyniosłyby zwiększenie wydajności.

Ponieważ zaprogramowanie złożonych mechanizmów komunikacji sieciowej wymaga dużych ilości kodu, niezbędne są pewne uproszczenia i pominięcie wielu szczegółów. Analizę zawężono do implementacji najczęściej używanych protokołów internetowych z warstw transportowej i sieciowej: TCP i IP. Pominięto te gałęzie kodu, które nie są związane z przesyłaniem danych.


rozdziale 1 dokonano prezentacji badanych systemów. Omówiono historię ich powstania i rozwoju, pokrewieństwa z innymi systemami, cechy użytkowe oraz architekturę.

rozdziale 2 wprowadzono koncepcję podziału oprogramowania sieciowego na warstwy logiczne i przedstawiono wzorcowy podział zaproponowany przez organizację ISO. Szczególną uwagę poświęcono tym warstwom, które są zazwyczaj implementowane w jądrze systemu operacyjnego. Pokazano odpowiedniość między warstwami ISO OSI a stosem TCP/IP w omawianych systemach operacyjnych.

Niektóre warstwy implementuje się najczęściej w jądrach systemów operacyjnych. Te implementacje, które zawarto w jądrach Linuksa i FreeBSD, przedstawiono w rozdziale 3. Skupiając uwagę na protokołach TCP i IP, opisano najważniejsze funkcje i struktury danych używane w tych implementacjach i umiejscowiono je w modelu struktury warstwowej. Pokazano interakcje pomiędzy sąsiednimi warstwami i odstępstwa od zasady hermetyzacji warstw. Ze względu na duże rozmiary kodu źródłowego opisano jego organizację na dysku, podział na pliki i katalogi. Podjęto próby ustalenia najważniejszych podobieństw i różnic w implementacjach protokołów sieciowych Linuksa i FreeBSD.

rozdziale 4 zamieszczono informacje na temat alternatywnych metod implementacji kodu sieciowego z pominięciem struktury warstwowej. Opisano propozycje zmian klasycznej implementacji systemu 4.3BSD, przedstawione przez Vana Jacobsona. Mimo że nie weszły w skład żadnej dystrybucji, modyfikacje te stanowią najbardziej znaną próbę polepszenia wydajności kodu sieciowego poprzez zmianę jego architektury. Zbadano, które z opisanych propozycji zostały wykorzystane w kodzie sieciowym Linuksa i FreeBSD. Przedstawiono też stosowane w systemach klastrowych podejście polegające na implementowaniu specjalizowanych bibliotek komunikacyjnych.

Rozdział 5 zawiera opis eksperymentów, mających na celu pokazanie niektórych różnic w wydajności kodu sieciowego badanych systemów. Analiza otrzymanych wyników pozwala stwierdzić, w jakim stopniu jest możliwe wnioskowanie o wydajności implementacji protokołów sieciowych na podstawie znajomości jej najważniejszych cech. Pokazano, że przyspieszenie działania fragmentu kodu sieciowego może pogorszyć wydajność całej implementacji. Oceniono, w jakim stopniu badane implementacje pozwalają wykorzystywać przepustowość dostępnych mediów transmisyjnych.

rozdziale 6 zebrano najważniejsze fakty i wnioski przedstawione w poprzednich rozdziałach.







Składam gorące podziękowania Pani Promotor dr Janinie Mincer-Daszkiewicz oraz wszystkim innym, których cierpliwość nie uległa wyczerpaniu podczas pisania przez mnie tej pracy.