Politechnika Częstochowska
Informatyka - studia dzienne, semestr 6, grupa 3.
PODSTAWY SIECI KOMPUTEROWYCH
ZAJĘCIA SEMINARYJNE
TEMAT: Analiza informacji w nagłówkach IP, TCP, UDP. Problematyka portów i gniazd.
Sebastian Chyrzyński
Damian Cecotka
Częstochowa, 2000
Poniżej przedstawione są warstwy architektury protokołu komunikacyjnego TCP/IP.
IGMP (Internet Group Management Protocol) protokół używany przez hosty i routery które wspierają multicasting.
ICMP (Internet Control Message Protocol) protokół ten wykorzystuje datagramy IP do przesyłania komunikatów sterujących, raportów o błędach lub komunikatów informacyjnych takich jak: sterowanie przepływem danych, wykrywanie nieosiągalnych miejsc przeznaczenia, przekierowywanie ścieżek, sprawdzanie zdalnego hosta.
ADR (Address Resolution Protocol) protokół przekształcający 32-bitowy adres sieciowy IP na adres fizyczny w sieci LAN (np. adres karty sieciowej).
RADR (Reverse Address Resolution Protocol) protokół przekształcający 32-bitowy adres fizyczny na adres IP.
Protokowy IP, TCP i UDP zostaną omówione wraz z ich nagłówkami.
Nagłówek IP (Internet Protocol - header).
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
wersja |
IHL |
typ usługi |
długość pakietu |
||||||||||||||||||||||||||||
identyfikator |
? |
DF |
MF |
? |
przesunięcie fragmentacji |
||||||||||||||||||||||||||
czas życia (TTL) |
protokół |
suma kontrolna nagłówka |
|||||||||||||||||||||||||||||
adres nadawcy |
|||||||||||||||||||||||||||||||
adres odbiorcy |
|||||||||||||||||||||||||||||||
Opcje |
wypełnienie |
IP jest protokołem bezpołączeniowym. Oznacza to, że IP nie wysyła ani nie przyjmuje żadnych informacji kontrolnych, które przed wysyłaniem danych ustanowiłyby połączenie między nadawcą i odbiorcą. Dlatego jeżeli protokoły innych warstw używają usług połączeniowych, muszą same zadbać o ich implementację. Również odpowiedzialność za wykrywanie i korekcję błędów spada na inne protokoły.
Nagłówek IP wraz z danymi nazywany jest datagram'em.
Pierwszą informacją zapisaną w nagłówku jest numer wersji (obecnie używa się IPv.4). Następnie zdefiniowana jest długość nagłówka (IHL - Internet Header Length) w słowach - szóste słowo jest opcjonalne. Informacje o typie usługi pozwala wpłynąć na sposób w jaki pakiet jest traktowany. Ostatnim polem w pierwszym słowie jest długość pakietu wraz z nagłówkiem (w bajtach).
Pola adres nadawcy i adres odbiorcy zawierają adresy IP komputerów źródłowego i docelowego. Jeżeli adres przeznaczenia wskazuje na hosta w sieci lokalnej, pakiet (datagram) kierowany jest bezpośrednio do adresata. Jeżeli natomiast adres przeznaczenia nie dotyczy sieci lokalnej, pakiet przekazywany jest do bramki, która dalej zajmuje się jego obsługą. IP dokonuje rutowania dla każdego pakietu osobno, niezależnie od pozostałych.
W trakcie przekazywania datagram'u poprzez różne sieci (połączone bramką) może zajść potrzeba podzielenia go na mniejsze części (fragmentacji). Ponieważ każdy typ sieci ma określony maksymalny rozmiar pakietu (MTU maximum transmission unit), który może być w całości przesyłany przez sieć, datagram otrzymany z jednej sieci może być zbyt duży do przesłania go w całości przez inną sieć.
Flaga DF (don't fragment) informuje router o tym, że pakiet może być przesyłany dalej tylko w całości - jego fragmentacja jest zabroniona. Jeżeli pakiet taki okaże się zbyt duży dla komputera docelowego zostanie po prostu skasowany. Identyfikator jest parametrem pozwalającym nadawcy jednoznacznie rozróżnić wysyłane pakiety tzn. wskazuje do którego datagram'u należy dany element. We wszystkich wersjach są to kolejne liczby będące numerami pakietów. Flaga MF (more fragments) oznacza, że podczas transmisji pomiędzy komputerami pakiet został podzielony na części, a odebrana paczka danych jest tylko fragmentem, mówi także czy cały datagram został odebrany. Przesunięcie fragmentacji informuje od którego bajtu pierwotnego pakietu rozpoczyna się dany fragment. Bazując na tym parametrze możliwe jest późniejsze odtworzenie pakietu z części.
Czas życia (TTL - time to live) określa jak długo pakiet może być przesyłany do kolejnych węzłów sieci. Po przejściu przez każdy węzeł wartość ta zmniejszana jest o 1. Kiedy w końcu osiągnie 0, pakiet jest po prostu kasowany. Procedura ta zapobiega przed krążeniem w sieci, w nieskończoność, pakietów które nie można dostarczyć.
Pole protokół określa numer protokołu warstwy transportowej (np. TCP = 6, UDP = 17) do którego IP przekaże datagram.
Dzięki sumie kontrolnej można określić czy nagłówek został przesłany bezbłędnie.
Informacje specjalne, wykorzystywane na przykład do zarządzania siecią, umieszczane są w polu opcje.
W warstwie sieciowe znajdują się także protokoły ICMP i IGMP, są one ściśle powiązane z protokołem IP.
Nagłówek TCP (Transport Control Protocol - header).
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
port nadawcy |
port odbiorcy |
||||||||||||||||||||||||||||||
numer sekwencyjny |
|||||||||||||||||||||||||||||||
numer potwierdzenia |
|||||||||||||||||||||||||||||||
przesunięcie |
zarezerwowane |
URG |
ACK |
P SH |
RST |
SYN |
F I N |
szerokość okna |
|||||||||||||||||||||||
suma kontrolna |
wskaźnik priorytetu |
||||||||||||||||||||||||||||||
opcje |
wypełnienie |
Aplikacje wymagające od protokołu transportowego niezawodnej transmisji danych powinny wykorzystywać TCP. Weryfikuje on, czy dane zostały poprzez sieć dostarczone poprawnie i we właściwej kolejności. TCP jest protokołem niezawodnym, połączeniowym i działającym na strumieniu bajtów.
TCP zapewnia niezawodność dzięki mechanizmowi potwierdzenia z retransmisją (PAR Positive Acknowledgment with Re-transmission). System używający PAR wysyła dane (te same) dopóty, dopóki nie otrzyma wiadomości, że dane przeszły bezbłędnie. Blok danych, który wymieniają między sobą współpracujące moduły TCP, nazywa się segmentem (nagłówek TCP + dane). Każdy segment zawiera sumę kontrolną, która jest wykorzystywana przez odbiorcę do kontroli poprawności danych. Jeżeli segment danych został odebrany bez błędów, odbiorca wysyła potwierdzenie otrzymania danych do nadawcy. Jeżeli odebrany segment jest uszkodzony, odbiorca odrzuca go. Po odpowiednim czasie moduł TCP wysyłający dane ponawia transmisję segmentu, dla którego nie otrzymał potwierdzenia.
TCP jest protokołem połączeniowym. Ustawia logiczne połączenie pomiędzy komunikującymi się hostami. Przed właściwą transmisją hosty wymieniają komunikaty, zwane handshake. O tym, czy wysyłany segment jest kontrolny, świadczy ustawienie odpowiedniej flagi w czwartym słowie nagłówka.
TCP stosuje potwierdzenie trójpoziomowe (three-way handshake), ponieważ w trakcie ustalania połączenia wymieniane są trzy segmenty kontrolne. Najpierw host A wysyła do hosta B segment z ustawionym bitem „numer sekwencji synchronizującej” SYN. Segment ten informuje hosta B o tym, że host A chce nawiązać z nim połączenie oraz informuje, jaki będzie początkowy numer sekwencji przesyłania danych. (Numer sekwencji jest to liczba kolejnego wysyłanego segmentu, pozwala ona ustawić przychodzące dane w odpowiedniej kolejności.). Host B odpowiada hostowi A segmentem z ustawionymi bitami potwierdzenia ACK i synchronizacji SYN, potwierdzając odbiór segmentu od A i informuje go, od jakiego numeru sekwencyjnego będzie odliczał wysyłane przez siebie dane. Na koniec host A wysyła segment potwierdzający odbiór pakietu od B, zawierający pierwsze przesyłane dane.
Po takiej wymianie segmentów TCP w systemie A wie, że zdalny TCP działa i jest gotów do odbioru danych. Dane mogą zostać przesłane zaraz po nawiązaniu połączenia. Po zakończeniu transmisji hosty wymieniają trzy segmenty potwierdzenia z ustawionym bitem końca danych FIN, co powoduje zerwanie połączenia pomiędzy nimi. W ten sposób odbywa się wymiana danych nadawca - odbiorca za pomocą logicznego połączenia między dwoma systemami.
TCP interpretuje wysyłane dane jako ciąg strumieni bajtów, a nie jako niezależne pakiety. Z tego powodu istotne jest zachowanie kolejności, w jakiej bajty zostaną wysłane i odebrane. Do tego celu służą umieszczone w nagłówku pola numer sekwencji i numer potwierdzenia.
Dla standardu TCP nie jest istotne od jakiej liczby system rozpocznie numerację bajtów; każdy system wybiera sobie sam liczbę początkową. Żeby kolejność bajtów u nadawcy i odbiorcy była identyczna, muszą znać wybrane przez siebie numery początkowe. Numery te wymieniane są w segmentach potwierdzenia z ustawionym bitem SYN. Pole numer sekwencji w segmencie SYN zawiera początkowy numer sekwencji (ISN Initial Sequence Number), od którego numerowane są przychodzące bajty danych. Ze względów bezpieczeństwa ISN powinien być wybrany losowo, często jednak nadaje mu się wartość 0.
Bajtom danych nadawane są numery kolejne począwszy od ISN, a pierwszy bajt danych ma numer ISN+1. Numer sekwencji w nagłówku segmentu danych określa pozycje w strumieniu danych pierwszego bajtu w przesyłanym segmencie. Jeżeli na przykład pierwszy bajt w strumieniu danych miał numer 1 (ISN=0) i przesłano już 4000 bajtów danych, to pierwszy bajt w kolejnym segmencie będzie bajtem 4001, a numer sekwencji wyniesie 4001.
Segment z ustawionym bitem potwierdzenia ACK pełni dwie funkcje: potwierdza otrzymanie danych i steruje ich przepływem. Informuje on nadawcę, w jakim stanie doszły dane oraz ile odbiorca może ich jeszcze przyjąć. Liczba w polu numer potwierdzenia , zawiadamia nadawcę, jaki numer sekwencyjny odbiorca spodziewa się znaleźć w kolejnym segmencie danych. Standard nie wymaga potwierdzenia każdego segmentu danych. Segment potwierdzający poświadcza odbiór wszystkich danych od początku transmisji. Jeżeli na przykład pierwszy wysyłany bajt danych miał numer 1, a do tej pory prawidłowo odebrano 2000 bajtów, liczba w polu numer potwierdzenia będzie wynosiła 2001.
Pole okno zawiera liczbę bajtów, które może jeszcze przyjąć odbiorca. Jeżeli odbiorca jest w stanie przyjąć jeszcze 6000 bajtów, okno będzie miało wartość 6000. Nadawca może wysyłać segmenty tak długo, jak sumaryczna liczba wysłanych bajtów nie przekroczy wartości okna. Za pomocą okna odbiorca steruje przepływem bajtów między nim i nadawcą. Okno o wartości 0 nakazuje nadawcy wstrzymanie transmisji do momentu, aż odbiorca nie prześle segmentu z oknem o niezerowej wartości. Jeżeli nadawca zapełni okno i nie otrzyma w określonym czasie potwierdzenia od odbiorcy, ponowi transmisję danych od pierwszego bajtu, dla którego nie otrzymał potwierdzenia.
TCP odpowiada również za przekazywanie danych odebranych z warstwy IP do odpowiednich aplikacji. Aplikacja, dla której przeznaczone są dane, identyfikowana jest poprzez 16-bitowy numer portu. Numer portu źródłowego (source port) i numer portu przeznaczenia (destination port) są zapisane w pierwszym słowie nagłówka segmentu.
Nagłówek UDP (User Datagram Protocol - header).
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
port źródłowy |
port przeznaczenia |
||||||||||||||||||||||||||||||
długość |
suma kontrolna |
UDP daje aplikacjom bezpośredni dostęp do usług rozsyłania datagram'ów, podobny do usług oferowanych przez IP. Pozwala to aplikacjom wymieniać komunikaty minimalnym nakładem środków.
UDP nie jest niezawodnym sposobem komunikacji. Ponadto oferuje usługi tylko bezpołączeniowe. Nie dysponuje żadnymi mechanizmami umożliwiającymi kontrolę, czy wysyłane dane dotarły poprawnie do miejsca przeznaczenia. Komunikacja będzie z pewnością poprawna w obrębie jednego komputera. UDP do określenia aplikacji nadającej i odbierającej dane wykorzystuje pierwsze słowo nagłówka, zawierające numery portu źródłowego i portu docelowego transmisji.
Porty i gniazda.
Datagram dociera do hosta wskazanego przez adres przeznaczenia zawarty w piątym słowie nagłówka. IP dostarcza go do odpowiedniego protokołu warstwy transportowej, wskazanego przez numer protokołu z trzeciego słowa nagłówka datagramu. Pierwsze słowo danych (nagłówka TCP lub UDP) przekazanych do warstwy transportowej zawiera dwa 16-bitowe numery portów. Numer portu źródłowego, odpowiadający procesowi, który wysłał dane oraz numer portu docelowego, odpowiadający procesowi, który ma otrzymać dane.
Numery portów poniżej 256 są zarezerwowane dla dobrze znanych usług, dzięki nim zdalny komputer wie, którego portu powinien używać dla danej usługi sieciowej np.: FTP-20 i 21, telnet-23, SMTP-25, HTTP-80, usługa związana z informacją o dostępnych portach-111. Usługi od 256 do 1024 używane są przez specyficzne usługi np. dla UNIX'a.
Trzeba pamiętać również , że dla różnych protokołów (TCP i UDP) te same numery portów mogą oznaczać inne usługi.
Jednak aby móc korzystać z portów potrzebne są jeszcze gniazda (sockets). Gniazda powstały na Uniwersytecie w Berkeley jako część systemu UNIX - aby umożliwić komunikacje między procesami poprzez sieć, ale dostępne są również w Windows poprzez bibliotekę WinSock API (The Windows Socket API), której funkcje prawie nie różnią się od UNIX'owych.
Termin gniazdo jest używany do opisania końcowego punktu komunikacji w sieci komputerowej. Aby nastąpiła komunikacja w sieci między procesami odległych hostów potrzebne są gniazda na obu jej końcach. Gniazdo jest skojarzone z procesem na komputerze i stanowi połączenie adresu IP i numeru portu. Większość sieciowej komunikacji tzn. peer-to-peer i klient/serwer wymaga dwóch gniazd. Inne konfiguracje takie jak zarządzanie zadaniami sieciowymi czy audycje radiowe wymagają komunikacji rozgłoszeniowej (multicast lub broadcast).
Rodzaje gniazd:
- Gniazda zorientowane połączeniowo (Connection-oriented sockets) jest podobne do połączenia telefonicznego - utrzymywane jest dopóki jedna ze stron nie przerwie połączenia.
- Gniazda bezpołączeniowe (Connectionless sockets) jest podobne do przesyłek pocztowych ponieważ nie ma połączenia z miejscem przeznaczenia.
- Surowe Gniazda (Raw sockets) możliwe jest utworzenie gniazd (wykorzystując funkcje niskiego poziomu), które mogą manipulować indywidualnymi polami w nagłówkach protokołów . Na przykład można użyć takiego gniazda do stworzenia aplikacji która będzie ustalać przez które router'y będzie przesyłany datagram.
Przykładowe połączenie klient/serwer wygląda następująco:
Proces serwera WWW tworzy gniazdo z ogólnie znanym numerem portu - w tym przypadku jest to usługa HTTP mająca numer 80.
Po utworzenie gniazda o tym numerze serwer czeka na połączenie np. w nieskończonej pętli w osobnym wątku.
Aplikacja klienta (np. przeglądarka www) tworzy gniazdo z dowolnym numerem portu. Następnie łączy się z serwerem wykorzystując jego adres IP (lub URL zamieniany na IP poprzez DNS) i numer portu (aplikacja klienta wie że usługa HTTP ma numer potu 80).
Gdy pojawi się połączenie serwer akceptuje je i tworzy nowe gniazdo (np. w innym wątku) z dowolnym - nie zarezerwowanym ani nie używanym obecnie - numerem portu.
Nowe gniazdo staje się tym z którym połączony jest klient, a gniazdo z numerem portu 80 jest wolne. Dzięki temu kolejne procesy klienta mogą łączyć się z usługą HTTP serwera.
Literatura:
Craig Hunt, TCP/IP-Administracja sieci, RM, Warszawa 1998.
Viktor Toth, Programowanie Windows 98/NT-Księga eksperta, Helion, Gliwice 1999.
Inne:
Mastering MFC Develoment Using Microsoft Visual C++ 6.0 (Microsoft Official Curriculum).
Magazyn komputerowy CHIP, 10/1997, art. Protokoły sieciowe -TCP/IP ,Pawlak M.