我想在我的node.js dns服务器中回答一个CNAME查询,我想将我的回答部分放在响应的缓冲区中。我已经尝试使用此缓冲区作为答案部分,并在Windows中使用dig模块对其进行了测试,并得到了以下答案:
;; Got bad packet: bad label type
53 bytes
0d c4 85 80 00 01 00 01 00 00 00 00 04 74 65 73 .............tes
74 03 63 6f 6d 00 00 05 00 01 c0 0c 00 05 00 01 t.com...........
00 00 00 00 00 0a 73 65 63 6f 6e 64 54 65 73 74 ......secondTest
03 63 6f 6d 00 .com.
我已将此缓冲区作为答复部分发送给客户端:
[170,254,133,128,0,1,0,1,0,0,0,0,4,116,101,115,116,3,99,111,109,0,0,5,0,1,192,12,0,5,0,1,0,0,0,0,0,10,115,101,99,111,110,100,84,101,115,116,3,99,111,109,0]
我不知道那是怎么回事?
[如果您查看https://salsa.debian.org/dns-team/bind9/blob/debian/master/lib/dns/name.c处的dig源代码,您将看到错误“错误的标签类型”为DNS_R_BADLABELTYPE
,并且仅当字节的值为91 10或64 10 包含192 10,因为它们都表示编码名称时出现问题。
从您的缓冲区:
0d c4
,用于标识消息的16位ID85 80
是1 0000 1 0 1 1 000 0000
,表示:1
:消息是响应0000
:标准查询1
:AA,权威性答案0
:TC,不被截断1
:RD,需要递归]1
:RA,可用递归000
:Z,必须为零0000
:RCODE,没有错误00 01
QDCOUNT,问题部分有1个条目00 01
ANCOUNT,答案部分有1个条目00 00
NSCOUNT,权限部分为0项00 00
ARCOUNT,其他部分为0个条目现在是问题:
04
一个4字节的标签74 65 73 74
,即test
03
3字节的标签63 6f 6d
,即com
00
一个0字节的标签,即根]00 05
类型,CNAME
00 01
类,IN
现在我们进入答案部分:
c0 0c
表示指向位置0c
的指针(第一个字节设置了2个第一位),即13 10。在该位置,我们再次发现test.com
为74 65 73 74 03 63 6f 6d 00
00 05
类型,CNAME
00 01
类,IN
,00 00 00 00
TTL,000 0a
RDLENGTH,后续数据的大小,10个字节73 65 63 6f 6e 64 54 65 73 74
,前1个或2个字节应该是大小或指针,但是73 16是115 10,因此您到达了最上面描述的情况并导致出现错误消息,因为该字节以01
2开头,并且RFC 1035明确指出:“(10和01的组合保留供将来使用。)如果要test.com. 0 IN CNAME secondTest.com
,则应产生以下缓冲区(无名称压缩):04 74 65 73 74 03 63 6f 6d 00 00 05 00 01 00 00 00 00 00 10 0a 73 65 63 6f 6e 64 74 65 73 74 03 63 6f 6d 00
因此实际上您需要将0,10,115,101,99,111,110,100,84,101,115,116,3,99,111,109,0
替换为0,16,10,115,101,99,111,110,100,116,101,115,116,3,99,111,109,0
即您缺少第一个16
字节。(并且稍后84
与116
的区别是,如果您想在T
的前t内使用t
或secondTest
)