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

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

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

Tantor SE-1C предлагает типы данных для хранения IPv4, IPv6 и MAC-адресов, как показано в Таблица 8.21. Рекомендуется использовать эти типы вместо обычных текстовых типов для хранения сетевых адресов, поскольку эти типы предлагают проверку ошибок ввода и специализированные операторы и функции (см. Раздел 9.12).

Таблица 8.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.

8.9.1. inet #

Тип inet содержит IPv4 или IPv6 адрес хоста и, при необходимости, его подсеть, все в одном поле. Подсеть представлена количеством битов сетевого адреса, присутствующих в адресе хоста (т.е. маска сети). Если маска сети равна 32 и адрес является IPv4, то значение не указывает на подсеть, а только на один хост. В IPv6 длина адреса составляет 128 бит, поэтому 128 бит указывают на уникальный адрес хоста. Обратите внимание, что если нужно принимать только сети, вам следует использовать тип cidr вместо inet.

Формат ввода для этого типа данных - address/у, где address - это IPv4 или IPv6 адрес, а у - количество битов в маске подсети. Если часть не указана, то маска подсети считается равной 32 для IPv4 или 128 для IPv6, что означает, что значение представляет только один хост. При отображении часть не отображается, если маска подсети указывает на один хост.

8.9.2. cidr #

Тип cidr содержит спецификацию сети IPv4 или IPv6. Форматы ввода и вывода следуют соглашениям Classless Internet Domain Routing. Формат для указания сетей - address/y, где address - это наименьший адрес сети, представленный в виде IPv4 или IPv6 адреса, а у - количество битов в маске подсети. Если у не указано, оно вычисляется с использованием предположений из старой системы нумерации сетей по классам, за исключением того, что оно будет достаточно большим, чтобы включить все октеты, записанные во входных данных. Ошибка указать сетевой адрес, у которого установлены биты справа от указанной маски подсети.

Таблица 8.22 показывает некоторые примеры.

Таблица 8.22. cidr Тип Примеры ввода

cidr Вводcidr Выводabbrev(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/128
::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

8.9.3. inet vs. cidr #

Основное отличие между типами данных inet и cidr заключается в том, что тип inet принимает значения с ненулевыми битами справа от маски подсети, в то время как тип cidr этого не делает. Например, 192.168.0.1/24 является допустимым для типа inet, но не для типа cidr.

Подсказка

Если вам не нравится формат вывода для значений inet или cidr, попробуйте функции host, text и abbrev.

8.9.4. 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. Вывод всегда в первой из показанных форм.

Стандарт IEEE 802-2001 определяет вторую форму (с дефисами) как каноническую форму для MAC-адресов и указывает первую форму (с двоеточиями) как используемую с обратным порядком битов, сначала старший бит, так что 08-00-2b-01-02-03 = 10:00:D4:80:40:C0. Это соглашение в настоящее время широко игнорируется и имеет значение только для устаревших сетевых протоколов (например, Token Ring). PostgreSQL не предусматривает обратный порядок битов; все принимаемые форматы используют канонический порядок LSB.

Оставшиеся пять форматов ввода не являются частью какого-либо стандарта.

8.9.5. macaddr8 #

Тип macaddr8 хранит MAC-адреса в формате EUI-64, который известен, например, из аппаратных адресов Ethernet-карт (хотя MAC-адреса также используются для других целей). Этот тип может принимать как 6-байтовые, так и 8-байтовые MAC-адреса и хранит их в формате 8 байтов. MAC-адреса, заданные в формате 6 байтов, будут храниться в формате 8 байтов, при этом 4-й и 5-й байты будут установлены в FF и FE соответственно. Обратите внимание, что IPv6 использует измененный формат EUI-64, где 7-й бит должен быть установлен в единицу после преобразования из EUI-48. Для выполнения этого изменения предоставляется функция macaddr8_set7bit. Обычно принимается любой ввод, состоящий из пар шестнадцатеричных цифр (на границах байтов), опционально разделенных одним из символов ':', '-' или '.'. Количество шестнадцатеричных цифр должно быть либо 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)