Maksymalna długość reprezentacji tekstowej adresu IPv6?

430

Chcę przechowywać dane zwrócone przez $_SERVER["REMOTE_ADDR"]PHP w polu DB, całkiem proste zadanie, naprawdę. Problem polega na tym, że nie mogę znaleźć żadnej właściwej informacji o maksymalnej długości reprezentacji tekstowej adresu IPv6, co zapewnia serwer WWW $_SERVER["REMOTE_ADDR"].

Nie jestem zainteresowany konwersją reprezentacji tekstowej na 128 bitów, w których zwykle kodowany jest adres, chcę tylko wiedzieć, ile znaków potrzeba maksymalnie do przechowywania zwróconego adresu IPv6 $_SERVER["REMOTE_ADDR"].

Gilles
źródło
6
Co z indeksem strefy?
Robert Tupelo-Schneck
5
# zdefiniować INET_ADDRSTRLEN (16) # zdefiniować INET_ADDRSTRLEN (48)
Źródło: lxr.free-electrons.com/source/include/linux/inet.h
1
Pytanie stackoverflow.com/questions/1076714/... zawiera kilka podobnych, ale przydatnych odpowiedzi.
Edward

Odpowiedzi:

615

45 znaków .

Możesz spodziewać się adresu

0000:0000:0000:0000:0000:0000:0000:0000

8 * 4 + 7 = 39

8 grup po 4 cyfry z 7 :między nimi.

Ale jeśli masz adres IPv6 odwzorowany na IPv4 , dwie ostatnie grupy można zapisać w bazie 10, oddzielając je .np. [::ffff:192.168.100.228]. Napisane w całości:

0000:0000:0000:0000:0000:ffff:192.168.100.228

(6 * 4 + 5) + 1 + (4 * 3 + 3) = 29 + 1 + 15 = 45

Zauważ, że jest to konwencja wprowadzania / wyświetlania - wciąż jest to 128-bitowy adres i do przechowywania prawdopodobnie najlepiej byłoby ustandaryzować w formacie surowego oddzielenia dwukropka, tj. [0000:0000:0000:0000:0000:ffff:c0a8:64e4]Dla powyższego adresu.

Matthew Scharley
źródło
245
Pliki nagłówkowe definiują INET6_ADDRSTRLEN na 46, co pasuje do 45 znaków i końcowego zerowego.
wisnij
6
Warto zauważyć, że adres IPv6 może również zawierać strefę zasięgu stackoverflow.com/questions/5746082/... , np. Otrzymujesz go ze RemoteEndpointMessageProperty.Address
Rory
czy adresy IPv4 nie są napisane jak :: FFFF: 127.0.0.1?
graywolf
52
@FelipeSchenone tego rodzaju myślenie jest nieprzydatne - ustal rozmiar i użyj go. Jedynym czasem, kiedy chcesz rozszerzyć bufor, jest to, czy pomaga uzupełnić tak 64 znaki, ale 45 (+1) jest optymalne.
gbjbaanb
1
czy bierze to pod uwagę procent logowania w adresie IPv6? Patrz - superuser.com/questions/99746/…
gaurav,
85

W systemie Linux spójrz na stałą INET6_ADDRSTRLEN(dołącz <arpa/inet.h>, zobacz man inet_ntop). W moim systemie (nagłówek „in.h”):

#define INET6_ADDRSTRLEN 46

Ostatni znak służy do zakończenia NULL, jak wierzę, więc maksymalna długość wynosi 45, podobnie jak inne odpowiedzi.

Yury
źródło
@eis prawdopodobnie był w 2013 roku. Prawdopodobnie zwiększono w celu dostosowania struktury.
Iiridayn
13

Odpowiedziałem na własne pytanie:

Adresy IPv6 są zwykle zapisywane jako osiem grup po cztery cyfry szesnastkowe, gdzie każda grupa jest oddzielona dwukropkiem (:).

To maksymalnie 39 znaków.

Gilles
źródło
7
Jednak najwyraźniej istnieje zastrzeżenie, patrz stackoverflow.com/a/7477384/3787376 („Maksymalna długość adresu IP klienta”) - Cytat: „W przypadku adresów IPv6 odwzorowanych na IPv4 ciąg może być dłuższy niż 39 znaków.”. Mówi, że „IPv6 odwzorowany na IPv4” ma 45 znaków i ma format „NNNN: NNNN: NNNN: NNNN: NNNN: NNNN: 192.168.158.190”. Maksymalna wartość powinna zatem wynosić 45 znaków. Odpowiedź na stackoverflow.com/a/166157/3787376 (to pytanie) również wydaje się potwierdzać ten punkt.
Edward
6

Myślę, że odpowiedź @Deepak w tym linku jest bliższa poprawnej odpowiedzi. Maksymalna długość adresu IP klienta . Tak więc prawidłowy rozmiar to 45, a nie 39. Czasami staramy się zmieniać rozmiar pól, ale wydaje się, że lepiej, jeśli przygotujemy wystarczająco dużo miejsca do przechowywania.

QMaster
źródło
4

Jak wskazano, standardowy adres ipv6 ma najwyżej 45 znaków, ale adres ipv6 może również zawierać% końcowe, po którym następuje ciąg „scope” lub „zone”, który nie ma stałej długości, ale ogólnie jest małą dodatnią liczbą całkowitą lub interfejsem sieciowym nazwa, więc w rzeczywistości może mieć więcej niż 45 znaków. Nazwy interfejsów sieciowych to zazwyczaj „eth0”, „eth1”, „wlan0”, więc wybranie 50 jako limitu jest prawdopodobnie wystarczające.

Sean F.
źródło
3
To prawda, ale są to tylko adresy lokalne z linkami i nie zobaczysz żadnego z nich, gdy witryna będzie działać w Internecie (i mam nadzieję, że nawet podczas jej tworzenia).
Michael Hampton
1

Uważaj na niektóre nagłówki, takie jak te, HTTP_X_FORWARDED_FORktóre wydają się zawierać jeden adres IP. Mogą one faktycznie zawierać wiele adresów (zakładam, że jest to łańcuch proxy).

Będą wyglądać na rozdzielone przecinkami - i mogą mieć znacznie więcej niż 45 znaków ogółem - więc sprawdź przed zapisaniem w DB.

Simon_Weaver
źródło
3
Trochę konflikt -1 (konflikt, ponieważ wpadłem już wcześniej w tę pułapkę i wydaje mi się, że ta odpowiedź zawiera informacje istotne dla niektórych osób, które pojawią się na tej stronie), ponieważ jednak nie jest to odpowiedź na zadane pytanie. Prawdopodobnie byłoby lepiej jako komentarz do pytania.
Mark Amery