Napisałem to w zeszłym roku jako wewnętrzny dokument referencyjny, gdy niektórzy z naszych inżynierów się zdezorientowali, gdy poprosili o podanie adresów IPv6 w DNS. Nie zwracałem się konkretnie do DNS, ale większość obaw dotyczyła formatu adresów, a nie „rozumienia” ich działania. Może przyda się także innym:
Pierwszą rzeczą do potwierdzenia jest to, że osoby dodające IPv6 wyglądają brzydko. Oni robią.
Ale myślę, że dzieje się tak tylko dlatego, że nie jesteśmy przyzwyczajeni do radzenia sobie z nimi i nie rozumiemy, co one oznaczają na bardzo niskim poziomie, jak w przypadku adresów IPv4. Myślę, że zajmie to trochę czasu, aby się z nimi pogodzić, ale musimy gdzieś zacząć.
Inną ważną rzeczą do zapamiętania jest to, że adresy IPv4 to liczby 32-bitowe, a adresy IPv6 to liczby 128-bitowe. Gdy router trasuje lub filtruje zaporę ogniową, robi to na podstawie tego numeru. To, jak człowiek decyduje się na wyświetlenie tej liczby, jest całkowicie arbitralne i jest w większości tylko tradycją. Cały ten e-mail wyjaśnia, w jaki sposób ludzie wybierają te liczby - maszyny to nie obchodzi, to wszystko dla nich.
Adres IPv4 ma 32 bity lub cztery bajty. To, co uważamy za „rzeczywisty” adres IP, to po prostu metoda, która stała się standardem do reprezentowania tego ciągu bitów, rozdzielania bitów na 4 8-bitowe grupy, reprezentowania każdego 8 bitów jako liczby dziesiętnej i rozdzielania tych liczb dziesiętnych na okres. Weźmy losowy adres IP 172.30.154.249. Gdy router „myśli” o tym adresie IP, naprawdę myśli o tym w ten sposób:
10101100000111101001101011111001
Które możemy przetłumaczyć na naszą własną formę:
10101100 = 172
00011110 = 30
10011010 = 154
11111001 = 249
Czasami możesz też zobaczyć te zapisane jako liczby dziesiętne:
10101100000111101001101011111001 = 2,887,686,905
Mało kto celowo używa tego formularza (*), ale jest to historycznie poprawny sposób na pisanie adresu IPv4. W rzeczywistości ten formularz jest używany w RFC821, który zdefiniował SMTP w 1982 roku. Jeśli chcesz ręcznie kierować pocztę na określoną maszynę zamiast DNS, możesz użyć dwóch różnych rodzajów literałów. Pierwszą była znana forma „quad kropkowany” w nawiasach kwadratowych („użytkownik @ [172.30.154.249]”). Drugi używał postaci dziesiętnej adresu IP poprzedzonego znakiem funta („użytkownik @ # 2887686905”).
Wszystko to miało na celu zapewnienie podstaw do tłumaczenia twojej wiedzy o działaniu adresów IPv4 na adresy IPv6. Podobnie jak IPv4 jest liczbą 32-bitową, adresy IPv6 są liczbami 128-bitowymi. ARIN przypisał MOJEJ NIESAMOWITEJ FIRMIE (**) zakres IP 2311: FD67 / 32. Aby mieć przykład do pracy, zamierzam użyć adresu IP 2311: FD67 :: AC1E: 9AF9.
Oto ciąg bitów reprezentujący ten ip6:
00100011000100011111110101100111000000000000000000000000000000000000000000000000000000000000000010101100000111101001101011111001
Gdybyśmy reprezentowali te ciągi bitowe w sposób, w jaki robimy ciągi bitów IPv4 (konwertuj każdy 1-bajtowy fragment na dziesiętny, oddzielaj każdy kropką), otrzymalibyśmy:
35.17.253.103.0.0.0.0.0.0.0.0.172.30.154.249
To ma kilka problemów. Po pierwsze, wygląda to na funky numer IPv4, co nie jest dobre, chcesz solidnego sposobu na ich rozróżnienie. Po drugie, jest to dużo informacji, dużo liczb i dużo pustej przestrzeni. Tak więc oba problemy są rozwiązywane przez użycie innego separatora (dwukropek (:) zamiast kropki (.)) I przez powtarzanie bajtów w systemie szesnastkowym zamiast dziesiętnym. Tam, gdzie IPv4 dzieli 8-bitowe fragmenty, przedstawione w postaci dziesiętnej, kropkami, IPv6 dzieli 16-bitowe fragmenty, oddzielone dwukropkami. Oto rozkład naszego przykładowego adresu IP IPv6:
0010001100010001 = 2311
1111110101100111 = FD67
0000000000000000 = 0
0000000000000000 = 0
0000000000000000 = 0
0000000000000000 = 0
1010110000011110 = AC1E
1001101011111001 = 9AF9
2311:FD67:0:0:0:0:AC1E:9AF9
Wciąż jest w nim dużo białej przestrzeni, więc dopuszcza się, że największy ciąg zer można pominąć i przedstawić podwójnym dwukropkiem. Powyższy adres IP można zapisać:
2311:FD67::AC1E:9AF9
Nie widziałem tego zbyt często, ale rozumiem, że istnieje również zgrabna konwencja, która pozwala zapisywać ostatnie 32-bity jako prefiks-kropki, umożliwiając łatwe rozpoznawanie starszych adresów podczas migracji z IPv4 na IPv6 . Tak więc, jak zapewne zauważyłeś, mój przykładowy adres IPv6 kończy się tymi samymi 32 bitami, które w całości obejmują mój przykład IPv4. Jest to szczególnie przydatne, gdy piszesz w tym stylu. W takim przypadku mój adres IPv6 wyglądałby następująco:
2311:FD67::172.30.145.249
Aby powrócić do miejsca, w którym zacząłem od IPv6, wspomniałem, że przydzielono nam 2311: FD67 / 32. / 32 jest maską bitową, podobnie jak w adresach IPv4. W gruncie rzeczy oznacza to, że przydzielono nam statycznie pierwsze 32 z 128 bitów w adresie IPv4, który mogliśmy stworzyć. Ponieważ 2311: FD67 ma 32 bity, oznacza to, że każdy adres IP utworzony z tego zakresu zacznie się od tego.
Innymi słowy, tak jak 172.17 / 16 można traktować jako „każdy adres IP między 172.17.0.0 a 172.17.255.255”, 2311: FD67 / 32 można traktować jako „każdy adres IP między 2311: FD67: 0: 0: 0: 0: 0: 0 i 2311: FD67: FFFF: FFFF: FFFF: FFFF: FFFF: FFFF ".
Myślę, że minie dużo czasu, zanim zaczniemy migrację do IPv6, ale mam nadzieję, że to wyjaśnienie pomoże ci czuć się bardziej komfortowo, korzystając z nich i odnosząc się do nich.
Ponownie, naprawdę ważne jest, aby zrozumieć, jedyne, o czym tutaj mówię, to dosłownie, jak zapisać adres IPv6. Wydaje się, że w schemacie numerowania routingu jest wiele inteligencji, których tak naprawdę nie mam jeszcze pojęcia, więc mogę teraz zająć się tym, jak to wygląda =).
(*) Widziałem już dziesiętną reprezentację IPv4 w debugowaniu oprogramowania, ale jestem prawie pewien, że to pomyłka lub lenistwo, myślę, że znacznie lepiej było w kodzie C wydrukować 32-bitową liczbę całkowitą szybciej niż było sformatuj kropkowany quad do drukowania.
(**) Zmieniłem nazwę mojej firmy i prefiks