Перейти к содержимому
Последнее обновление

Преобразование в типы IP

Типы IP используются для хранения и обработки IP-адресов и включают типы IPv4 и IPv6. IPv4 хранится как uint32, а IPv6 — как uint128.

Преобразование в IPv4​

Из String​

Строгий режим​

Определение BNF​
<ipv4> ::= <whitespace>* <octet> "." <octet> "." <octet> "." <octet> <whitespace>*

<octet> ::= <digit> | <digit><digit> | <digit><digit><digit>

<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"

<whitespace> ::= " " | "\t" | "\n" | "\r" | "\f" | "\v"
Описание правил​

Адрес IPv4 состоит из 4 числовых сегментов, разделённых точками: number.number.number.number, например: 192.168.1.1. Каждый сегмент должен находиться в диапазоне от 0 до 255. Допускаются ведущие нули в числах. Перед адресом и после него может быть любое количество пробельных символов (включая пробелы, символы табуляции, переводы строк и т. д.).

Если формат не соответствует требованиям, выдаётся ошибка.

Примеры​
Входная строкаРезультат разбораКомментарий
"192.168.1.1"УспешноСтандартный допустимый адрес
"0.0.0.0"УспешноНижняя граница диапазона
"255.255.255.255"УспешноВерхняя граница диапазона
"10.20.30.40"УспешноОбычный адрес
" 192.168.1.1 "УспешноДопускаются пробельные символы до и после адреса
"192.168.01.1"УспешноДопускаются ведущие нули (01 = 1)
"1.2.3"ОшибкаТолько 3 сегмента (должно быть 4)
"1.2.3.4.5"Ошибка5 сегментов (должно быть 4)
"256.0.0.1"ОшибкаПервый сегмент > 255 (256 вне диапазона)
"1.300.2.3"ОшибкаВторой сегмент > 255
"1.2.3."ОшибкаОтсутствует четвёртый сегмент
".1.2.3"ОшибкаОтсутствует первый сегмент
"1..2.3"ОшибкаОтсутствует второй сегмент
"a.b.c.d"ОшибкаНечисловые символы
"1.2.+3.4"ОшибкаЗнак + недопустим

Нестрогий режим​

Определение BNF​
<ipv4> ::= <whitespace>* <octet> "." <octet> "." <octet> "." <octet> <whitespace>*

<octet> ::= <digit> | <digit><digit> | <digit><digit><digit>

<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"

<whitespace> ::= " " | "\t" | "\n" | "\r" | "\f" | "\v"
Описание правил​

Адрес IPv4 состоит из 4 числовых сегментов, разделённых точками: number.number.number.number, например: 192.168.1.1. Каждый сегмент должен находиться в диапазоне от 0 до 255. Допускаются ведущие нули в числах. Перед адресом и после него может быть любое количество пробельных символов (включая пробелы, символы табуляции, переводы строк и т. д.).

Если формат не соответствует требованиям, возвращается null.

Примеры​
Входная строкаРезультат разбораКомментарий
"192.168.1.1"УспешноСтандартный допустимый адрес
"0.0.0.0"УспешноНижняя граница диапазона
"255.255.255.255"УспешноВерхняя граница диапазона
"10.20.30.40"УспешноОбычный адрес
" 192.168.1.1 "УспешноДопускаются пробельные символы до и после адреса
"192.168.01.1"УспешноДопускаются ведущие нули (01 = 1)
"1.2.3"nullТолько 3 сегмента (должно быть 4)
"1.2.3.4.5"null5 сегментов (должно быть 4)
"256.0.0.1"nullПервый сегмент > 255 (256 вне диапазона)
"1.300.2.3"nullВторой сегмент > 255
"1.2.3."nullОтсутствует четвёртый сегмент
".1.2.3"nullОтсутствует первый сегмент
"1..2.3"nullОтсутствует второй сегмент
"a.b.c.d"nullНечисловые символы
"1.2.+3.4"nullЗнак + недопустим

Преобразование в IPv6​

Из String​

Изменение поведения

До версии 4.0 в Doris действовали менее строгие требования к формату адресов IPv6, например:

  • Допускалось несколько двоеточий подряд (например, '1:1:::1')
  • Допускалось двойное двоеточие, которое фактически ничего не сокращало (например, '1:1:1::1:1:1:1:1')

