Максимальная длина текстового представления адреса IPv6? - PullRequest
394 голосов
/ 03 октября 2008

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

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

Ответы [ 6 ]

559 голосов
/ 03 октября 2008

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] для указанного выше адреса.

77 голосов
/ 09 декабря 2013

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

#define INET6_ADDRSTRLEN 46

Последний символ для завершения NULL, как я полагаю, поэтому максимальная длина составляет 45, как и другие ответы.

15 голосов
/ 03 октября 2008

Ответил на мой вопрос:

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

Так что это максимум 39 символов.

6 голосов
/ 08 декабря 2013

Я думаю, что @Deepak ответ в этой ссылке более близок к правильному ответу. Максимальная длина IP-адреса клиента . Таким образом, правильный размер - 45, а не 39. Иногда мы пытаемся найти размер полей, но лучше подготовить достаточно места для хранения.

4 голосов
/ 05 марта 2017

Как указано, стандартный адрес ipv6 составляет не более 45 символов, но адрес ipv6 также может включать в себя конечный%, за которым следует строка "scope" или "zone", которая не имеет фиксированной длины, но обычно представляет собой небольшое положительное целое число или имя сетевого интерфейса, поэтому в действительности оно может превышать 45 символов. Имена сетевых интерфейсов, как правило, "eth0", "eth1", "wlan0", поэтому выбор 50 в качестве предела, вероятно, достаточно хорош.

1 голос
/ 17 февраля 2017

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

Они будут выглядеть как с разделителями-запятыми - и могут быть намного длиннее 45 символов - поэтому проверьте перед сохранением в БД.

...