IP (Internet Protocol) to protokół komunikacyjny działający w warstwie sieciowej modelu OSI lub internetowej stosu TCP/IP. IP wraz z innymi protokołami tworzącymi stos TCP/IP stanowi podstawę działania większości współczesnych sieci komputerowych (w tym Internetu). Protokół ten jest bezpołączeniowym protokołem komunikacyjnym umożliwiającym przesyłanie danych w formie pakietów. Pakiety zawierają adresy odbiorcy, nadawcy oraz całość lub fragment przesyłanych danych. Głównym zadaniem tego protokołu jest wybór trasy oraz przesłanie nią pakietów z danymi. W razie awarii IP będzie starał się dostarczyć pakiety trasami alternatywnymi. Jest to podstawowy protokół działający w internecie. IP jest czasami określany jako zawodny protokół przesyłania pakietów, ponieważ nie daje żadnej gwarancji, że pakiety dotrą do odbiorcy. Pakiet podczas przesyłania może zostać zgubiony, zatrzymany, dotrzeć w innej kolejności niż podczas wysyłania lub zostać przekazany z błędami. Protokół IP jest protokołem bezpołączeniowym, każdy pakiet obsługiwany jest oddzielnie. Pakiety z danymi jednej transmisji mogą zostać przekazane zupełnie innymi trasami, część z nich może zostać zgubiona lub dotrzeć z opóźnieniem. Ponadto nie ma obsługi powiadamiania nadawcy i odbiorcy o błędach w transmisji. Wszystkie te funkcje muszą być obsługiwane przez inne warstwy modelu OSI.
Aby dwa urządzenia mogły między sobą przesyłać dane konieczne było wprowadzenie adresów IP - unikalnych numerów przyporządkowanych interfejsom sieciowym urządzeń znajdujących się w danej sieci fizycznej. Adres IP możemy sobie wyobrazić jako adres, którego używamy wysyłając przesyłkę pocztą. Adresy IP urządzeń jednej sieci nie mogą się powtarzać. W Internecie przyznawaniem adresów IP zajmuje się organizacja IANA (Internet Assigned Numbers Authority).
Powszechnie stosowaną wersją protokołu IP jest wersja 4. Jednak ze względu na ograniczenia dotyczące adresowania spowodowane niedostateczną, w stosunku do rosnących potrzeb, liczbą adresów IP protokół ten będzie w przyszłości zastąpiony nowszą wersją IPv6. Protokół IPv4 został szczegółowo opisany w dokumencie RFC 791.
W sieciach korzystających z IPv4 wykorzystywane są adresy składające się z 32 bitowych ciągów zer i jedynek. Dla uproszczenia adresy IP są zapisywane w postaci czterech liczb dziesiętnych oddzielonych kropkami.
Na przykład adres IP 1000000.10101000.00000001.00000001 w zapisie dziesiętnym będzie miał wartość 192.168.1.1.
Każda z części adresu nazywana jest oktetem ponieważ składa się z ośmiu cyfr w systemie dwójkowym. Zapisy dziesiętne są prostsze w stosowaniu - łatwiej uniknąć pomyłki.
Adresy IP składają się z dwóch części - adresu sieci i adresu hosta.
Router przekazując pakiet pobiera najpierw adres sieci odbiorcy, a następnie przekazuje pakiet do routera do którego podłączona jest sieć adresata. Gdy pakiet dotrze do routera połączonego z siecią adresata, router ten używa adresu hosta zawartego w adresie IP do zlokalizowania konkretnego urządzenia znajdującego się w tej sieci.
W przypadku IPv4 część adresu przeznaczona na identyfikator sieci jest zależna od długości maski sieciowej. Maska służy do wyznaczania adresu sieciowego, który musi być taki sam dla wszystkich urządzeń znajdujących się w tej samej podsieci. Maska podsieci podobnie jak adres IP składa się z 32 bitów. Tworzona jest ona poprzez ustawianie wartości bardziej znaczących bitów maski na 1. Liczba jedynek w masce decyduje ile bitów adresu IP urządzenia będzie opisywało adres sieci, np. dla maski 11111111.11111111.11111111.00000000 (255.255.255.0 dziesiętnie) pierwsze 24 bity oznaczają adres sieci, natomiast pozostałe 8 bitów opisuje adres hosta. Maski sieciowe, podobnie jak adresy ip dla ułatwienia zapisuje się również w postaci dziesiętnej.
Adresacje IP dzielimy na klasową i bezkasową w zależności od zastosowanych adresów IP i przydzielonych masek podsieci. W przypadku notacji klasowej, klasy oraz maski są ściśle określone, natomiast w przypadku notacji bezklasowej dowolnym adresom IP mogą być przydzielane dowolne maski podsieci.
IPv4 definiuje pięć klas adresów oznaczonych literami od A do E. Klasy A, B, C są dostępne dla użytkowników, klasa D używana jest do grupowego wysyłania danych w sieci, natomiast adresy klasy E zostały zarezerwowane na potrzeby badawcze.
Adresy klasy A przeznaczone są dla dużych sieci. Pierwszy bit oktetu w którym zawarty jest adres sieci jest równy 0. W związku z tym adresy sieci mogą przyjmować wartości od 0 do 127. Sieci 0 i 127 są zarezerwowane, więc do wykorzystania pozostają sieci od 1 do 126. W każdej sieci należącej do klasy A możemy wyodrębnić 16777216 adresów (liczba urządzeń będzie o 2 mniejsza, ale o tym w dalszej części artykułu). Klasa 127.0.0.0 wykorzystywana jest na potrzeby pętli zwrotnej, tj. umożliwia wysyłanie pakietów do samego siebie. Maska standardowa dla tej klasy to 255.0.0.0.
Adresy klasy B przeznaczone są do sieci średniej wielkości. Adres sieci zawarty jest w dwóch oktetach. Pierwsze dwa bity pierwszego oktetu wynoszą 10. W każdej sieci należącej do tego klasy można wyróżnić 65536 adresów (65534 urządzenia). Do tej klasy należą adresy sieci od 128 do 191 w ujęciu dziesiętnym. Maska standardowa dla tej klasy to 255.255.0.0.
Adresy klasy C przeznaczone są dla małych sieci, gdyż każda sieć może posiadać „jedynie” 256 adresów (254 urządzenia). Na adres sieci w sieciach należących do tej klasy przeznaczone są 3 oktety. Pierwsze trzy bity adresu wynoszą 110, w związku z tym do klasy tej należą adresy od 192 do 223 dziesiętnie. Maska standardowa dla tej klasy to 255.255.255.0.
Klasa D została zarezerwowana na potrzeby rozsyłania grupowego przy użyciu adresów IP. Adres należący do tej klasy umożliwia przekierowanie pakietów do zdefiniowanej wcześniej grupy odbiorców. Dzięki temu możliwe jest przesłanie danych równocześnie do wielu odbiorców. Adresy tej klasy wykorzystywane są np. przez protokoły routingu. Pierwsze cztery bity adresu IP są równe 1110. Adresy należące do tej klasy zawierają się w przedziale od 224 do 239.
Adresy należące do klasy E zostały zarezerwowane przez Internet Engineering Task Force na potrzeby badawcze, wobec tego nie są dostępne publicznie. Pierwsze cztery bity adresu klasy E mają wartość 1111, w związku z tym adresy tej klasy zawierają się w przedziale od 240 do 255 dziesiętnie.
W przypadku notacji klasowej, adresy hostów kończące się 0 lub 255 mają przydzielone specjalne funkcje, w związku z tym nie mogą być wykorzystane do adresowania urządzeń w sieciach. Adres IP zakończony 0 używany jest jako adres sieci, natomiast adres z końcówką 255 wykorzystywany jest jakoadres rozgłoszeniowy (ang. broadcast). Dane wysyłane na adres rozgłoszeniowy powinny być dostarczone do każdego urządzenia znajdującego się w danej sieci. Oprócz tego identyfikator hosta nie może składać się z samych 0 lub 255.
Mając na względzie powyższe ograniczenia wiadomo już czemu liczba urządzeń w każdej klasie jest zawsze o 2 mniejsza od ilości dostępnych adresów IP.
W każdej z klas dostępnych dla użytkowników (A - C) wyróżniono po jednej puli adresów prywatnych, które mogą być wykorzystane do adresacji urządzeń w sieciach lokalnych. Adresy prywatne są nieroutowalne (nie są przekazywane przez routery), w związku z tym nie ma do nich dostępu z sieci Internet.
Adresy prywatne:
Klasa A - 10.0.0.0 - 10.255.255.255 z maską 255.0.0.0
Klasa B - 172.16.0.0 - 172.31.255.255 z maską 255.255.0.0
Klasa C - 192.168.0.0 - 192.168.255.25 z maską 255.255.255.0
Wraz ze wzrostem popularności Internetu adresacja klasowa stała się nieefektywna ze względu na niedopasowanie ilości dostępnych adresów w poszczególnych klasach do faktycznych potrzeb użytkowników. Nie było odpowiednich klas adresowych dla organizacji, które chciały podłączyć do Internetu np. 20 czy też 300 urządzeń. Dostępne klasy adresów zaczęły się bardzo szybko kurczyć.
Jednym ze sposobów na rozwiązanie powyższego problemu było zastosowanie podsieci. Polegało to na wykorzystaniu zmiennej liczby bitów adresu IP przypadających na adres sieci poprzez dostosowanie maski podsieci. Tworzenie podsieci najlepiej omówić na przykładzie. Do tego celu wykorzystamy sieć 192.168.0.0/255.255.255.0. Przy standardowej masce mamy dostępne 256 adresów, z czego 2 odpadają na adres sieci i broadcast. Podzielmy naszą klasę na dwie podklasy. Aby zaadresować dwie podsieci musimy „pożyczyć” jeden bit z adresu hosta (2^1 = 2), w związku z tym nowa maska podsieci będzie wyglądała w ten sposób 11111111.11111111.11111111.10000000 (255.255.255.128 dziesiętnie). Tak więc stworzyliśmy dwie podsieci:
Początkowe bajty każdego pakietu IPv4 to nagłówek, który przedstawia się następująco:
Wersja - w tym polu nagłówka znajduje się wersja protokołu IP, w przypadku IPv4 znajduje się tam cyfra 4
IHL - długość nagłówka pakietu IP wyrażona w postaci liczby czterobajtowych części
Typ usługi - określa priorytet pakietu
Długość całkowita - pole zawiera całkowitą długość pakietu (nagłówek + dane), maksymalna długość pakietu to 65535 bajtów
Identyfikator - pole zawiera unikatory identyfikator dla każdego pakietu wykorzystywany do połączenia pakietów w strumień danych
Flagi - określa między innymi czy pakiet może być fragmentowany
Przesunięcie fragmentu - umożliwia złożenie pakietu w całość pakietu, określają miejsce danego fragmentu w całym pakiecie
Czas życia (TTL - Time To Live) - ilość przeskoków przez które może pakiet przejść zanim zostanie odrzucony (urządzenia przez które przechodzi dany pakiet zmniejszają tą wartość o 1)
Protokół - to pole zawiera informacje jaki protokół warstwy transportowej został wykorzystany (TCP, UDP, ICMP lub inne)
Suma kontrolna nagłówka - gdy odbiorca dostanie pakiet, sprawdza jego poprawność obliczając sumę kontrolną i porównując ją z sumą kontrolną zapisaną w nagłówku
Adres źródłowy i adres docelowy - zawierają adresy IP urządzeń które przesyłają między sobie dane zapisane w formacie binarnym
IPv6 jest najnowszą wersją protokołu IP. Do stworzenia IPv6 w dużej mierze przyczynił się problem kończącej się ilości adresów IPv4. Intensywny rozwój Internetu spowodował, że 32 bitowa liczba adresów IPv4 w szybkim tempie zaczęła się kurczyć. W celu rozwiązania tego problemu powołano grupę roboczą Internet Engineering Task Force (IETF), która opracowała wersję 6 protokołu IP. Dodatkowymi założeniami projektu była eliminacja wad starszej wersji, wprowadzenie nowych rozszerzeń takich jak kompresja, uwierzytelnianie czy autokonfiguracja. IPv6, tak jak i jego poprzednik - IPv4 należy do protokołów warstwy sieciowej modelu OSI, w związku z tym jest niezależny od innych protokołów. Protokół IP w wersji 6 został zdefiniowany w specyfikacjach RFC 1883, RFC 1884 i RFC 2460. W Internecie IPv6 był wdrażany w ramach eksperymentalnej sieci 6BONE przy pomocy tuneli wykorzystujących poprzednią wersję protokołu. Obecnie co raz więcej operatorów telekomunikacyjnych decyduje się na wprowadzenie IPv6 do swoich sieci na zasadach podobnych jak w przypadku IPv4.
Jedną z podstawowych zalet nowej wersji protokołu jest znacznie większa liczba dostępnych adresów IP. Ze względu na to, że do zapisania adresu w IPv6 użytych jest 128 bitów, to dostępna pula adresów wynosi około 3,4×10^38 adresów. Adres IP zapisywany jest zwykle w postaci heksadecymalnej w taki sposób, że co 16 bitów (4 cyfry heksadecymalne) wstawiany jest separator w postaci dwukropka. Przykładem takiego adresu może być 3ffe:8010:0931:ff00:00aa:0000:0000:0001. Zapis w postaci heksadecymalnej pozwala na opuszczenie wiodących zer każdej części adresu. W związku z tym powyższy adres możemy zapisać jako: 3ffe:8010:931:ff00:aa:::1. Niektóre adresy mogą zawierać dłuższe sekwencje zer. W takim przypadku sąsiadujące ze sobą 16 bitowe bloki wypełnione samymi zerami można zapisać jako podwójny dwukropek. Na przykład adres 3ffe:8010:0000:0000:0000:0000:0000:0001 możemy zapisać jako 3ffe:8010::1.
W adresach IPv6 nie występuje maska podsieci, jej funkcje przejął prefix. Prefix jest liczbą dziesiętną informującą o tym ile bitów adresu zostało przydzielone na adres sieci. Przykładem adresu z prefiksem jest: 3ffe:8010::/32.
Ze względu na to, że większa część ruchu IPv6 odbywa się nadal wykorzystując protokół IPv4, pakiety IPv6 są tunelowane wewnątrz IPv4.
Jedną z cech odróżniających nową wersję protokołu jest brak adresów rozgłoszeniowych, których funkcje przejęły adresy rozsyłania grupowego.
Specyfikacja protokołu zakłada istnienie trzech typów adresów:
unicast - adres pojedynczego interfejsu. Pakiety kierowane na ten adres trafiają tylko do jeddnego hosta. W tej grupie adresów znajdują się między innymi globalne adresy IPv6 używane w Internecie, adresy typu link - local, oraz adres pętli zwrotnej
multicast - adresy tego typu przejęły rolę adresów rozgłoszeniowych z IPv4 (broadcastowych i multicastowych). Pakiet tego typu dotrze do wszystkich interfejsów danej grupy. Pojedynczy interfejs może należeć do dowolnej liczby grup. Adres tego typu nie może być używany jako źródłowy.
anycast - jest to adres przypisany do więcej niż jednego interfejsu (zwykle różnych urządzeń). Pakiet wysyłany na adres anycast dostarczany jest do najbliższego interfejsu. W związku z tym pakiety wysyłane pod ten sam adres z różnych miejsc w sieci mogą być przetwarzane przez dwa różne urządzenia. Adres tego typu również nie może być używany jako źródłowy.
IPv6 otrzymał większe możliwości konfiguracji adresów w sieciach lokalnych. Urządzenia podłączone do sieci automatycznie konfigurują swoje adresy IPv6 na podstawie prefiksów rozgłaszanych w sieci przez routery przy pomocy ICMPv6. W adresie takim zawarty jest odpowiednio zmieniony MAC urządzenia które dokonuje autokonfguracji. Natomiast jeśli host nie otrzymał prefiksu od routera, wykorzystywana jest sieć fe80. Adres taki należy do puli adresów link - local. Oczywiście nadal konfigurowanie adresów jest możliwe przy pomocy DHCP.
W IPv6, podobnie jak w poprzedniej wersji protokołu występują specjalne pule adresowe. Są to między innymi:
::/128 - adres składający się z samych zer, wykorzystywany jest głównie w programowaniu.
::1/128 - adres pętli zwrotnej.
::/96 - pula zarezerwowana dla zachowania zgodności z poprzednią wersją protokołu, wykorzystywana do zapisania adreów IPv6 w postaci IPv4.
::ffff:0:0/64 - j. w., ponadto umożliwia komunikację w sieci.
fe80::/10 - pula link-local, wykorzystywana w obrębie jednego łącza fizycznego np. sieć Ethernet.
fc00::/7 — lokalne adresy IPv6 typu unicast, wykorzystywane do komunikacji pomiędzy podsieciami w sieciach lokalnych.
ff00::/8 - pula adresów typu multicast
Protokół IP w wersji 6 otrzymał nowy format pakietu:
Format nagłówka podstawowego IPv6 wygląda następująco
Wersja - w tym polu nagłówka znajduje się wersja protokołu IP, w przypadku IPv6 znajduje się tam cyfra 6.
Priorytet - pole określa czy pakiet ma reagować na obciążenia sieci czy bez względu na obciążenie zostać przekazany w pierwszej kolejności.
Etykieta przepływu - pole w którym znajduje się znacznik pakietu. Jest częścią mechanizmu kontroli przepływu. Trasy pakietów z ustawionym tym polem są buforowane na routerach dzięki czemu taka trasa nie musi być obliczana za każdym razem gdy router otrzyma pakiet.
Długość pola danych - pole, w którym zawarta jest długość pola danych pakietu wraz z nagłówkami rozszerzającymi.
Następny nagłówek - pole opisujące typ nagłówka znajdującego się zaraz za nagłówkiem IPv6.
Czas życia (TTL - Time To Live) - ilość przeskoków przez które może pakiet przejść zanim zostanie odrzucony (urządzenia przez które przechodzi dany pakiet zmniejszają tą wartość o 1)
Adres źródłowy - 128 bitowy adres nadawcy pakietu.
Adres docelowy - 128 bitowy adres odbiorcy pakietu.
W IPv6 dodatkowe informacje zapisywane są w oddzielnych nagłówkach, które są umieszczone za nagłówkiem podstawowym pakietu. Rodzaj nagłówka rozszerzeń jest definiowany przez wartość pola „następny nagłówek”. Nagłówki rozszerzeń mają długość równą wielokrotności liczby 8. Szczegółowa specyfikacja nagłówków rozszerzeń znajduje się w RFC 2460, RFC 2402 oraz RFC 2406.