2. Sieci IP i Routing

2.3. Protokoły routingu - RIP, OSPF, BGP

Protokoły routingu to zestawy reguł i mechanizmów wykorzystywanych przez routery do wymiany informacji o trasach w sieciach komputerowych. Dzięki nim urządzenia są w stanie dynamicznie dostosowywać swoje tablice routingu do aktualnej topologii sieci i wybierać najlepsze dostępne ścieżki do docelowych adresów IP. W zależności od skali i charakteru sieci stosuje się różne protokoły – od prostych, takich jak RIP, po zaawansowane, jak OSPF i BGP. Każdy z nich wykorzystuje odmienne algorytmy, metryki oraz modele zarządzania trasami. W niniejszym podrozdziale przedstawione zostaną trzy najważniejsze protokoły routingu: RIP (Routing Information Protocol), OSPF (Open Shortest Path First) oraz BGP (Border Gateway Protocol), z uwzględnieniem ich działania, zalet, ograniczeń oraz zastosowań.

Protokół RIP

Routing Information Protocol (RIP) należy do najstarszych i najlepiej znanych protokołów routingu typu wektora odległości (distance-vector). Opiera się na prostym mechanizmie, w którym każdy router cyklicznie informuje swoich sąsiadów o znanych mu trasach do sieci docelowych oraz liczbie przeskoków (ang. hop count) potrzebnych do ich osiągnięcia. To właśnie liczba przeskoków stanowi metrykę stosowaną w RIP – im mniejsza liczba przeskoków, tym bardziej preferowana jest dana ścieżka. Maksymalna liczba przeskoków wynosi 15 – każda trasa oznaczona jako 16 jest uznawana za nieosiągalną. To ograniczenie znacząco wpływa na skalowalność protokołu i czyni go praktycznym jedynie w przypadku mniejszych sieci.

Protokół RIP powstał na bazie wcześniejszych rozwiązań rozwijanych od lat 70., takich jak GWINFO w systemie Xerox Network Systems. Wersja RIP dla protokołu IP została zaimplementowana w demonie routed w systemie 4.2BSD i szybko zyskała popularność w systemach UNIX. Wersja pierwsza protokołu RIP – RIPv1 – została sformalizowana w 1988 roku.

RIPv1

Pierwotna specyfikacja protokołu RIP w wersji pierwszej (RIPv1) została opublikowana w 1988 roku. Po uruchomieniu routera obsługującego RIPv1, a następnie co 30 sekund, router ten rozsyła wiadomość żądania (request) do adresu rozgłoszeniowego 255.255.255.255 przez wszystkie interfejsy, na których aktywowano RIPv1. Routery sąsiednie, które odbiorą to żądanie, odpowiadają komunikatem zawierającym własną tablicę routingu. Router, który wysłał żądanie, aktualizuje na tej podstawie swoją tablicę, zapisując w niej osiągalne adresy sieci IP, liczbę przeskoków oraz adres następnego przeskoku, czyli adres interfejsu routera, od którego pochodziła odpowiedź.

W miarę odbierania aktualizacji od różnych sąsiadów, router uzupełnia swoją tablicę tras tylko wtedy, gdy otrzyma informację o sieci, której wcześniej nie znał, lub jeśli nowa trasa do znanej już sieci ma mniejszą liczbę przeskoków. Z tego powodu w typowych przypadkach router RIPv1 będzie miał w tablicy tylko jeden wpis dla danej sieci – ten, który wskazuje trasę o najmniejszej liczbie przeskoków. Jeżeli jednak otrzyma informacje o tej samej sieci od dwóch różnych sąsiadów i liczba przeskoków w obu przypadkach będzie taka sama, router może umieścić dwa wpisy do tej sieci, każdy wskazujący innego sąsiada jako następny przeskok. W takiej sytuacji router zastosuje mechanizm równoważenia obciążenia przy trasach o równym koszcie (equal-cost load balancing), dzieląc ruch IP pomiędzy dostępne trasy.

Routery korzystające z RIPv1 nie tylko co 30 sekund żądają informacji routingu od sąsiadów, ale również nasłuchują przychodzących żądań i w odpowiedzi same przesyłają swoją tablicę tras. W rezultacie tablice RIPv1 są aktualizowane średnio co 25–35 sekund. Aby uniknąć sytuacji, w której wiele routerów w tej samej sieci LAN aktualizuje swoje trasy jednocześnie, protokół wprowadza niewielką losowość do interwałów czasowych. Zakładano, że dzięki temu aktualizacje będą rozproszone w czasie, lecz badania Sally Floyd i Van Jacobsona z 1994 roku wykazały, że bez dodatkowej losowej zmienności timery i tak synchronizują się w czasie, prowadząc do zbieżnych zachowań routerów.

Protokół RIPv1 można skonfigurować w trybie „milczącym” (silent mode), w którym router nasłuchuje i przetwarza aktualizacje od sąsiadów, samodzielnie uaktualniając swoją tablicę tras, lecz nie rozsyła swojej tablicy w sieci. Tryb ten stosuje się zazwyczaj na urządzeniach końcowych (hostach), które nie pełnią funkcji trasujących.

RIPv1 wykorzystuje klasyczny, tzw. klasowy mechanizm routingu. Oznacza to, że aktualizacje tras nie zawierają informacji o maskach podsieci, co uniemożliwia stosowanie masek o zmiennej długości (VLSM). W praktyce wszystkie podsieci w obrębie jednej klasy adresowej muszą mieć identyczny rozmiar. Brakuje również wsparcia dla uwierzytelniania routerów, co czyni protokół podatnym na różne ataki i manipulacje. Te istotne ograniczenia zostały rozwiązane dopiero w późniejszej wersji protokołu – RIPv2.

