8.9. Типы сетевых адресов#
8.9. Типы сетевых адресов #
Tantor BE предлагает типы данных для хранения IPv4, IPv6 и MAC-адресов, как показано в Таблица 8.21. Рекомендуется использовать эти типы вместо обычных текстовых типов для хранения сетевых адресов, поскольку эти типы предлагают проверку ошибок ввода и специализированные операторы и функции (см. Раздел 9.12).
Таблица 8.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.
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 Вывод |
|
---|---|---|
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/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)