wtorek, 10 grudnia 2013

"Niewyobrażalność" adresacji IPv6

Kiedy pisze się o IPv6 oraz porównuje się zakres dostępnych adresów do IPv4, wygląda to bardzo obiecująco.
Teoretycznie, w IPv4 można zaadresować 2^32 węzłów czyli 4'294'967'296.
W IPv6 przestrzeń adresowa wynosi już 2^128 czyli w przybliżeniu 3,4 * 10^38.

Prawda, że imponujące?
A jak dobrze wygląda w artykułach prasowych, w których to redaktorzy adresują często w IPv6 wręcz kawałek wszechświata.

Wiele osób jednak zapomina, a pozostała większość nie jest tego wcale świadoma, że ani jedna, ani druga liczba nie jest, w zasadzie, do końca prawdziwa.
Oczywiście matematyka nie kłamie i istnieje możliwość zaadresowania takiej liczby węzłów tyle... że nie przy pomocy protokołu IP przy którego powstawaniu nakładano szereg założeń limitujących tą "maksymalną" liczbę.



Założenia, założenia...


Aby się fajnie liczyło, niniejszym i ja uczynię kilka założeń.
1) zapominamy o tym, że adresacja podzielona jest hierarchicznie. Nie ma to dla tych rozważań większego znaczenia.

2) adresujemy tylko węzły publiczne, które zgodnie z założeniami protokołu IP mogą być zaadresowane i są osiągalne z dowolnego miejsca.

3) podchodzimy do sprawy bardziej praktycznie, niż stricte teoretycznie - bo interesuje nas rzeczywistość.
Tu jest mały haczyk - i jednocześnie jedna z głównych różnic pomiędzy IPv4 i IPv6, którą potem wyjaśnię.



IPv4


kiedy popatrzy się na tabelkę pod adresem
http://www.iana.org/assignments/ipv4-address-space/ipv4-address-space.xml
wprawne w tym zapisie oko zauważy, że istnieje 220 klas /8, które mogą być wykorzystane na unicastowe adresy publiczne.

Oczywiście część z tych klas jest niekoniecznie optymalnie wykorzystana jako, że zostały przydzielone na samym początku, kiedy nikt nie przewidywał, że pula IPv4 się wyczerpie i nadal niewykorzystane w nich adresy nigdy nie zostały zwrócone.
Na 24 bitach każdej klasy można zaadresować 16'777'216 węzłow, co razem daje 3'690'987'520.
W sumie, praktycznie można zaadresować ~86% całej, teoretycznie dostępnej puli IPv4.

Okazało się jednak, że liczba urządzeń, które mają mieć dostęp do Internetu przekroczyła możliwości adresacji IPv4. 
W związku z tym pojawiły się rozwiązania typu translacja adresów (NAT/PAT), co pozwoliło za jednym publicznym węzłem ukryć dużo więcej urządzeń - ale za cenę tego, że nie są one osiągalne z Internetu.
Oczywiście istnieją dodatkowe sposoby, np. przekierowanie portów i - w bardzo ograniczonej skali - da się coś takiego wykonać, nie mniej nie jest to rozwiązanie ani eleganckie, ani tym bardziej dobrze się skalujące.

Dla szarego użytkownika domowego najczęściej prawdziwa jest zależność:
jeden adres publiczny == jedno gospodarstwo domowe.



IPv6


w przypadku tego protokołu, sprawa jest nieco bardziej skomplikowana, bo i protokół ten powstał również na bazie doświadczeń wyniesionych z IPv4, a dzięki temu jest też niejako bardziej skomplikowany.

Posługując się RFC4291 można się zorientować, że zakres Global Unicast to:
cały możliwy zakres adresacji (pełne 128 bitów)
minus: Unspecified i Loopback (2 adresy)
minus: Multicast (120 bitów = 1,3 * 10^36)
minus: Link-Local Unicast (118 bitów = 3,3 * 10^35)

Po odjęciu zostaje ~3,39 * 10^38 - co stanowi ~99,7% całej dostępnej adresacji IPv6. Cały czas jest to wartość "niewyobrażalna", a stosunek adresacji "użytecznej" do całkowitej jest dużo lepszy, niż w przypadku IPv4.

Ale sprawa komplikuje się, gdy przypomnimy sobie o wcześniej wspomnianym haczyku, czyli o konstrukcji adresu IPv6.
Otóż, adres IPv6 składa się z pierwszych 64 bitów stanowiących prefix podsieci oraz z ostatnich 64 bitów stanowiących identyfikator interfejsu w danej sieci.
Wynika z tego, że może być co najwyżej 2^64 sieci (to już się daje zapisać bez stosowania wykładnika: 18'446'744'073'709'551'616) oraz tyle samo interfejsów w każdej z nich.
Co to oznacza dla zwykłych użytkowników?

