Część 1: Model OSI Prace nad stworzeniem uniwersalnego, warstwowego modelu sieci zostały rozpoczęte w 1977 r. przez ISO (ang. International Standard Organization). Efektem tych prac jest model OSI (ang. Open Systems Interconnection Model) składający się z siedmiu warstw: aplikacji, prezentacji, sesji, transportu, sieci, łącza danych i fizycznej. Każdy protokół sieciowy przypisany jest do jednej z warstw. Poszczególne warstwy realizują w związku z tym różne usługi. Z usług dostarczanych przez warstwę korzysta warstwa znajdująca się bezpośrednio nad nią. Jest to tak zwany warstwowy model usług. Warstwowy model sieci oferuje nie tylko pojęciowe i strukturalne uporządkowanie, ale także umożliwia przezroczyste dla wyższych warstw zmiany sposobu realizacji usług znajdujących się poniżej. Dobrym przykładem korzyści płynących ze ścisłego powiązania warstw z realizowanymi przez nie funkcjami jest dynamiczny rozwój sieci bezprzewodowych w standardzie 802.11. Dla przeglądarki internetowej używającej na poziomie warstwy aplikacji protokołu HTTP, czy dla klienta FTP nie ma znaczenia czy na warstwie łącza danych używany jest protokół Ethernet 802.11, czy też jakiś inny (pod warunkiem, że realizuje funkcje przypisane do tej warstwy). Łatwo sobie wyobrazić, że sytuacja w której zmiana na w jednej warstwie (na przykład wprowadzenie protokołu 802.11n) wymagałaby modyfikacji wszystkich pozostałych skutecznie zablokowałaby jakikolwiek postęp. Rys.1. Model OSI Na rys. 1. przedstawiony jest model OSI wraz z nazwami używanymi dla określenia porcji danych na kolejnych warstwach i protokołami na nich realizowanymi. W Internecie mamy do czynienia z modelem OSI w którym trzy górne warstwy zostały połączone w jedną otrzymujemy wtedy model pięciowarstwowy. Wraz z prezentacją konkretnych protokołów opisane zostaną dokładnie funkcje każdej z warstw wraz ze sposobem ich realizacji. Krótka, dająca wyobrażenie o powiązaniach pomiędzy warstwami, charakterystyka funkcji poszczególnych warstw znajduje się poniżej:
Kombinację protokołów realizujących określone funkcje z różnych warstw nazywamy stosem protokołów. Przykładowy stos protokołów realizując funkcję zapytania serwera DNS o adres IP domeny Onet.pl poprzez sieć bezprzewodową wyglądałby następująco:
Część 2: Kapsułkowanie Bardzo ważnym zagadnieniem dla zrozumienia funkcjonowania sieci komputerowych jest kapsułkowanie (ang. encapsulation) przedstawione schematycznie na rys.2. Rysunek ten przedstawia drogę jaką poruszają się dane przemieszczając się od jednego hosta do drugiego (na przykład informacja wysłana przy pomocy komunikatora Tlen). Do danych wysłanych z aplikacji na warstwie transportowej dodawany jest odpowiedni nagłówek. Tak skonstruowany segment przekazywany jest niżej do warstwy sieci, gdzie dodawany jest kolejny nagłówek (segment składający się z komunikatu i nagłówka warstwy transportowej pozostaje niezmieniony na warstwie sieci, natomiast zostaje do niego dodany kolejny nagłówek). Po kolejnym procesie kapsułkowania ramka na warstwie łącza danych składa się z komunikatu początkowego i trzech nagłówków warstwy transportowej, sieci i łącza danych. W hoście docelowym następuje proces odwrotny (ang. decapsulation). Najpierw z bitów składana jest ramka. Później po odjęciu nagłówka warstwy łącza danych powstaje datagram. Kolejnymi krokami jest odcięcie nagłówków warstwy sieci i transportowej i przekazanie do warstwy aplikacji samego komunikatu. Proces kapsułkowania może być (i najczęściej w praktyce bywa) dużo bardziej złożone od schematu omówionego powyżej. Dzieje się tak, gdy wielkość komunikatu na danejwarstwie przekracza maksymalną wielkość na warstwie poniżej (Maximum Transmission Unit (MTU) rozmiar największego datagramu, który można przekazać przez warstwę protokołu komunikacyjnego). Wtedy musi on zostać podzielony na więcej niż jeden, odpowiednio, segment, datagram czy ramkę. W takim wypadku po stronie odbiorcy transmisji odpowiednia warstwa ma za zadanie scalić dane przed przekazaniem ich do warstwy wyższej. Rys.2. Schemat kapsułkowania w modelu pięciowarstwowym. Część 3: WireShark Sniffer jest programem służącym do przechwytywania i analizowania danych przepływających w sieciach. Z założenia jest to narzędzie pasywne, które przechwytuje pojawiające się komunikaty, ale samo nie wysyła żadnych pakietów. Najczęściej dzięki snifferowi możliwe jest przechwytywanie pakietów, które są wysyłane przez aplikacje działające na naszym komputerze lub też tych adresowanych do nas, choć w przypadku sieci bezprzewodowych, a także sieci opartych na koncentratorach możliwe jest śledzenie komunikacji innych osób. Przechwytywane informacje nie są nigdy adresowane bezpośrednio do sniffera. Działanie sniffera jest przezroczyste dla pozostałych aplikacji działających na danym komputerze (w tym tych, których komunikację przechwytujemy). Jednym z najbardziej popularnych snifferów ze względu na ogromną bazę rozpoznawanych protokołów i bardzo wygodny interfejs użytkownika jest WireShark (wcześniejsze wersje tego programu nazywają się Ethereal). Jest on dostępny zarówno pod Linuxa jak i Windows pod adresem: http://www.wireshark.org/download.html .
Możliwość przechwytywania danych wymaga bezpośredniego dostępu do interfejsów sieciowych, w związku z tym WireShark w systemach typu UNIX musi być uruchamiany z prawami roota: sudo wireshark Po uruchomieniu sniffera otwiera się okno programu. Rozpoczęcie przechwytywania komunikacji wymaga wybrania z menu u góry okna opcji Capture/Interfaces (rys.3). Rys.3. Rozpoczęcie przechwytywania komunikacji Kolejnym krokiem jest wybór interfejsu sieciowego, na którym komunikację chcemy przechwytywać. W zależności od tego ile interfejsów sieciowych (nie jest to tożsame z liczbą sprzętowych kart sieciowych) jest zdefiniowane w naszym systemie okno przedstawione na rys.4. będzie mieć różny wygląd. Jeśli po samych nazwach lub adresie IP trudno się zorientować, który interfejs jest w danej chwili używane jako okno do sieci (w jednej chwili system może korzystać z wielu interfejsów sieciowych równolegle) najlepiej jest spojrzeć na licznik pakietów (ang. packets) znajdujący się w trzeciej kolumnie. Jeśli chcemy rozpocząć przechwytywanie danych należy kliknąć na przycisk start. Rys.4. Wybór interfejsu sieciowego W celu zatrzymania procesu przechwytywania należy kliknąć na odpowiednią ikonę na pasku menu (oznaczona żółtym kółkiem na rys.5). Rys.5. Zatrzymanie przechwytywania danych Po przerwaniu zbierania danych WireShark wyświetla wszystkie ramki jakie udało mu się przechwycić (rys.6). Informacja zorganizowana jest w trzech oknach. Pierwsze od góry zawiera wszystkie ramki posortowane domyślenie w kolejności jakiej zostały przechwycone. Każda linijka przedstawia jedną ramkę. Kolory poszczególnych linii zależą od protokołu rozpoznanego przez WireSharka. Kolumna Time zawiera czas w milisekundach jaki upłynął od rozpoczęcia przechwytywania danych do przechwycenia danej ramki (istnieje możliwość zmiany sposobu wyświetlania daty, należy w tym celu wybrać z menu opcję View/Time Display Format ). Kolejne dwie kolumny zawierają odpowiednio adres źródła i celu. Piąta kolumna zawiera informację o protokole jaki rozpoznał WireShark. Warto zwrócić uwagę, że sniffer nie zawsze będzie w stanie prawidłowo rozpoznać protokół najwyżej warstwy. W takich sytuacjach w tej kolumnie będzie informacja o protokole niższej warstwy, który został rozpoznany. Drugie, znajdujące się poniżej pierwszego, okno zawiera dokładne informacje o jednej, wybranej przez użytkownika ramce. Jak łatwo zauważyć informacja zorganizowana jest w oparciu o warstwy z modelu OSI, tyle, że prezentowana jest w odwrotnej kolejności. Klikając na plus obok nazwy protokołu można dostać się do dodatkowych informacji (głównie z nagłówków danego protokołu). Na samym dole prezentowana jest zarówno w postaci ASCII jak i heksadecymalnej cała zawartość danej ramki. Rys.6. Główny ekran programu WireShark Jeśli interesuje nas sprawdzenie jak wygląda konkretne zdarzenie (np. otworzenie strony WWW w przeglądarce) od strony komunikacji sieciowej, to dobrym nawykiem jest rozpoczęcie przechwytywania tuż przed wywołaniem tego zdarzenia, a także ograniczenie liczby procesów sieciowych działających w tle. Pozwoli nam to zmniejszyć liczbę danych przechwytywanych przez sniffer, a co za tym idzie znacząco zwiększyć czytelność wyników. Tym niemniej często zdarza się, że nawet przy najlepszych chęciach liczba pakietów sięga tysięcy. Znalezienie interesującej nas informacji w tym gąszczu różnych komunikatów znakomicie ułatwiają filtry. Oby przejść do okna wyboru filtra należy kliknąć na słowo Filter znajdujące się w lewym górnym rogu ekranu. Otworzy się okno pokazane na rys.7. Rys.7. Okno wyboru filtra Kliknięcie na klawisz Apply powoduje zastosowanie wybranego uprzednio filtra. Warto jednak wcześniej przyjrzeć się polu Filter string. Zawiera ono warunek według którego wszystkie zebrane dane zostaną przefiltrowane. Po kliknięciu na klawisz Expression można tworzyć swoje własne filtry korzystając z bardzo wygodnego narzędzia podpowiadające odpowiednie konstrukcje. Zastosowany filtr w każdej chwili można wyłączyć wybierając opcję Clear (zaznaczone na żółto na rys. 8.). Rys.8. Wyłączanie filtrowania |
ping onet.plObserwuj wyniki w WireSharku. Z jakiego protokołu korzysta polecenie ping?
ping 127.0.0.1Obserwuj wyniki w WireSharku. Potwórz eksperyment wybierajšc różne interfejsy (m.in. eth0 i lo). Czy zauważyłe(a) różnicę? W jaki sposób można jš wytłumaczyć warstwowym modelem OSI?