Начиная с версии 4.0 эти два нестандартных формата приводят к ошибке в строгом режиме или к возврату null в нестрогом режиме.

Строгий режим​

Определение BNF​
<ipv6> ::= <whitespace>* <ipv6-standard> <whitespace>*
| <whitespace>* <ipv6-compressed> <whitespace>*
| <whitespace>* <ipv6-ipv4-mapped> <whitespace>*

<ipv6-standard> ::= <h16> ":" <h16> ":" <h16> ":" <h16> ":" <h16> ":" <h16> ":" <h16> ":" <h16>

<h16> ::= <hexdigit>{1,4}

<hexdigit> ::= <digit> | "a" | "b" | "c" | "d" | "e" | "f" | "A" | "B" | "C" | "D" | "E" | "F"

<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"

<whitespace> ::= " " | "\t" | "\n" | "\r" | "\f" | "\v"
Описание правил​
  1. Стандартный формат: 8 групп шестнадцатеричных цифр, разделённых двоеточиями, каждая из которых содержит от 1 до 4 шестнадцатеричных цифр. Пример: 2001:0db8:85a3:0000:0000:8a2e:0370:7334
  2. Сокращённый формат:
  • Двойное двоеточие (::) можно использовать для обозначения одной или нескольких последовательных групп нулей.
  • Двойное двоеточие (::) может встречаться в адресе только один раз.
  • Само по себе :: также является допустимым адресом, состоящим из одних нулей.
  • Адрес 1:1:1::1:1:1:1:1 недопустим, поскольку :: не заменяет последовательные группы нулей.
  • Все следующие адреса допустимы и эквивалентны:
    • 2001:0db8:0000:0000:0000:0000:1428:57ab
    • 2001:0db8:0000:0000:0000::1428:57ab
    • 2001:0db8:0:0:0:0:1428:57ab
    • 2001:0db8:0::0:1428:57ab
    • 2001:0db8::1428:57ab
  1. Адреса с отображением IPv4:
  • В последних 32 битах (последних двух группах) адреса IPv6 можно использовать десятичную запись IPv4 с точками.
  • Этот формат обычно используется для представления отображения адресов IPv4 в IPv6.
  • Пример: ::ffff:192.168.89.9 эквивалентен ::ffff:c0a8:5909
  1. Перед адресом и после него может быть любое количество пробельных символов (включая пробелы, символы табуляции, переводы строк и т. д.).
  2. Буквы в шестнадцатеричной записи могут быть прописными (A-F) или строчными (a-f).
  3. Часть IPv4 должна соответствовать правилам IPv4: каждый сегмент должен находиться в диапазоне от 0 до 255.
  4. Если формат адреса не соответствует указанным выше правилам, выдаётся ошибка.
Примеры​
Входная строкаРезультат разбораКомментарий
2001:db8:85a3:0000:0000:8a2e:0370:7334УспешноСтандартный допустимый адрес
::УспешноАдрес, состоящий из одних нулей
2001:db8::УспешноИспользуется сокращённый формат
::ffff:192.168.1.1УспешноАдрес с отображением IPv4
2001:db8::1УспешноДопускаются пробельные символы до и после адреса
2001:db8::1::2ОшибкаДвойное двоеточие (::) встречается дважды
2001:db8:85a3:0000:0000:8a2e:0370:7334:1234ОшибкаБолее 8 групп
2001:db8:85a3:0000:8a2e:0370ОшибкаТолько 6 групп (должно быть 8 либо нужно использовать сокращённый формат)
2001:db8:85g3:0000:0000:8a2e:0370:7334ОшибкаСодержит недопустимый шестнадцатеричный символ 'g'
2001:db8::ffff:192.168.1.260ОшибкаЧасть IPv4 выходит за пределы диапазона (260 > 255)
2001:db8::ffff:192.168..1ОшибкаОшибка формата части IPv4 (отсутствует сегмент)
2001:0db8:85a3:::8a2e:0370:7334ОшибкаТри двоеточия подряд
20001:db8::1ОшибкаПервая группа содержит более 4 шестнадцатеричных цифр

