IPv4 – Informacje ogólne o protokole

„IPv4 jest czwartą wersją protokołu komunikacyjnego przeznaczonego dla Internetu. Identyfikacja hostów odbywa się za pomocą 32bitowych, unikatowych adresów a komunikacja odbywa się za pomocą standardowych datagramów….”. Czy czytając taką definicję rozumiesz czym jest IPv4? Wiesz jak go konfigurować i jak z niego korzystać? Zapraszam do przewodnika po IPv4!

Czym jest IPv4

Protokół IPv4 jest protokołem wykorzystywanym do adresowania komputerów w sieci. Działa to tak samo, jak kiedy wysyłamy tradycyjny (papierowy) list czy paczkę. W IPv4 też mamy informacje o nadawcy i odbiorcy. Tak jak w tradycyjnej przesyłce IPv4 zawiera informacje dodatkowe takie, jak data nadania, waga albo czy usługa jest normalna, czy priorytetowa.

Adres IPv4 jest 32-bitowy – oznacza to, że w zapisie binarnym ma postać 32 jedynek lub zer. Ponieważ taki zapis bardzo ciężko zapamiętać, adres IP jest podzielony na cztery oktety, czyli cztery segmenty po osiem znaków. Każdy z segmentów zapisujemy w postaci liczby dziesiętne z przedziału od 0 do 255. Prawda, że taki zapis jest łatwiejszy? 🙂

Adres IPv4 jest adresem logicznym – czyli jest adresem, który możemy sami konfigurować. W przeciwieństwie do adresu MAC, który jest adresem fizycznym przypisanym w trakcie procesu produkcyjnego na stałe do interfejsu sieciowego, adres IPv4 możemy zmieniać w zależności od tego, do jakiej sieci podpinamy nasz komputer. Oznacza to również, że nasz interfejs sieciowy może mieć więcej niż jeden adres IP, jeśli tylko zachodzi taka potrzeba.

No i na końcu IPv4 jest adresem unikatowym i w sposób jednoznaczny identyfikuje host w sieci. Prawdziwość tego stwierdzenia zmieniała się nieco w czasie. O ile w początkowej fazie Internetu (mówiłem już, że IP to skrót od Internet Protocol? Nie? To teraz już wiesz 😊) adres musiał być unikatowy w skali całego Internetu, o tyle teraz wystarczy, że jest on unikatowy w obrębie sieci, w której występuje. Jest to związane z sieciami lokalnymi, o których w dalszej części artykułu.

Główne założenia działania IPv4

Protokół IPv4 został zaprojektowany tak, żeby optymalizować przesyłanie danych pomiędzy nadawcą i odbiorcą. Optymalizacja „best effort” oznacza, że sieć ma działać „najlepiej jak się da”. Model „best effort” oznacz, że:

  • IPv4 jest protokołem bezpołączeniowym – czyli nadawca nie informuje wcześniej odbiorcy o tym, że będzie nadawana wiadomość, po prostu rozpoczyna transmisję. To samo w przypadku doręczenia wiadomości, jej odbiorca nie ma obowiązku potwierdzenia, że przesyłka dotarła. Nie jest to oczywiście najlepsze rozwiązanie, dlatego tak gdzie istotna jest pewność doręczenia wiadomości, stosuje się protokół TCP. Wtedy protokół IP odpowiada jedynie za dostarczanie pakietów, a za pewność transmisji odpowiada TCP.
  • Nie wymaga dużej ilości danych sterujących – Nagłówek IP jest bardzo niewielki, bo poza najważniejszymi informacjami, jakimi są adres źródłowy i docelowy, zawiera jedynie kilka dodatkowych informacji naprawdę niezbędnych do prawidłowej komunikacji urządzeń. Dzięki temu wielkość nagłówka IPv4 mieści się w przedziale pomiędzy 20 a 60 bajtów.
  • Jest niezależny od nośnika – chociaż od wprowadzenia IPv4 minęło już prawie 40 lat i wielokrotnie wymieniane były media transmisyjne i urządzenia sieciowe nie miało to żadnego wpływu na ciągłość działania sieci. Nieważne czy używamy Wi-Fi, światłowodu czy kabla miedzianego sieć będzie działała. Nieważne jest nawet to, że w ramach jednej transmisji nośnik wielokrotnie się zmieni. Laptop podłączony po Wi-Fi do sieci lokalnej działającej na „skrętce” komunikuje się poprzez światłowód operatora z serwerem w Internecie. Komunikacja w takiej sytuacji działa bez problemu, a to wszystko dzięki niezależności od nośnika.

Struktura nagłówka IPv4

