2008-10-03 6 views
361

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

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

+6

Как насчет индекса зоны? – 2012-10-25 18:02:56

+2

#define INET_ADDRSTRLEN (16) #define INET6_ADDRSTRLEN (48) – xxwatcherxx 2015-06-08 18:32:16

+0

Источник: lxr.free-electrons.com/source/include/linux/inet.h – xxwatcherxx 2015-06-08 18:34:07

ответ

504

Немного неправильно, наивный вариант был бы:

8 * 4 + 7 = 39

8 групп по 4 цифры с 7 ':' между ними.

Но следует учитывать функцию IPv6-адресованных IPv6-адресов, например. [::ffff:192.168.0.1], выписали полностью:

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

Заметим, что это вход/соглашение с дисплеем - объем данных одинаковый, и для хранения, вероятно, лучше всего стандартизировать формат raw, разделенный двоеточиями, т. е. [0000:0000:0000:0000:ffff:7fa8:0001] по указанному выше адресу.

15

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

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

То есть 39 символов макс.

+3

Однако существует, по-видимому, оговорка, см. Http://stackoverflow.com/a/7477384/3787376 («Максимальная длина для IP-адреса клиента») - Цитата: «Для IPv4-адресов IPv6, отображаемых IPv6, строка может быть длиннее 39 символов. ». В нем говорится, что «IPv6 с отображением IPv4» составляет 45 символов и находится в формате «NNNN: NNNN: NNNN: NNNN: NNNN: NNNN: 192.168.158.190». Следовательно, максимум должен составлять 45 символов. Ответ на этот вопрос также на http://stackoverflow.com/a/166157/3787376 (этот вопрос). – Edward 2016-04-17 12:26:21

7

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

64

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

#define INET6_ADDRSTRLEN 46 

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

0

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

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

1

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