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

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

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

Ответ 1

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

Ответ 2

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

#define INET6_ADDRSTRLEN 46

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

Ответ 3

Отвечал на мой собственный вопрос:

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

Таким образом, максимум 39 символов

Ответ 4

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

Ответ 5

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

Ответ 6

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

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