Tak jak w przypadku wszystkich protokołów IPv4 ma ustandaryzowaną strukturę. Budowę nagłówka przedstawia poniższy schemat.

Nagłówek IPv4

Wielkość i przeznaczenie poszczególnych pól wygląda następująco:

Wersja – 4 bity – dla IPv4 wartość tego pola wynosi po prostu 4.

IHL – 4 bity – określa wielkość nagłówka IPv4. Wielkość nagłówka podawana jest w ilości 32-bitowych linii. Wartość pola IHL wynosi zazwyczaj 5, chyba że nagłówek zawiera jakieś opcje.

Typ usługi (ToS – Type of Service) – 8 bitów – pole to jest używane do nadawania priorytety pakietom. Pole ToS zostało w kolejnych opracowaniach podzielone na pole DSCP (Differentiated Services Code Point) o rozmiarze 6 bitów oraz pole ECN (Explicit Congestion Notification) wielkości 2 bitów. Pola DSCP oraz SCN wskazują na priorytet pakietu, oraz na przepełnienie bufora.

Długość pakietu – 16 bitów – informuje o całkowitej długości pakietu, czyli wielkości zarówno nagłówka, jak i danych. Warto tutaj powiedzieć, że całkowita wielkość pakietu wynosi od 20 (sam nagłówek bez danych) do 65535 bajtów.

Numer Identyfikacyjny -16 bitów – pole to jest wykorzystywane do fragmentacji i późniejszej defragmentacji pakietów.

Flagi – 3 bity – to pole, chociaż ma trzy bity, to wykorzystywane są jedynie dwa z nich. Jeżeli flaga DF (Do Not Fragment) ustawiona jest na 0, to fragmentacja jest możliwa, a kiedy flaga ma wartość 1, takiego pakietu nie można poddać fragmentacji. Drugą flagą jest MF, czyli More Fragment. Ostatni pakiet transmisji ma ustawioną flagę MF na 0. Wcześniejsze pakiety będą przychodziły z flagą ustawioną na 1, a o kolejności, w jakiej należy je odtworzyć, będzie decydowało pole przesunięcia.

Time to live (TTL) – 8 bitów – parametr ten zapobiega „nieśmiertelności” pakietów krążących w sieci. Źle zaadresowany pakiet może wpaść w pętlę i krążyć pomiędzy routerami. Aby temu zapobiec, wprowadzono właśnie parametr TTL. Każdy router powinien obniżyć wartość TTL o 1 przed przesłaniem pakietu dalej. Jeśli wartość czasu życia osiągnie 0, router zablokuje pakiet i odeśle do nadawcy informację o błędzie. Mechanizm ten zapobiega krążeniu pakietów w sieci i jej przeciążeniu.

Protokół – 8 bitów – wskazuje na protokół warstwy wyższej. Może to być np. ICMP (1), TCP (6) czy UDP (17).

Suma kontrolna nagłówka – 16 bitów – pozwala sprawdzić, czy nagłówek nie został uszkodzony w trakcie przesyłania. Suma kontrolna wyliczana jest dla całego nagłówka, a ponieważ routery zmieniają wartość pola TTL przed przesłaniem pakietu, muszą również przeliczyć sumę kontrolną nagłówka dla każdego przesyłanego pakietu.

Adres źródłowy i adres docelowy – po 32 bity – nazwa tych pól mówi już wszystko o ich zastosowaniu. Wskazuje, kto wysłał pakiet i gdzie ma on trafić.

Opcje – od 0 do 320 bitów – obecnie pole opcji jest zazwyczaj puste, więc jego wielkość wynosi 0. W przeszłości były plany, żeby wykorzystać to pole np. do zapisywania adresów kolejnych routerów, przez które przechodził ruch. Jednak względu na ograniczoną wielkość pola niemożliwe było zapisywanie całej trasy, więc zaniechano używania do tego pola opcji.

Wypełnienie (Padding) – pole o zmiennej długości – wypełnienie uzupełnia zerami nagłówek do wielokrotności 32 bitów. Pole wypełnienia jest używane tylko wtedy, kiedy nagłówka IPv4 zawiera jakieś opcje.

Naglowek IP widziany w Wireshark

Więcej o nagłówku przeczytasz w dokumencie RFC 791 oraz w późniejszych aktualizacjach tego dokumentu.

Przeliczanie adresów dziesiętnych <-> binarnych

Zanim przejdziemy do dalszej, części musimy zrobić sobie małą powtórkę z przeliczania wartości binarnych na dziesiętne i na odwrót. Jeśli ta część jest Ci znana albo zupełnie Cię nie interesuje, nie krępuj się i przejdź od razu do drugiej części artykułu 🙂.