Нестрогий режим​

Определение BNF​
<ipv6> ::= <whitespace>* <ipv6-standard> <whitespace>*
| <whitespace>* <ipv6-compressed> <whitespace>*
| <whitespace>* <ipv6-ipv4-mapped> <whitespace>*

<ipv6-standard> ::= <h16> ":" <h16> ":" <h16> ":" <h16> ":" <h16> ":" <h16> ":" <h16> ":" <h16>

<h16> ::= <hexdigit>{1,4}

<hexdigit> ::= <digit> | "a" | "b" | "c" | "d" | "e" | "f" | "A" | "B" | "C" | "D" | "E" | "F"

<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"

<whitespace> ::= " " | "\t" | "\n" | "\r" | "\f" | "\v"
Описание правил​
  1. Стандартный формат: 8 групп шестнадцатеричных цифр, разделённых двоеточиями, каждая из которых содержит от 1 до 4 шестнадцатеричных цифр. Пример: 2001:0db8:85a3:0000:0000:8a2e:0370:7334
  2. Сокращённый формат:
  • Двойное двоеточие (::) можно использовать для обозначения одной или нескольких последовательных групп нулей.
  • Двойное двоеточие (::) может встречаться в адресе только один раз.
  • Само по себе :: также является допустимым адресом, состоящим из одних нулей.
  • Адрес 1:1:1::1:1:1:1:1 недопустим, поскольку :: не заменяет последовательные группы нулей.
  • Все следующие адреса допустимы и эквивалентны:
    • 2001:0db8:0000:0000:0000:0000:1428:57ab
    • 2001:0db8:0000:0000:0000::1428:57ab
    • 2001:0db8:0:0:0:0:1428:57ab
    • 2001:0db8:0::0:1428:57ab
    • 2001:0db8::1428:57ab
  1. Адреса с отображением IPv4:
  • В последних 32 битах (последних двух группах) адреса IPv6 можно использовать десятичную запись IPv4 с точками.
  • Этот формат обычно используется для представления отображения адресов IPv4 в IPv6.
  • Пример: ::ffff:192.168.89.9 эквивалентен ::ffff:c0a8:5909
  1. Перед адресом и после него может быть любое количество пробельных символов (включая пробелы, символы табуляции, переводы строк и т. д.).
  2. Буквы в шестнадцатеричной записи могут быть прописными (A-F) или строчными (a-f).
  3. Часть IPv4 должна соответствовать правилам IPv4: каждый сегмент должен находиться в диапазоне от 0 до 255.
  4. Если формат адреса не соответствует указанным выше правилам, возвращается null.
Примеры​
Входная строкаРезультат разбораКомментарий
2001:db8:85a3:0000:0000:8a2e:0370:7334УспешноСтандартный допустимый адрес
::УспешноАдрес, состоящий из одних нулей
2001:db8::УспешноИспользуется сокращённый формат
::ffff:192.168.1.1УспешноАдрес с отображением IPv4
2001:db8::1УспешноДопускаются пробельные символы до и после адреса
2001:db8::1::2nullДвойное двоеточие (::) встречается дважды
2001:db8:85a3:0000:0000:8a2e:0370:7334:1234nullБолее 8 групп
2001:db8:85a3:0000:8a2e:0370nullТолько 6 групп (должно быть 8 либо нужно использовать сокращённый формат)
2001:db8:85g3:0000:0000:8a2e:0370:7334nullСодержит недопустимый шестнадцатеричный символ 'g'
2001:db8::ffff:192.168.1.260nullЧасть IPv4 выходит за пределы диапазона (260 > 255)
2001:db8::ffff:192.168..1nullОшибка формата части IPv4 (отсутствует сегмент)
2001:0db8:85a3:::8a2e:0370:7334nullТри двоеточия подряд
20001:db8::1nullПервая группа содержит более 4 шестнадцатеричных цифр

Из IPv4​

Любой адрес IPv4 можно преобразовать в IPv6. Преобразование всегда выполняется успешно, а поведение одинаково в строгом и нестрогом режимах.

Исходный IPv4Полученный IPv6
192.168.0.0::ffff:192.168.0.0
0.0.0.0::ffff:0.0.0.0