Типы сетевых адресов
QHB предлагает типы данных для хранения адресов IPv4, IPv6 и MAC, как показано в Таблице 21. Для хранения сетевых адресов лучше вместо обычных текстовых типов использовать эти типы, потому что они предлагают проверку ошибок ввода, а также специализированные операторы и функции (см. раздел Функции и операторы для сетевых адресов).
Таблица 21. Типы сетевых адресов
Имя | Размер | Описание |
---|---|---|
cidr | 7 или 19 байт | Сети IPv4 и IPv6 |
inet | 7 или 19 байт | Хосты и сети IPv4 и IPv6 |
macaddr | 6 байт | MAC-адреса |
macaddr8 | 8 байт | MAC-адреса (формат EUI-64) |
При сортировке типов inet или cidr адреса IPv4 всегда будут сортироваться до адресов IPv6, в том числе адреса IPv4, включенные или сопоставленные с адресами IPv6, например ::10.2.3.4 или ::ffff:10.4.3.2.
inet
Тип inet содержит адрес хоста IPv4 или IPv6 и, при необходимости, его подсеть, все в одном поле. Подсеть представляется количеством битов адреса сети в адресе хоста (или «маской сети»). Если маска сети равна 32, а адрес — IPv4, то это значение указывает не на подсеть, а только на отдельный хост. В IPv6 длина адреса составляет 128 бит, поэтому уникальный адрес хоста задают 128 бит. Обратите внимание, что, если вам требуется, чтобы принимались только адреса сетей, следует использовать тип cidr а не inet.
Формат ввода для этого типа: адрес/y где адрес — это адрес IPv4 или IPv6, а y — количество битов в маске сети. Если часть /y отсутствует, то маска сети равна 32 для IPv4 и 128 для IPv6, поэтому значение будет представлять только один хост. При выводе часть /y опускается, если маска сети определяет адрес одного хоста.
cidr
Тип cidr содержит определение сети IPv4 или IPv6. Форматы ввода и вывода соответствуют соглашениям CIDR (Classless Internet Domain Routing, бесклассовая междоменная маршрутизация). Сети определяются в формате адрес/y, где адрес — это сеть, представленная в виде адреса IPv4 или IPv6, а y — количество битов в маске сети. Если y опущен, он рассчитывается с использованием допущений из старой классовой системы нумерации сети, с той разницей, что он будет как минимум достаточно большим, чтобы в него вошли все октеты, записанные во входных данных. Сетевой адрес, биты которого указаны справа от заданной маски, будет считаться ошибочным.
В Таблице 22 приводится несколько соответствующих примеров.
Таблица 22. Примеры вводимых значений типа cidr
Вводимое значение cidr | Выводимое значение cidr | abbrev(cidr) |
---|---|---|
192.168.100.128/25 | 192.168.100.128/25 | 192.168.100.128/25 |
192.168/24 | 192.168.0.0/24 | 192.168.0/24 |
192.168/25 | 192.168.0.0/25 | 192.168.0.0/25 |
192.168.1 | 192.168.1.0/24 | 192.168.1/24 |
192.168 | 192.168.0.0/24 | 192.168.0/24 |
128.1 | 128.1.0.0/16 | 128.1/16 |
128 | 128.0.0.0/16 | 128.0/16 |
128.1.2 | 128.1.2.0/24 | 128.1.2/24 |
10.1.2 | 10.1.2.0/24 | 10.1.2/24 |
10.1 | 10.1.0.0/16 | 10.1/16 |
10 | 10.0.0.0/8 | 10/8 |
10.1.2.3/32 | 10.1.2.3/32 | 10.1.2.3/32 |
2001:4f8:3:ba::/64 | 2001:4f8:3:ba::/64 | 2001:4f8:3:ba::/64 |
2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128 | 2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128 | 2001:4f8:3:ba:2e0:81ff:fe22:d1f1 |
::ffff:1.2.3.0/120 | ::ffff:1.2.3.0/120 | ::ffff:1.2.3/120 |
::ffff:1.2.3.0/128 | ::ffff:1.2.3.0/128 | ::ffff:1.2.3.0/128 |
Различия между inet и cidr
Существенное различие между типами данных inet и cidr заключается в том, что inet принимает значения с ненулевыми битами справа от маски сети, а cidr — нет. Например, значение 192.168.0.1/24 допустимо для inet но не для cidr.
Совет
Если вас не устраивает формат вывода inet или cidr, попробуйте функции host, text и abbrev.
macaddr
В типе macaddr хранятся MAC-адреса, примером которых являются аппаратные адреса Ethernet-платы (хотя MAC-адреса используются и для других целей). Входные значения принимается в следующих форматах:
'08:00:2b:01:02:03'
'08-00-2b-01-02-03'
'08002b:010203'
'08002b-010203'
'0800.2b01.0203'
'0800-2b01-0203'
'08002b010203'
Все эти примеры определяют один и тот же адрес. Верхний и нижний регистр допускается для шестнадцатеричных цифр от a до f. Выводится macaddr всегда в первой из показанных форм.
Стандарт IEEE 802-2001 считает вторую из показанных форм (с дефисами) канонической формой для MAC-адресов, а первую форму (с двоеточиями) определяет как запись с обратным порядком бит, поэтому 08-00-2b-01-02-03 = 01:00:4D:08:04:0C. В настоящее время это соглашение в основном игнорируется и имеет значение только для устаревших сетевых протоколов (таких как Token Ring). QHB не поддерживает изменение порядка битов, и в всех принятых форматах используется канонический порядок LSB.
Остальные пять форматов ввода не описаны ни в каких стандартах.
macaddr8
В типе macaddr8 хранятся MAC-адреса в формате EUI-64, примером которых являются аппаратные адреса Ethernet-платы (хотя MAC-адреса также используются и для других целей). Этот тип может принимать MAC-адреса длиной 6 и 8 байт и сохранять их в формате длиной 8 байт. MAC-адреса, заданные в 6-байтовом формате, будут сохраняться в формате 8 байт, а 4-й и 5-й байты будут отданы FF и FE соответственно. Обратите внимание, что IPv6 использует модифицированный формат EUI-64, где 7-й бит должен быть установлен в 1 после преобразования из EUI-48. Для этого изменения предусмотрена функция macaddr8_set7bit. Вообще говоря, тип macaddr8 принимает любые входные строки, состоящие из пар шестнадцатеричных цифр (на границах байтов), при необходимости согласованно разделяемых одним из следующих символов: ':', '-' или '.'. Количество шестнадцатеричных цифр должно быть 16 (8 байт) или 12 (6 байт). Начальные и конечные пробелы игнорируются. Ниже приведены примеры допустимых форматов ввода:
'08:00:2b:01:02:03:04:05'
'08-00-2b-01-02-03-04-05'
'08002b:0102030405'
'08002b-0102030405'
'0800.2b01.0203.0405'
'0800-2b01-0203-0405'
'08002b01:02030405'
'08002b0102030405'
Все эти примеры определяют один и тот же адрес. Верхний и нижний регистр допускается для шестнадцатеричных цифр от a до f. Вывод всегда представляется в первой из показанных форм.
Последние шесть вышеуказанных форматов ввода не описаны ни в каких стандартах.
Чтобы преобразовать традиционный 48-битный MAC-адрес в формате EUI-48 в модифицированный формат EUI-64, который будет включен в адрес IPv6 качестве адреса хоста, воспользуйтесь функцией macaddr8_set7bit, как показано ниже:
SELECT macaddr8_set7bit('08:00:2b:01:02:03');
macaddr8_set7bit
-------------------------
0a:00:2b:ff:fe:01:02:03
(1 row)