Za pomocą jednego bitu możemy zapisać maksymalnie dwie liczby – zero lub jedynkę, ale za pomocą dwóch bitów możemy zapisać już 4 liczby a za pomocą 3 bitów aż osiem. Ilość tych kombinacji przyrasta w sposób wykładniczy, czyli 2^x. To dlatego na ośmiu bitach możemy zapisać maksymalnie 256 różnych wartości, z przedziału od 0 do 255 (maksymalna wielkość dla pojedynczego oktetu adresu IP), a na 32 bitach możemy zaadresować 4 294 967 296 hostów (2^32).

Spójrz na poniższą tabelę. Jak widać pojawienie się jedynki w każdej z pozycji oktetu adresu IP przyporządkowana jest pewna określona wartość.

Binarny zapis IPv4

Jeśli chcemy uzyskać liczbę nie będącą wielokrotnością dwójki wystarczy, że dodamy do sieci dwie liczby, a więc 6 = 4+2 czyli 00000100 + 00000010 = 00000110. Albo 80 = 64 + 16 czyli 01000000 + 00010000 = 01010000. A na koniec 137 = 128 + 8 + 1 czyli 10000000 + 00001000 + 00000001 = 10001001.

Ciekawe są tutaj dwie rzeczy, po pierwsze, gdybyśmy zapełnili wszystkie pozycje na prawo od danej pozycji samymi jedynkami to i tak dostaniemy liczbę o jeden mniejszą od naszej liczny (01000000 to 64, ale 00111111 to 63). Po drugie, jedynym sposobem uzyskania liczby nieparzystej jest umieszczenie 1 na skrajnej prawej pozycji.

Teraz już wiemy jak przeliczać wartości binarne na dziesiętne, ale jak przeliczyć wartość dziesiętną na binarną? Sprawa jest prosta, dlatego najpierw 2 słowa teorii a później przykład. Przeliczenie wartości dziesiętnej na binarną polega na odejmowaniu i sprawdzeniu, czy wynik jest większy, mniejszy czy równy zero. Serio, nic bardziej skomplikowanego 😊. Jeśli chcę przeliczyć jakąś liczbę dziesiętną na binarną, to od tej liczby odejmuję kolejno wartość od ósmego do pierwszego bitu i jeśli wynik jest dodatki, to ten bit ma wartość 1, jeśli wartość jest ujemna, to wstawiam 0, a jeśli wynik wynosi zero, to wartość tego bitu wynosi 1, a ja nie muszę dalej liczyć, tylko uzupełniam kolejne bity zerami.

Przeliczmy to na przykładzie. Weźmy liczbę 215 i przeliczmy ją na system binarny.

  • Od 215 odejmuję maksymalną wartość na ósmym bicie, czyli 128. Ponieważ 215 -128 to 87, czyli wynik jest dodatki,  więc wstawiam 1.
  • Teraz od 87 odejmuję drugą cyfrę, czyli 64. Wynik znowu jest dodatni i wynosi 23, a więc dopisuję kolejną jedynkę i mam już 11.
  • W kolejnym kroku od 23 odejmujemy 32. Tym razem wynik jest ujemny, więc wstawiam zero i mam 110.
  • Następnie od 23 odejmuję 16, co znowu daje mi dodatni wynik 7, czyli dopisuję kolejną jedynkę i mam już 1101.
  • Teraz od 7 odejmuję 8 co daje ujemną wartość, a więc dopisuję 0 i mam 11010. Kontynuuję obliczenia i teraz mam 7 odjąć 4, wynik dodatni, a więc dopisuję jedynkę i mam 110101.
  • Od pozostałych 3 odejmuję 2, co znowu daje mi dodatni wynik, czyli dopisuję kolejną jedynkę uzyskując już 1101011.
  • No i na końcu od pozostałej cyfry 1 odejmuję 1 uzyskując 0. W zapisie binarnym znowu dopisuję 1 uzyskując ostatecznie wartość 11010111.
Przeliczanie adresu IP

Prawda, że to proste? Przeliczmy jeszcze nasz wynik na szybko do postaci dziesiętnej, żeby się upewnić, że nie zrobiliśmy błędu. 11010111 to 128+64+16+4+2+1, czyli 215, a więc nasze wyliczenia okazały się poprawne.

Jeśli masz ochotę zrobić kilka dodatkowych przykładów to śmiało a jeśli masz już wszystko opanowane możesz przejść do drugiej części artykułu.

Zanim stąd wyjdziesz…

Jeśli artykuł Ci się podobał, koniecznie daj mi znać. Podziel się również informacją o wpisie z innymi, którym ta wiedza może się przydać. Dzięki!

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *