W adresacji IPv6 zastosowanie podwójnego dwukropka jest wykorzystywane do
A. jednorazowego zastąpienia jednego lub kolejno ułożonych po sobie bloków złożonych wyłącznie z zer.
B. wielokrotnego zastąpienia dowolnych bloków jedynek.
C. wielokrotnego zastąpienia dowolnych bloków zer odseparowanych blokiem jedynek.
D. jednorazowego zastąpienia jednego bloku jedynek.
Pytanie z egzaminu CKE, styczeń 2021 (arkusz EE.08-SG-21.01).
W IPv6 zapis :: służy do jednorazowego skrócenia jednego bloku 0000 albo kilku kolejnych bloków 0000 występujących obok siebie. Mówimy tu o blokach 16-bitowych, zapisywanych szesnastkowo, czyli np. pełny adres 2001:0db8:0000:0000:0000:ff00:0042:8329 można zapisać krócej jako 2001:db8::ff00:42:8329. To jest zgodne z zasadami zapisu adresów IPv6 opisanymi m.in. w RFC 4291, a dobre praktyki kanonicznego zapisu doprecyzowuje RFC 5952. Ważna rzecz: :: można użyć tylko raz w jednym adresie, bo inaczej komputer nie wiedziałby, ile zer należy wstawić w każde miejsce. Moim zdaniem to jedna z tych zasad, które warto po prostu przećwiczyć na przykładach, bo w konfiguracji routera, firewalla albo interfejsu sieciowego literówka w IPv6 potrafi długo męczyć. Osobno można usuwać zera wiodące w pojedynczych blokach, np. 0042 zapisujemy jako 42, ale to nie jest to samo co użycie podwójnego dwukropka. Praktyczne przykłady to ::1 jako adres pętli zwrotnej localhost oraz :: jako adres nieokreślony, używany np. zanim host otrzyma właściwy adres.
W tym pytaniu łatwo pomylić skracanie adresu IPv6 z ogólnym zastępowaniem dowolnych fragmentów adresu, ale zasada jest bardziej konkretna. Podwójny dwukropek nie zastępuje bloków jedynek. IPv6 zapisuje się w ośmiu blokach szesnastkowych, a mechanizm :: dotyczy wyłącznie bloków złożonych z samych zer, czyli 0000. Jeśli w adresie pojawiają się wartości typu ffff, 1111 albo inne niezerowe hextety, nie można ich schować za pomocą ::. To częsty błąd, bo ktoś słyszy o kompresji adresu i zakłada, że kompresować można dowolny powtarzający się fragment. No niestety, standard tak nie działa. Niepoprawne jest też myślenie, że :: można stosować wiele razy w jednym adresie. Gdyby zapis wyglądał na przykład 2001::abcd::1, nie byłoby jednoznaczne, ile bloków 0000 trzeba odtworzyć w pierwszym, a ile w drugim miejscu. Adres IPv6 musi dać się rozszerzyć z powrotem do dokładnie ośmiu bloków 16-bitowych, bez zgadywania. Z tego powodu zasada branżowa jest prosta: podwójny dwukropek stosujemy maksymalnie raz. Nie można nim także zastępować kilku grup zer rozdzielonych jakimś blokiem jedynek lub inną wartością niezerową, bo :: skraca tylko ciągły, kolejno ułożony fragment zer. Jeśli zera są w dwóch oddzielnych miejscach adresu, wybiera się zwykle najdłuższy ciąg zer, zgodnie z dobrymi praktykami z RFC 5952. Z mojego doświadczenia najwięcej pomyłek bierze się z mieszania dwóch reguł: usuwania zer wiodących w pojedynczym bloku oraz kompresji całych zerowych bloków przez ::. To podobne wizualnie, ale technicznie są to dwie różne operacje.