Типы сетевых адресов

QHB предлагает типы данных для хранения адресов IPv4, IPv6 и MAC, как показано в Таблице 21. Для хранения сетевых адресов лучше вместо обычных текстовых типов использовать эти типы, потому что они предлагают проверку ошибок ввода, а также специализированные операторы и функции (см. раздел Функции и операторы для сетевых адресов).

Таблица 21. Типы сетевых адресов

ИмяРазмерОписание
cidr7 или 19 байтСети IPv4 и IPv6
inet7 или 19 байтХосты и сети IPv4 и IPv6
macaddr6 байтMAC-адреса
macaddr88 байт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Выводимое значение cidrabbrev(cidr)
192.168.100.128/25192.168.100.128/25192.168.100.128/25
192.168/24192.168.0.0/24192.168.0/24
192.168/25192.168.0.0/25192.168.0.0/25
192.168.1192.168.1.0/24192.168.1/24
192.168192.168.0.0/24192.168.0/24
128.1128.1.0.0/16128.1/16
128128.0.0.0/16128.0/16
128.1.2128.1.2.0/24128.1.2/24
10.1.210.1.2.0/2410.1.2/24
10.110.1.0.0/1610.1/16
1010.0.0.0/810/8
10.1.2.3/3210.1.2.3/3210.1.2.3/32
2001:4f8:3:ba::/642001:4f8:3:ba::/642001:4f8:3:ba::/64
2001:4f8:3:ba:2e0:81ff:fe22:d1f1/1282001:4f8:3:ba:2e0:81ff:fe22:d1f1/1282001: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)