Чтение ответов DNS (mDNS)

Для проекта мне нужно читать ответы mDNS.

Я прочитал документ IETF (и tcpguide, который содержит много схемы), и я думаю, что уважаю их, но у меня есть проблема.

Часто я пытаюсь прочитать свой поток, но поток слишком короткий для данных, которые я пытаюсь прочитать.

У меня было несколько случаев, и я думаю, что что-то упускаю.

Один конкретный пример: я получаю это (я сделал небольшой «парсер ответов», чтобы увидеть, что я получаю, и «декодировать» его:

0000000000000000  0              ID
1                 True           IsResponse
0000              0              Opcode
1                 True           Authoritative
0                 False          Truncation
0                 False          Recursion desired
0                 False          Recursion available
000               000            Zero
0000              0              RCode
0000000000000000  0              Question count
0000000000000100  4              Answers count
0000000000000000  0              Authority count
0000000000000000  0              Additional count
Answers:
00001001          9              Size
01011111          _
01110011          s
01100101          e
01110010          r
01110110          v
01101001          i
01100011          c
01100101          e
01110011          s
00000111          7              Size
01011111          _
01100100          d
01101110          n
01110011          s
00101101          -
01110011          s
01100100          d
00000100          4              Size
01011111          _
01110101          u
01100100          d
01110000          p
00000101          5              Size
01101100          l
01101111          o
01100011          c
01100001          a
01101100          l
00000000          0              Size
00000000          0              Size
00001100          12             Size
00000000
00000001          ?
00000000
00000000
00011100          ?
00100000
00000000
00010111          ?
00001111          ¤
01011111          _
01110000          p
01100100          d
01101100          108            Size
00101101          -
01100100          d
01100001          a
01110100          t
01100001          a
01110011          s
01110100          t
01110010          r
01100101          e
01100001          a
01101101          m
00000100          ?
01011111          _
01110100          t
01100011          c
01110000          p
11000000          ?
00100011          #
11000000          ?
00001100          ?
00000000
00001100          ?
00000000
00000001          ?
00000000
00000000
00011100          ?
00100000
00000000
00001011          ?
00001000
01011111          _
01110000          p
01110010          r
01101001          i
01101110          n
01110100          t
01100101          e
01110010          r
11000000          ?
01000100          D
11000000          ?
00001100          ?
00000000
00001100          ?
00000000
00000001          ?
00000000
00000000
00011100          ?
00100000
00000000
00000111
00000100          ?
01011111          _
01101001          i
01110000          p
01110000          p
11000000          ?
01000100          D
11000000          ?
00001100          ?
00000000
00001100          ?
00000000
00000001          ?
00000000
00000000
00011100          ?
00100000
00000000
00001000
00000101          ?
01011111          _
01101000          h
01110100          t
01110100          t
01110000          p
11000000          ?
01000100          D
out of range      out of range
out of range      out of range
[...]

Я не понимаю, почему у меня недостаточно данных здесь. Бит усечения установлен на false, поэтому я должен иметь все данные в этом пакете, 01101100 на самом деле означает размер 108, а здесь у меня всего ~75 байт. Так что я делаю неправильно? Эта проблема чаще всего возникает с пакетами, содержащими ответы.


person J4N    schedule 19.02.2013    source источник
comment
покажите какой-нибудь код, чтобы мы могли видеть, что вы делаете!   -  person Peter    schedule 19.02.2013


Ответы (1)


На самом деле проблема заключалась в том, что в протоколе определено сжатие. Если размер следующих цепочек начинается с 11xx xxxx, это означает, что это указатель на предыдущую строку, xx xxxx — это байтовый индекс потока.

Я не читал это, а это означает, что я читал, что 11xx xxxx имеет длину, что дает мне огромную длину, которая часто выходит за пределы допустимого диапазона.

person J4N    schedule 22.02.2013