Максимальна довжина текстуального подання адреси IPv6?


430

Я хочу зберігати дані, повернені $_SERVER["REMOTE_ADDR"]в PHP, у поле БД, дуже проста задача, насправді. Проблема полягає в тому, що я не можу знайти належну інформацію про максимальну довжину текстуального подання адреси IPv6, через що надає веб-сервер $_SERVER["REMOTE_ADDR"].

Мені не цікаво перетворювати текстове представлення у 128 біт, за кодом зазвичай кодується адреса, я просто хочу знати, скільки символів максимум потрібно для зберігання будь-якої IPv6 адреси, яку повернув $_SERVER["REMOTE_ADDR"].


6
Що з індексом зони?
Роберт Тупело-Шнек

5
#define INET_ADDRSTRLEN (16) #define INET6_ADDRSTRLEN (48)

Джерело: lxr.free-electrons.com/source/include/linux/inet.h

1
Питання stackoverflow.com/questions/1076714/… має кілька подібних, але корисних відповідей.
Едвард

Відповіді:


615

45 символів .

Ви можете розраховувати на адресу

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

8 * 4 + 7 = 39

8 груп із 4 цифр із 7 :між ними.

Але якщо у вас IPv4-відображена IPv6-адреса , дві останні групи можуть бути записані в базі 10, розділеними ., наприклад. [::ffff:192.168.100.228]. Виписано повністю:

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

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

Зауважте, це умова введення / відображення - це все-таки 128-бітова адреса, і для зберігання її, мабуть, найкраще б стандартизувати на сировинний розділений формат, тобто [0000:0000:0000:0000:0000:ffff:c0a8:64e4]за адресою вище.


245
Файли заголовків визначають, що INET6_ADDRSTRLEN дорівнює 46, що відповідає 45 знакам плюс кінцевий нуль.
wisnij

6
Варто зазначити, що IPv6-адреса також може містити зону діапазону stackoverflow.com/questions/5746082/… , наприклад, ви отримуєте це з RemoteEndpointMessageProperty.Address
Rory

чи не написано адреси ipv4 як: ffff: 127.0.0.1?
сірий вовк

52
@FelipeSchenone це такий тип мислення, який не корисний - з’ясуйте розмір і використовуйте його. Єдиний раз, коли ви хочете розширити буфер, це якщо він допомагає з прокладкою так 64 символів, але 45 (+1) є оптимальним.
gbjbaanb

1
це враховує відсотковий вхід в ipv6-адресу?
Довідка

85

У Linux дивіться константу INET6_ADDRSTRLEN(включайте <arpa/inet.h>, див. man inet_ntop). У моїй системі (заголовок "in.h"):

#define INET6_ADDRSTRLEN 46

Останній символ призначений для припинення NULL, як я вірю, тому максимальна довжина становить 45, як і інші відповіді.


2
Отже, що це за 48 я бачу? github.com/torvalds/linux/blob/master/include/linux/inet.h#L50
EIS

@eis, ймовірно, був у 2013 році. Можливо, збільшено для вирівнювання структури.
Ірідайн

13

Відповів на власне запитання:

Адреси IPv6 зазвичай записуються у вигляді восьми груп із чотирьох шістнадцяткових цифр, де кожна група розділена двокрапкою (:).

Так що це максимум 39 символів


7
Однак, мабуть, є застереження, див. Stackoverflow.com/a/7477384/3787376 ("Максимальна довжина для ip-адреси клієнта") - Цитата: "Для IPv4, відображених IPv6 адреси, рядок може бути довше 39 символів." У ньому йдеться про те, що "IPv4-відображений IPv6" має 45 символів і знаходиться у форматі "NNNN: NNNN: NNNN: NNNN: NNNN: NNNN: 192.168.158.190". Тому максимум має бути 45 символів. Відповідь на stackoverflow.com/a/166157/3787376 (це запитання) також, здається, демонструє цей момент.
Едвард

6

Я думаю, що відповідь @Deepak у цьому посиланні ближче до правильної відповіді. Максимальна довжина ip-адреси клієнта . Тож правильний розмір становить 45, а не 39. Іноді ми намагаємося прокручувати розміри полів, але здається, що краще, якщо ми підготуємо достатній обсяг пам’яті.


4

Як зазначено, стандартна адреса ipv6 становить щонайбільше 45 символів, але адреса ipv6 також може містити закінчувальний% з наступним рядком "область" або "зона", яка не має фіксованої довжини, але, як правило, невелике додатне ціле число або мережевий інтерфейс ім'я, тому насправді воно може бути більше 45 символів. Імена мережевого інтерфейсу, як правило, "eth0", "eth1", "wlan0", тому вибір 50 як граничного шару, ймовірно, досить хороший.


3
Щоправда, але це лише локальні адреси, і ви не збираєтеся бачити жодну з тих, коли ваш веб-сайт працює в Інтернеті (і, сподіваємось, навіть не розробляючи його).
Майкл Хемптон

1

Слідкуйте за певними заголовками, такими як HTTP_X_FORWARDED_FOR, начебто, є одна IP-адреса. Насправді вони можуть містити декілька адрес (я вважаю, ланцюжок проксі).

Вони будуть видані комами - і можуть бути набагато довшими, ніж 45 символів - тому перевірте, перш ніж зберігати їх у БД.


3
Трохи суперечливий -1 (суперечить тому, що я раніше потрапляв у цю пастку, і, мабуть, ця відповідь містить інформацію, яка стосується деяких людей, які будуть надходити на цю сторінку), оскільки, очевидно, це не є відповіддю на поставлене запитання. Можливо, це було б краще, як коментар до питання.
Марк Амері
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.