PODSTAWY SIECI IP
Wstęp - sieci, pakiety, TCP/IP
Sieć jest to zasadniczo zbiór hostów (urządzeń wykorzystujących sieć do komunikacji, takich jak komputery, drukarki sieciowe) oraz infrastruktury sieciowej (urządzenia aktywne, okablowanie). W przypadku bardziej abstrakcyjnego patrzenia na zagadnienia sieciowe (właśnie od strony protokołów wyższych warstw niż sprzętowa - takich jak IP) na sieć można patrzeć tylko jako na zbiór hostów (posiadających identyfikujące je numery). Dla funkcjonowania sieci konieczne jest zapewnienie dobrze określonych zasad jej działania - właśnie zbiorami takich zasad wymiany informacji są protokoły sieciowe.
W dokumencie tym zajmować się będziemy zbiorem protokołów określanych mianem TCP/IP. Protokoły te operują na pakietach (zasadniczo o pakietach mówimy przy IP i TCP natomiast przy UDP mówimy o datagramach) czyli porcji przesyłanej informacji, do której dodane zostały dodatkowe informacje - nagłówek zawierający m.in. adresy odbiorcy i nadawcy. Protokoły te działają w warstwach 3 (sieciowa) i 4 (transportowa) modelu OSI, czyli pomiędzy warstwami sprzętowymi (w których funkcjonuje np. Ethernet) a warstwami aplikacji (w których działa np. HTTP, SMTP, XMPP). Właśnie utworzenie zunifikowanych zasad komunikacji w tych warstwach (zwłaszcza w warstwie sieciowej gdzie działa IP) umożliwia istnienie internetu (między sieci), czyli logicznej struktury łączącej różne sprzętowo sieci w jedną sieć logiczną, w której mogą swobodnie działać protokoły wyższej warstwy (internet w tym znaczeniu jest innym terminem niż "Internet" (pisany wielką literą), czyli globalna sieć komputerowa).
IP, ICMP, UDP, TCP
Protokół IP (Internet Protocol) odpowiedzialny jest przede wszystkim za sposób adresacji hostów oraz reguły komutacji pakietów (routing). Jest on niejako wspomagany przez kolejny protokół z tej rodziny - ICMP (Internet Control Message Protocol), którego zadaniem jest przekazywanie informacji kontrolnych np. o nieosiągalności hosta docelowego, odrzuceniu przetwarzania pakietu ze względu na zbyt dużą liczbę skoków (gdy wartość pola TTL z nagłówka IP wyniesie zero) a także pingi (zarówno żądanie jak i odpowiedź).
Niejako w oparciu o protokół IP działają protokoły warstwy transportowej takie jak UDP, TCP, czy też (mniej znane protokoły czasu rzeczywistego, transmisji strumieniowych): RTP i SCTP. Najprostszym protokołem warstwy transmisji wydaje się być UDP, protokół ten umożliwia przesłanie informacji pomiędzy dwoma hostami IP i nie kontroluje on tego czy została ona przesłana poprawnie. Z kolei TCP czuwa nad tym by przesłana informacja dotarła do adresata i była nieuszkodzona, natomiast w przypadku problemów informacja wysyłana jest ponownie. TCP w związku z tym w przeciwieństwie do UDP musi otworzyć połączenie i wykorzystywać je do kontroli poprawności przesłania informacji, wymaga zatem przesłania większej liczby pakietów (co może prowadzić do pewnych opóźnień itp.). W związku z tym TCP używany jest tam gdzie konieczna jest kontrola poprawności transmisji (oraz ponowne wysłanie zgubionego pakietu), UDP tam gdzie nie jest to potrzebne (a liczy się czas). Dodatkowo zarówno UDP jak i TCP na każdym z hostów wyróżniają numeryczny identyfikator dla aplikacji /procesu / usługi będącego odbiorcą czy też nadawcą informacji zwany numerem portu (popularne usługi typu WWW, SMTP posiadają określone domyślne porty dla swoich protokołów).
Adresacja i routing
Adresy IPv4
Adresy hostów w sieciach TCP/IP nazywane są adresami IP, w wersji 4 protokołu IP jest to 32 bitowa liczba, zapisywana najczęściej w notacji kropkowo dziesiętnej (gdzie każdy bajt (ciąg 8 bitów) zapisywany jest jako liczba dziesiętna rozdzielana kropką od pozostałych). Początkowa (określona przez maskę podsieci) liczba bitów stanowi adres sieci, reszta jest adresem hosta w danej (pod)sieci.
Wspomniana maska podsieci jest również 32 bitową liczbą, w której pierwsze N bitów ma wartość jeden a kolejne 0. W wyniku operacji binarnego AND między maską a adresem IP hosta otrzymujemy adres sieci, pozwala ona zatem na ustalenie czy dany adres IP należy do tej samej podsieci co adres IP hosta. Maskę możemy zapisywać w notacji kropkowo-dziesiętnej bądź w formie skróconej gdzie po ukośniku podajemy liczbę jedynek w masce (N).
Maska podsieci informuje także o liczbie numerów IP wchodzących w skład danej sieci (wynosi ona dla IPv6 232-N). Dwa spośród numerów IP należących do każdej podsieci mają specjalne znaczenie:
pierwszy - jest adresem sieci (identyfikuje sieć),
ostatni jest adresem rozgłoszeniowym sieci (wysłane na niego informacje trafią do wszystkich hostów w tej sieci.
Wyróżnia się także specjalne adresy (sieci) IP:
0.0.0.0/0 - cały Internet,
127.0.0.0/8 (głownie adres 127.0.0.1) - pętla zwrotna (czyli komunikacja hosta lokalnego ze sobą),
224.0.0.0/4 - multicast oraz adresy sieci prywatnych: 10.0.0.0 do 10.255.255.255,
172.16.0.0 do 172.31.255.255 i 192.168.0.0 do 192.168.255.255.
Warto wspomnieć o tym, że kiedyś stosowany był także podział na klasy sieci A, B i C odpowiadające maskom /8, /16 i /24 oraz klasy D, E i F (adresy 224.0.0.0 do 254.0.0.0).
Typy transmisji danych - unicast, broadcast i multicast
Z sieciami opartymi na komutacji pakietów (takimi jak IP) najczęściej kojarzona jest transmisja pomiędzy dokładnie dwoma hostami, gdzie każdy pakiet ma jednoznacznie określonego nadawcę, transmisję taką określa się mianem unicast. Oprócz niej możliwe są także transmisje typu broadcast (pakiet wysyłany jest na adres rozgłoszeniowy sieci - wynik operacji binarnego OR między adresem sieci i binarnie zanegowaną maską sieci) - adresatem jest wtedy każdy host w sieci lokalnej oraz transmisje multicast - transmisja do wybranej grupy hostów (tutaj wykorzystywane są adresy należące do sieci 224.0.0.0/4 i identyfikują one "kanał nadawczy" a nie unikalny host. Więcej na temat multicastu tutaj. Ponadto możliwe są transmisje anycast (jest to w zasadzie unicast z inną formą adresacji) - komunikacja w tym wypadku zachodzi pomiędzy dwoma hostami, przy czym host zdalny nie posiada unikalnego w skali globalnej adresu (adres oznacza jakąś grupę hostów lub pojedyncze oddalone hosty rozróżniane na zasadach routingu).
Routing
Internet składa się z szeregu podsieci (wyznaczanych właśnie przez maski), na granicach (w miejscach połączeń) tych sieci pracują routery (urządzenia odpowiedzialne za kierowanie pakietów do odpowiednich sieci). Router jest hostem podłączonym do kilku sieci fizycznych (będących także osobnymi sieciami IP) i skonfigurowany do przekazywania pakietów między nimi. Router na podstawie adresu odbiorcy oraz tablicy routingu (zawierających informacje o tym, jakie sieci znajdują się na jakich złączach oraz jakie są kolejne routery, do których należy przesyłać pakiet) decyduje jaką trasą ma zostać przesłany dany pakiet. W szczególności najbliższy danemu hostowi router obsługujący przesył pakietów do danej sieci nazywany jest bramką (gateway), w przypadku zwykłych hostów na ogól jest jedna bramka obsługująca siec 0.0.0.0/0 (do której kierowane są wszystkie pakiety nie adresowane do sieci lokalnej). Router wykorzystywany jest również na styku sieci korzystających z prywatnych (nie routowanych) zakresów IP i sieci publicznej, wówczas pełni on także funkcję translacji adresów IP.
Mechanizm Translacji Adresów Sieciowych (NAT) pozwala na udostępnienie jednego połączenia do sieci publicznej (współdzielenie jednego publicznego IP) przez hosty w sieci lokalnej posiadające wyłącznie IP wewnętrzne. Jest to najogólniejsza metoda modyfikacji adresów sieciowych (IP-Masquerade oraz PAT - Port Address Translation są jej szczególnymi przypadkami) pozwala ona na dynamiczne zastępowanie adresów wewnętrznych adresem publicznym, jak również mapowanie kombinacji "IP:port" publicznych na takie kombinacje w sieci wewnętrznej. Pozwala nie tylko na udostępnianie Internetu w sieciach wewnętrznych mających jedno publiczne IP, ale również na rozkładanie obciążenia (np. ruchu do serwera WWW) na kilka hostów w sieci wewnętrznej. Praktyczne realizacje NAT są również najprostszą formą zapory sieciowej zwanej od angielskiego "firewall" ścianą ogniową.
Oczywiście routing nie sprowadza się tylko do statycznie zapisanych reguł, na którym z interfejsów jest dojście do danej sieci. Powszechnie wykorzystuje się protokoły routingu dynamicznego (np. BGP). Umożliwiają one automatyczną wymianę informacji o najlepszych trasach pomiędzy routerami, równoważenie obciążenia łącz (pakiet może pójść trasą ogólniej gorszą, ale obecnie mniej zajętą), a także redundancję łącz - ta sama pula IP może być rozgłaszana przez kilku różnych dostawców łącz, co powoduje że awaria jednego z nich nie powoduje zaniku dostępności danych hostów.
Multicast w IPv4
Standardowo mamy dwa typy transmisji: unicast (pakiet zawiera unikalny adres odbiorcy i przeznaczony jest tylko dla niego) oraz broadcast (pakiet wysyłany jest na adres rozgłoszeniowy podsieci i przeznaczony jest dla wszystkich komputerów w tej sieci, pakiety te nie są routowane - nie opuszczają sieci lokalnej, zatem 255.255.255.255, który jakby mogło się wydawać powinien oznaczać każdy komputer w Internecie, oznacza tylko każdy komputer w sieci lokalnej). Jeżeli chcemy myśleć o rozsądnej transmisji klasycznej telewizji przez internet, konieczne wydaje się znalezienie metody transmisji jeden do wielu, niewymagającej powielania identycznych pakietów (różniących się tylko adresem odbiorcy). Taką metoda transmisji jest właśnie multicast.
Multicast korzysta z zarezerwowanej do tego celu klasy adresów "D" - adresy 224.0.0.0 do 239.255.255.255 (adresy 224.0.0.0 do 224.0.0.255 zarezerwowane są na wewnętrzne funkcje protokołu). Komputery nieobsługujące multicastu powinny ignorować te pakiety, natomiast routery nie multicastowe nie przekazywać ich; i zasadniczo tak się dzieje. Adresy te mają inne znaczenie niż w przypadku unicastu - nie identyfikują one żadnego konkretnego hosta, wyznaczają natomiast swego rodzaju grupę hostów a właściwie (jako że może to być grupa zmienna w czasie) swego rodzaju odpowiednik kanału telewizyjnego, na którym coś jest nadawane (i kto chce ten słucha). Również pole TTL ma tutaj swego rodzaju specjalne znaczenie (z wykorzystaniem tego pola tworzy się regiony - pewne routery brzegowe nie przekazują pakietów o zbyt niskim TTL - pomimo iż jest różny od zera, np. poza Warszawę i okolice nie powinien wyjść pakiet o TTL < 32, a poza Europę o TTL < 128).
Router obsługujący Multicast gromadzi informacje od hostów (w tym innych routerów), do których przekazuje ruch o tym, jakimi multicastowymi numerami IP są zainteresowane (informacja taka jest wysyłana na multicastowy adres rozgłoszeniowy w momencie wyrażenia chęci rozpoczęcia pobierania jakiegoś "kanału", router dokonuje też odpytywania, korzystając z tego samego multicastowego adresu rozgłoszeniowego - 224.0.0.1; za działania te odpowiedzialny jest protokół IGMP) i przekazują tylko te pakiety. Możliwe też jest rozbijanie transmisji multicast na unicastowe przez jakiś serwer w sieci lokalnej (np. dla hostów klienckich nieobsługujących multicastu, bądź w przypadku problemów z NAT). Niestety Multicast nie działa w obecnym Internecie w skali globalnej gdyż bardzo wiele routerów go nie obsługuje. Nadzieją wydaje się być IPv6 gdzie (w odrobinie odmiennej formie multicast jest od początki wpisany w standard).
Na koniec jeszcze o protokołach wyższej warstwy, podstawowym jest odpowiednik UDP (ten zresztą też umożliwia korzystanie z multicastu) - RTP (Real-time Transport Protocol), odpowiednikiem TCP (tutaj nie jest możliwy multicast) jest z kolei MTP (Multicast Transport Protocol). RTP służący do przekazywania transmisji gdzie nie jest konieczne potwierdzanie (poprawnego) odbioru - np. transmisji radiowych czy telewizyjnych), zapewnia on natomiast odpowiednia kolejność pakietów. MTP zapewnia dotarcie nienaruszonego pakietu.
IPv6 - adresy, zmiany
Główną zmianą wprowadzaną przez nową wersję protokołu IP jest wydłużenie adresów do 128 bitów. Zmianie uległ format nagłówka pakietu oraz dodano kilka innych rozszerzeń (np. kompresję i uwierzytelnianie). Tutaj również pewna pula IP została zarezerwowana dla potrzeb transmisji multicast, jednak została ona podzielona na 14 pul odpowiadających różnym zasięgom transmisji. Adresy zapisywane są zazwyczaj w notacji dwukropokowej, polegającej na zapisywaniu 16bitowych części adresu liczbami szesnastkowymi oddzielanymi dwukropkiem, dodatkowo jeden ciąg zer (o długości będącej wielokrotnością 16 bitów) może być skompresowany (pominięty), co daje w zapisie dwa dwukropki ::.
Kolejną dość istotną cechą IPv6 jest autokonfiguracja. Polega ona na tym, że dla podsieci będących LAN'em przydzielana jest pula z maską /64 co umożliwia tworzenie unikalnych numerów IP w oparciu o (niepowtarzalne) numery sprzętowe MAC; adres taki (dla adresu MAC 11:22:33:44:55:66) będzie miał postać: 64bitowy_prefiks_sieci:1322:33FF:FE44:5566 (pierwsza część adresu MAC zwiększana jest o 2, w środku wstawiane jest FFFE). 64 bitowy prefiks sieci jest informacją rozgłaszaną przy pomocy ICMPv6 przez routery (mechanizm radvd); natomiast jeżeli host nie uzyskał wspomnianego prefiksu w jego miejsce wstawiane jest fe80:: (czyli fe80:0000:0000:0000) - taki adres nazywa się "link-local" (nie jest on routowany do sieci zewnętrznych, jednak zawsze (także gdy prefiks został uzyskany) może być używany wewnątrz sieci lokalnej). Radvd rozgłasza także informacje routingowe (takie jak adres bramy - dhcpv6 tego nie potrafi), niestety nie da się rozgłaszać w ten sposób innej od standardowej dla LAN długości prefixu. Oczywiście nadal możemy korzystać z przydziału IP przez DHCP oraz ręcznego przydziału IP. Omawiając wersję 6 IP należy wspomnieć także o zmianach w samej budowie nagłówków IP - przede wszystkim budowa modularna, ale także np. zastąpienie TTL (wyrażanego mniej więcej w sekundach) przez licznik zliczający w dół przekazania pakietu przez routery.
W IPv6 na transmisje multicastowe przeznaczone zostały adresy postaci ffyx::, gdzie x odpowiada za zasięg, który obejmuje transmisja multicastowa, y koduje natomiast flagi dotyczące typu adresu (0=adres przydzielony na stałe przez IANA - dobrze znane usługi, 1=nieprzydzielone stale). Od strony użytkownika najciekawsze wydają się adresy postaci ff3x::, które budowane są w oparciu o maksymalnie 64 bitowy prefiks sieci adresów unicast - dla sieci o adresie prefix::/MM będzie to adres ff3x:00mm:prefix:gropid, gdzie mm jest zapisaną w systemie szesnastkowym wartością MM (RFC3306). W 6 wersji protokołu nie występują adresy rozgłoszeniowe - zostały one zastąpione specyficzną postacią adresów multicastowych (oznaczających wszystkie węzły - ff0x::1, wszystkie routery - ff0x::2, np. dla x=2 w zakresie Link-Local).
Każdy unicastowy adres IPv6 może pełnić funkcję adresu anycast - pakiety wysyłane na ten adres dostarczane są do najbliższego (wg konfiguracji routingu) hosta, ma to miejsce gdy adres IPv6 jest przypisany do więcej niż jednego interfejsu. W szczególności adresem anycast jest adres sieci postaci prefix::. Adresy tego typu w IPv4 służą m.in. w systemie tuneli 6to4 i jest to adres 192.88.99.1.
Głównym problemem dla końcowego użytkownika korporacyjnego, a także dla części ISP w obecnej formie wdrożenia wydaje się być niemożliwość rozgłaszania prefiksów mniejszych od /32. Sytuacja taka ma miejsce pomimo zrezygnowania z hierarchicznego routingu globalnego (RFC3587 mówi o 45 bitowym global routing prefix poprzedzonym 3 bitowym określeniem polityki adresów) i uniemożliwia multihoming oparty o BGP, a także podzielenie klasy /32 posiadanej przez ISP na dwie sieci o różnych politykach routingu (otrzymanie drugiej /32 przed zapełnieniem 80% posiadanego także jest niemożliwe). Najlepszym rozwiązaniem wydawałoby się zgoda na globalne rozgłaszanie BGP prefixów do /48 włącznie (nasuwa się też chęć rozwiązania problemu brakujących AS w następnej wersji BGP poprzez wykorzystanie prefiksu sieci - tak jak zrobiono to w RFC3306 dla multicastu).
O ile wsparcie dla IPv6 w klasycznych usługach sieciowych jest na bardzo przyzwoitym poziomie to korzystanie z IPv6 w stosunkowo nowych dziedzinach może być problemem. Problemem w wdrażaniu IPv6 są też routery wifi niedostosowane do obsługi tego protokołu.
Tunele, VPN, szyfrowanie
Sieci IP umożliwiają tworzenie tuneli, polega to na tym, że komputery będące końcami takiego tunelu przyjmują z niego dane, rozpakowują je z IP i na przykład wysyłają dalej (w innym standardzie) bądź przetwarzają w jakiś sposób oraz (analogicznie) pakują dane do przesłania w pakiety IP i wysyłają. Od zwykłego przesyłu danych przez IP odróżnia się to tym, że na ogół końce tuneli są konfigurowane dość sztywno (znaczy się jest z góry określane kto z kim) oraz że dość częstą tą drogą przesyłane są inne protokoły sieciowe (również sam IP).
Do najistotniejszych obecnie zastosowań tuneli należą: tunele IPv6 w IPv4 (umożliwiają korzystanie z IPv6, gdy provider go nie dostarcza bezpośrednio), tunele łączące sieci multicastowe oraz Virtual Private Network (VPN) czyli wirtualne sieci prywatne. VPN polega na utworzeniu między siecią lokalną (na ogół w jakiejś firmie) a odległym hostem tunelu, dzięki któremu host ten może zachowywać się tak jakby był bezpośrednio włączony do tej sieci (można by powiedzieć że jest mapowany przez serwer obsługujący VPN na host tej sieci). Oczywiście wymaga to, aby na takim hoście znajdowało się odpowiednie oprogramowanie przesyłające cały ruch sieciowy (bądź tylko odpowiednią jego część) do drugiej końcówki tunelu oraz odbierało dane stamtąd. Pewnymi problemami dla VPN mogą być NAT po stronie hosta klienckiego (aby mogło działać wywołanie z sieci lokalnej do tego hosta musi być utrzymywane połączenie - inaczej nie jest on widoczny w sieci publicznej, przez którą prowadzony jest tunel).
Kolejną kwestią jest kompresja i szyfrowanie transmisji. Jest to powszechnie stosowane przy VPN, jak również przy innych protokołach; kompresję można wykorzystywać nawet w samym HTTP, szyfrowanie wykorzystywane jest najczęściej w SSH i pochodnych, HTTPS oraz protokołach odbiorczych poczty. Najczęściej spotykane jest szyfrowanie z kluczami asymetrycznymi typu OpenPGP, często w wolnej implementacji GnuPG (GPG). Do najpopularniejszych protokołów należy wspomniany SSH (wraz z pochodnymi takimi jak SCP, SFTP) oraz (wykorzystywany po części przez SSH) działający w warstwie TCP "Secure Sockets Layer" (SSL), na którym oparty jest między innymi HTTPS, POP3S, IMAPS.