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

StackOverflow https://stackoverflow.com/questions/166132

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Меня не интересует преобразование текстового представления в 128 битов, в которые обычно кодируется адрес, я просто хочу знать, сколько максимум символов необходимо для хранения любого адреса IPv6, возвращаемого <=>.

Это было полезно?

Решение

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] для адреса выше.

Другие советы

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

#define INET6_ADDRSTRLEN 46

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

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

  

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top