RFC 1035 - Значение косой черты?
Я изучал RFC 1035, чтобы реализовать его в качестве клиента DNS в C++. У меня есть проблемы с неявным использованием синтаксиса в определениях RR упомянутой заметки.
Пожалуйста, взгляните на следующие примеры определения структуры данных. Они иллюстрируют мою проблему понимания.
Начало заголовка RDATA
1 1 1 1 1 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| |
/ /
/ NAME /
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| TYPE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
Старт SOA RR
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
/ MNAME /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
/ RNAME /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| SERIAL |
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
Из макета вы можете сделать вывод, что элемент "TYPE" заголовка RDATA является 16-битным полем с прямым порядком байтов. Но как насчет члена "NAME"? Почему определение имеет знак "/" на границе поля? Похоже, что это неявное использование без разъяснений в RFC.
Затем существует RR "SOA", в котором есть члены MNAME и RNAME. Я начинаю видеть образец здесь: все члены с косой чертой выглядят как строки.
Но есть несколько способов двоичного кодирования строк:
- Элемент длины 8/16/32 с данными по длине
read unsigned word x
read data of length x
- строка с нулевым символом в конце
read byte x until x is 0
- неявное использование всей длины RDATA
cnt = 0
while cnt < RDATA_HEADER.RDLENGTH do
read byte x and store it
cnt++
end
Итак, мой вопрос: как правильно интерпретировать использование "/" в любом случае определений RFC? Также делает смешанное использование "/" и "|" подразумевать какой-либо минимальный размер члена? Есть ли RFC для более четкого определения использования этих блоков?