Rysunek: Nagłówek protokołu RIPv1

Polecenie To pole wskazuje, czy wiadomość RIP jest zapytaniem o aktualne trasy, czy odpowiedzią zawierającą tablicę routingu.

Numer wersji Określa, której wersji protokołu RIP dotyczy komunikat – możliwe wartości to 1 (RIPv1) lub 2 (RIPv2).

Pole zerowe (1) W wersji RIPv1 pole to musi być ustawione na wartość zero. W przypadku RIPv2 wykorzystywane jest do określenia numeru domeny routingu.

Identyfikator rodziny adresów To pole identyfikuje typ adresów używanych w polu adresu sieciowego. Dla adresów IP wartość kodowa (AFI) wynosi 2.

Pole zerowe (2) W RIPv1 pole to powinno być wyzerowane. W RIPv2 służy jako znacznik trasy (route tag), wykorzystywany do odróżniania źródeł poszczególnych wpisów w tablicy tras.

Adres sieciowy Pole to zawiera adres IP sieci. Jeżeli pakiet jest zapytaniem, wpis zawiera adres źródłowy, natomiast w odpowiedzi – adres sieci, której dotyczy wpis w tablicy tras.

Pole zerowe (3) W wersji pierwszej protokołu RIP musi być ustawione na zero. W wersji drugiej zawiera maskę podsieci odpowiadającą adresowi sieciowemu z wcześniejszego pola.

Pole zerowe (4) W RIPv1 nie jest używane i musi być puste. W RIPv2 to pole zawiera adres IP następnego routera, przez którego powinna zostać przesłana informacja – dotyczy to tylko wiadomości typu odpowiedź.

Metryka Pole to określa koszt danej trasy – logiczną odległość do sieci docelowej. Najczęściej metryką jest liczba przeskoków, czyli liczba routerów pośredniczących między źródłem a celem; każdy przeskok ma zazwyczaj wartość równą 1.

RIPv2

Z powodu licznych ograniczeń pierwotnej specyfikacji protokołu RIP, w 1993 roku opracowano jego udoskonaloną wersję – RIP w wersji 2 (RIPv2), która została oficjalnie opublikowana w 1994 roku, a w 1998 roku uzyskała status standardu internetowego numer 56. RIPv2 wprowadził możliwość przesyłania informacji o maskach podsieci, dzięki czemu zaczął wspierać tzw. routowanie bezklasowe (CIDR – Classless Inter-Domain Routing), umożliwiające tworzenie podsieci o różnej długości.

Dla zapewnienia zgodności wstecznej z wersją pierwszą, w RIPv2 utrzymano limit 15 przeskoków jako maksymalną wartość metryki – powyżej tej wartości sieć uznawana jest za nieosiągalną. RIPv2 może współpracować z routerami korzystającymi z RIPv1, o ile w komunikatach RIPv1 poprawnie ustawione są wszystkie pola protokołu, które muszą być wyzerowane. Dodatkowo, protokół wyposażono w tzw. przełącznik zgodności (compatibility switch), który umożliwia precyzyjne dostosowanie sposobu współdziałania z różnymi wersjami.

Aby ograniczyć niepotrzebne obciążenie urządzeń końcowych, które nie biorą udziału w routingu, RIPv2 nie używa rozgłoszeń (broadcast) do wysyłania swojej tablicy tras, jak miało to miejsce w RIPv1. Zamiast tego wykorzystuje adres multicast 224.0.0.9, dzięki czemu tylko sąsiednie routery zainteresowane odbiorem informacji o trasach przetwarzają te komunikaty. Wciąż jednak możliwe jest stosowanie adresowania unicast dla specyficznych zastosowań.

W roku 1997 do protokołu RIP wprowadzono mechanizmy uwierzytelniania, w tym uwierzytelnianie z wykorzystaniem algorytmu MD5, co znacząco zwiększyło bezpieczeństwo wymiany informacji między routerami.

RIPv2 wprowadził również tzw. znaczniki trasy (route tags), które pozwalają na rozróżnienie tras uczonych za pośrednictwem protokołu RIP od tych, które pochodzą z innych źródeł (np. z zewnętrznych protokołów routingu), co umożliwia lepsze zarządzanie polityką routingu w bardziej złożonych środowiskach sieciowych.

RIPng

RIPng (ang. RIP next generation) to rozszerzenie protokołu RIPv2, opracowane z myślą o obsłudze sieci opartych na protokole IPv6 – nowej generacji protokołu internetowego. RIPng został zaprojektowany tak, aby dostosować funkcjonalność klasycznego RIP do specyfiki adresacji i architektury IPv6.

Najważniejszą różnicą w stosunku do RIPv2 jest pełna zgodność z IPv6. W odróżnieniu od RIPv2, który obsługuje uwierzytelnianie aktualizacji tras (np. poprzez MD5), RIPng nie oferuje natywnego mechanizmu uwierzytelniania. W czasie jego projektowania założono bowiem, że bezpieczeństwo i uwierzytelnianie w sieciach IPv6 będą realizowane przy użyciu IPsec.

W zakresie struktury komunikatów istnieje istotna różnica: w RIPv2 adres następnego przeskoku (next-hop) może być zawarty w każdym wpisie tablicy routingu, natomiast w RIPng adres następnego przeskoku kodowany jest oddzielnie i dotyczy całej grupy wpisów, a nie pojedynczych tras.

Aktualizacje w RIPng przesyłane są za pomocą protokołu UDP na porcie 521, przy użyciu specjalnej grupy multicast przypisanej dla IPv6 – ff02::9 – co pozwala na efektywne rozsyłanie informacji tylko do zainteresowanych routerów w lokalnym segmencie sieci.