Oznacza to tyle, że w pojedynczej sieci lokalnej (takiej, w jakiej używa się najczęściej obecnie - wg RFC1918 - adresów "prywatnych" czyli 10/8, 172.16/12 i 192.168/16) można mieć 2^64 różnych interfejsów sieciowych (każde gniazdko elektryczne, lodówka, ładowarka czy zegarek ścienny oraz setki innych urządzeń, może mieć swój adres IPv6) i w dodatku każdy z nich będzie mógł być dostępny z dowolnego miejsca na świecie.
Prawda, że fajnie? ;-)

Tyle, że dzięki temu liczba teoretycznie mogących zostać zaadresowanych podsieci spadła do 2^64. Za to każde urządzenia w takiej podsieci może być dostępne z Internetu pod własnym, unikalnym adresem - co stanowi istotną różnicę w porównaniu z IPv4.

Licząc podsieci mamy więc:
Global Unicast (2^64)
minus: Unspecified (1 adres)
minus: Multicast (56 bitów = 72'057'594'037'927'936)
minus: Link-Local Unicast (54 bity = 18'014'398'509'481'984)

Zostaje 18,357 * 10^18 adresów, co stanowi ~99,5% adresacji (dla podsieci 64-bitowych). 

W porównaniu z IPv4 jest to ~4'973'376'903 razy więcej podsieci, a w dodatku do każdego urządzenia w podsieci jest cały czas elegancki dostęp z zewnątrz.

Istotna różnica, ale już wyobrażalna, a nie wyrażona matematycznie w postaci wykładnika potęgi ;-)

No i należy się zastanowić, ile takich urządzeń w pojedynczej podsieci (dom, biuro...) będzie, bo przecież nie 2^64 :-)
W dodatku, jeśli ktoś chce adresować gwiazdy we wszechświecie, to niekoniecznie będzie chciał trzymać wiele z nich w jednej podsieci :-P

Ale też, licząc pojemność adresacji w procentach, podsieci 64-bitowych (które powyżej uznaliśmy poniekąd za trywialny równoważnik publicznego adresu IPv4) jest już tylko ~5,399 * 10^-18 procent (czyli ~0,000000000000000005399%) ogólnej teoretycznej pojemności IPv6 (czyli 2^128), oczywiście plus teoretycznie 2^64 adresów w każdej podsieci.



No i dodatkowe Ale...


Skutkiem założonej konstrukcji adresu IPv6 jest też fakt, że o ile w IPv4 - gdy była potrzeba wydzielenia podsieci - cięło się adres sieci na kawałki o dłuższych maskach, to w IPv6 nie za bardzo daje się to zrobić i najczęściej - jeśli klient ma lub będzie mieć potrzebę posiadania kilku podsieci - będzie się mu przydzielać nie jedną podsieć /64, ale kilka (2, 4, 8, 16...) takich podsieci przesuwając maskę (odpowiednio /63, /62, /61, /60...).

Tu objawia się następny problem. Przy zapisie szesnastkowym ciężko będzie nad tym panować.
RFC6177 zaleca, aby przy planowaniu adresacji sieci brać pod uwagę możliwość przydzielania domyślnie podsieci np. /56 (co daje 256 podsieci /64) zaś unikać jak ognia możliwości późniejszego stosowania translacji IPv6 do IPv6 (czyli planować adresację tak, aby nie zabrakło adresów). 

Dodatkowo, przy adresacji szesnastkowej, często najmniejszym praktycznie stosowanym dziś krokiem podziału na mniejsze podsieci, jest krok 4-bitowy, czyli "jedna literka" (szesnastkowy rząd wielkości). Nie wynika to bynajmniej z technicznych ograniczeń. Tak jest po prostu wygodniej.

Duzi operatorzy, oferujący usługi dla różnych grup użytkowników (od pojedynczego mieszkania do dużych organizacji) muszą brać też pod uwagę, że zarządzanie wieloma różnymi wielkościami podsieci (np. /56 dla dużych i /64 dla najmniejszych klientów) jest problematyczne. Z tego powodu często wybierane jest podejście, że niezależnie od zapotrzebowania na adresację sieci klienckiej, przydziela mu się zawsze taką samą podsieć (np. /56).
Znakomicie upraszcza to zarządzanie, ale powoduje nadmierną i niepotrzebną alokację adresów.

Powyżej wymienione "utrudnienia" dalej zmniejszają naszą teoretyczną pojemność adresacji IPv6. Na szczęście, w dającej się przewidzieć przyszłości, nadal nie grozi nam wyczerpanie puli adresacji.

Ale zaraz... przy IPv4 też tak na początku myślano ;-)

1 komentarz:

  1. Świetny wpis (i blog). Przeczytałem tak z połowę wpisów - tj. te, które mnie interesowały. :-)

    OdpowiedzUsuń