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