如何按正确顺序读取超过 255 个字符的 TXT 记录
How to read TXT Records longer than 255 characters in correct order
我正在使用 DNSJava lib to fetch DKIM TXT records for a given selector + domain name. I want to ensure I read the record in the correct order when the record size is greater than 255 characters and spans over multiple strings in the result. As per the RFC Doc & RFC DOC 我们应该连接结果中的所有字符串,但它没有告诉我们 DNS 服务器是否会 return 以正确的顺序记录字符串。
例如:“v=DKIM1;k=rsa;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCUI5E9hZhMEEgjqF6fHNYYBmAEcF7DN2v/FA6yiY/a3R2L8ebGQjCdP2m3PfqLk8ovVd84eJ”,“FkNuXGEsR0rXEHveOjc161z1tz4TGzPC5pGmjuzlYaibUQAb8T1GLbRse+ZkXhCxudeeRj7NBbCjaH1biClbp4v4/V0PLdugeGQQIDAQAB”,“juzlYaibUQAb8T1GLbRse+ZkXhCxudeeRj7”
在上面的例子中,我无法确定记录的顺序。只有 DKIM header 部分可以推断为记录的开始
The order of those strings doesn't have to be determined, it's well-defined。请注意,您显示的字符串不是 records!
您似乎将同一 TXT 记录中的不同字符串与多个 TXT 记录混淆了。您不能将一个字符串拆分到多个记录中,但是您 can 将它拆分到 same 记录中的多个片段中,这可能就是您所指的到.
一条TXT记录可以包含多个字符串,参见RFC 1035:
3.3.14. TXT RDATA format
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
/ TXT-DATA /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
where:
TXT-DATA One or more <character-string>s.
TXT RRs are used to hold descriptive text. The semantics of the text
depends on the domain where it is found.
如您所见,字符串的顺序是记录的 RDATA 本身的一部分。 DNS 服务器不应该以任何方式破坏它。
例如,这就是您的示例记录在区域文件中的定义方式:
name IN TXT ("v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCUI5E9hZhMEEgjqF6fHNYYBmAEcF7DN2v/FA6yiY/a3R2L8ebGQjCdP2m3PfqLk8ovVd84eJ"
"FkNuXGEsR0rXEHveOjc161z1tz4TGzPC5pGmjuzlYaibUQAb8T1GLbRse+ZkXhCxudeeRj7NBbCjaH1biClbp4v4/V0PLdugeGQQIDAQAB"
"juzlYaibUQAb8T1GLbRse+ZkXhCxudeeRj7")
...而多个 TXT 记录看起来更像这样:
name IN TXT ("v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCUI5E9hZhMEEgjqF6fHNYYBmAEcF7DN2v/FA6yiY/a3R2L8ebGQjCdP2m3PfqLk8ovVd84eJ"
"FkNuXGEsR0rXEHveOjc161z1tz4TGzPC5pGmjuzlYaibUQAb8T1GLbRse+ZkXhCxudeeRj7NBbCjaH1biClbp4v4/V0PLdugeGQQIDAQAB"
"juzlYaibUQAb8T1GLbRse+ZkXhCxudeeRj7")
name IN TXT "google-site-verification=abcde_xxxxxxxxxxxxx"
name IN TXT "MS=ms1234567"
在后一种情况下,您无法确定返回这三个记录的顺序(v=DKIM1...
、google-site...
和 MS=...
),但它不应该无论如何都有任何意义。
在 dnsjava
的情况下,您应该从 getAnswers
, but for each record you should get its strings (in order) from getStrings
.
中获取包含不同记录的数组(不一定按任何顺序排列)
我正在使用 DNSJava lib to fetch DKIM TXT records for a given selector + domain name. I want to ensure I read the record in the correct order when the record size is greater than 255 characters and spans over multiple strings in the result. As per the RFC Doc & RFC DOC 我们应该连接结果中的所有字符串,但它没有告诉我们 DNS 服务器是否会 return 以正确的顺序记录字符串。
例如:“v=DKIM1;k=rsa;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCUI5E9hZhMEEgjqF6fHNYYBmAEcF7DN2v/FA6yiY/a3R2L8ebGQjCdP2m3PfqLk8ovVd84eJ”,“FkNuXGEsR0rXEHveOjc161z1tz4TGzPC5pGmjuzlYaibUQAb8T1GLbRse+ZkXhCxudeeRj7NBbCjaH1biClbp4v4/V0PLdugeGQQIDAQAB”,“juzlYaibUQAb8T1GLbRse+ZkXhCxudeeRj7”
在上面的例子中,我无法确定记录的顺序。只有 DKIM header 部分可以推断为记录的开始
The order of those strings doesn't have to be determined, it's well-defined。请注意,您显示的字符串不是 records!
您似乎将同一 TXT 记录中的不同字符串与多个 TXT 记录混淆了。您不能将一个字符串拆分到多个记录中,但是您 can 将它拆分到 same 记录中的多个片段中,这可能就是您所指的到.
一条TXT记录可以包含多个字符串,参见RFC 1035:
3.3.14. TXT RDATA format
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
/ TXT-DATA /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
where:
TXT-DATA One or more <character-string>s.
TXT RRs are used to hold descriptive text. The semantics of the text
depends on the domain where it is found.
如您所见,字符串的顺序是记录的 RDATA 本身的一部分。 DNS 服务器不应该以任何方式破坏它。
例如,这就是您的示例记录在区域文件中的定义方式:
name IN TXT ("v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCUI5E9hZhMEEgjqF6fHNYYBmAEcF7DN2v/FA6yiY/a3R2L8ebGQjCdP2m3PfqLk8ovVd84eJ"
"FkNuXGEsR0rXEHveOjc161z1tz4TGzPC5pGmjuzlYaibUQAb8T1GLbRse+ZkXhCxudeeRj7NBbCjaH1biClbp4v4/V0PLdugeGQQIDAQAB"
"juzlYaibUQAb8T1GLbRse+ZkXhCxudeeRj7")
...而多个 TXT 记录看起来更像这样:
name IN TXT ("v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCUI5E9hZhMEEgjqF6fHNYYBmAEcF7DN2v/FA6yiY/a3R2L8ebGQjCdP2m3PfqLk8ovVd84eJ"
"FkNuXGEsR0rXEHveOjc161z1tz4TGzPC5pGmjuzlYaibUQAb8T1GLbRse+ZkXhCxudeeRj7NBbCjaH1biClbp4v4/V0PLdugeGQQIDAQAB"
"juzlYaibUQAb8T1GLbRse+ZkXhCxudeeRj7")
name IN TXT "google-site-verification=abcde_xxxxxxxxxxxxx"
name IN TXT "MS=ms1234567"
在后一种情况下,您无法确定返回这三个记录的顺序(v=DKIM1...
、google-site...
和 MS=...
),但它不应该无论如何都有任何意义。
在 dnsjava
的情况下,您应该从 getAnswers
, but for each record you should get its strings (in order) from getStrings
.