Сколько символов может содержать IP-адрес?

Вопрос или проблема

Мне нужно создать поле в таблице MySQL для хранения IP-адресов. Мне нужно знать, сколько максимально символов может иметь IP-адрес. Независимо от того, это IPv4, IPv6 или какой-то другой тип, который может сделать IP-адрес необычайно длинным. Какой лимит символов я должен установить?

Я спрашиваю о длине в том смысле, что слово “foo” имеет 3 символа, а не в байтах или чем-то подобном.

IPv6-адрес в самом длинном виде будет состоять из 8 групп по 4 символа (всего 32), каждая группа разделена двоеточием. Это получается 39 символов.

IPv4-адрес содержит максимум 4 группы по 3 цифры (12 символов), каждая группа разделена точкой (.). Это дает 15 символов.

Все это подразумевает, что IP-адреса должны храниться в виде, читаемом человеком. Я предпочитаю хранить IP-адреса в десятичной форме, так как никогда не знаешь, как они будут использоваться. Ваш опыт может отличаться.

Это не так просто, как может показаться.

В большинстве случаев вы в безопасности с 45.

Обычный IPv6-адрес

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

8 * 4 + 7 = 39


IPv4-совмещенный IPv6-адрес

См. rfc4291

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

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


Заголовочные файлы определяют INET6_ADDRSTRLEN как 46


IPv6 с зональной областью

См. rfc4007

Зональная область может быть числом или даже строкой (имя интерфейса).

ff02::5678%5
ff08::9abc%interface10

Длина имени интерфейса зависит от системы. В Linux она определяется константой IFNAMSIZ. 16 — это обычное значение. С 45 символами из вышеприведенного:

45 + 1 + 16 = 62


См. также https://stackoverflow.com/questions/166132/maximum-length-of-the-textual-representation-of-an-ipv6-address

IP-адреса — это двоичные числа

IPv6-адрес — это 128-битное или 16-байтное число. Наибольшее целое число, которое MySQL и большинство других СУБД могут хранить, — это BIGINT. Это означает, что адрес IPv6 может быть сохранен в двух числах типа BIGINT.

INET6

Недавние версии MariaDB предлагают специфический тип для адресов IPv6. Он также предлагает удобное преобразование из упакованного представления.

Если вам нужно читаемое человеком упакованное представление, существуют множество библиотек, которые можно использовать в Python, C++ и PHP.

Сохранение упакованных адресов IPv6 в базе данных не рекомендуется, так как символическое представление довольно неэффективно.

Кстати: для IP-адресов IPv4 действует что-то подобное. Они удобно помещаются в INT

.

Ответ или решение

Создание поля в MySQL таблице для хранения IP-адресов требует внимательного рассмотрения вопроса о максимальной длине символов, которые может содержать такой адрес. Существуют различные форматы IP-адресов, включая IPv4 и IPv6, и каждый имеет свои особенности в представлении. В данном ответе я подробно рассмотрю оба типа адресов, их максимальную длину в символах, а также предложу оптимальные решения для хранения IP-адресов.

Теория

IPv4-адреса — это более старый и широко используемый стандарт интернет-протокола, состоящий из четырех десятичных чисел (октетов) от 0 до 255, разделённых точками. Пример IPv4-адреса выглядит как 192.168.100.228. Максимальная длина такого адреса составляет 15 символов (4 октета по 3 цифры каждый + 3 разделительных точки).

IPv6-адреса — это более новый стандарт, разработанный для устранения недостатков и ограничений IPv4, особенно с учётом ограниченного числа доступных адресов. IPv6-адреса представлены в виде восьми групп по четыре 16-ричных цифры, разделённых двоеточиями. Например: 2001:0db8:85a3:0000:0000:8a2e:0370:7334. Максимальная длина такого адреса — 39 символов (8 групп по 4 символа + 7 двоеточий).

Однако существуют и более сложные формы адресов:

  • IPv4-в IPv6-адреса (или IPv4-mapped IPv6) могут содержать IPv4-адрес, встроенный в формате IPv6. Например: ::ffff:192.168.100.228. В данном случае максимальная длина может достигать 45 символов.

  • IPv6 с зоной области (Scope Zone) добавляет к стандартному IPv6-адресу идентификатор области, что делает адрес длиннее. Например: ff02::5678%5 или ff08::9abc%interface10. Для текстовых представлений длина может достигать 62 символов.

Пример

Рассмотрим, как каждый из упомянутых форматов может быть реализован в настройке базы данных MySQL:

  1. IPv4: Обычный IPv4-адрес можно хранить в поле типа VARCHAR(15), убедившись, что средства ввода и проверки данных корректно обрабатывают число и правильность формата.

  2. IPv6: Для хранения стандартного IPv6-адреса потребуется минимум VARCHAR(39). Однако рассмотрите возможность хранения в формате 45 символов для учёта IPv4-в IPv6-адресов.

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

Применение

На практике при выборе размера поля в базе данных рекомендуется учитывать и возможности работы с IP-адресами на двоичном уровне. Например, в случае с IPv4, адреса удобно конвертировать и хранить в типе INT, что экономит пространство и ускоряет операции поиска и сортировки.

Для IPv6 адресов есть специальные типы данных, например, в MariaDB — INET6. Также существуют различные библиотеки для работы с такими адресами в языках программирования, что может быть полезно для конвертации и представления IP-адресов на разных уровнях.

Таким образом, учитывая длину символов, мы приходим к заключению, что оптимальным решением будет использование текстового поля VARCHAR(62) для учёта всех возможных форматов IP-адресов, включая и те, которые включают идентификаторы зон. Такой подход обеспечит максимальную гибкость и готовность к любым возможным сценариям использования IP-адресов в информационных системах. Также обязательно нужно следить за актуальностью используемых стандартов и рекомендаций, чтобы оставаться в рамках лучших практик и подходов в IT.

Оцените материал
Добавить комментарий

Капча загружается...