DNS客户端无法正确解析NS查询

时间:2017-06-18 18:08:45

标签: java dns

我被分配了一个关于用Java编写迭代DNS客户端的项目,该客户端可以在A,NS和MX寄存器中执行查询,我们获得了一个API来处理我们的DNS数据包所以我们只需要关注程序的迭代性质加上它的逻辑

我的问题发生在我尝试执行NS查询时,我可以完全正常从根服务器到权威的一个并获得答案数据包,但是当我在终端中显示它时会发生这种情况(我只显示最后一个查询): terminal output

我不知道为什么会这样,但是检查wireshark,数据包看起来很好,数据包的解析是在他们的API中完成的,但我的教授拒绝帮助我,我在这里提供一些代码: 我的代码(我在哪里显示答案)

    if (!answers.isEmpty()) {

            for (int i = 0; i < answers.size(); i++) {

                NSResourceRecord nsRec = new NSResourceRecord(answers.get(i).getDomain(), answers.get(i).getTTL(),
                        new DomainName(answers.get(i).getRRData(), msg_in.toByteArray()));  // <-- The problem is here

                 System.out.println("A: " + serverDNS + " " + RRType.NS +
                 " " + nsRec.getTTL() + " "
                 + nsRec.getNS());
            }

API的解析部分:

 public DomainName(byte[] domain, byte[] message) {
    fromByteArray(domain, message);
}

@Override
public String toString() {
    String res = "";

    return labels.stream().map((label) -> label + '.').reduce(res, String::concat);        
}

private void fromByteArray(final byte[] domain, final byte[] message) {
    int i = 0;
    while (i < domain.length) {
        int size = (domain[i++] & 0xff);
        if (size == 0) {
            break;
        }

        if ((size & 0xc0) == 0xc0) { // Pointer
            int offset = (domain[i++] & 0xff) + ((size & 0x3f) << 8);
            setEncodedLength(i);

            fromByteArray(Arrays.copyOfRange(message, offset, message.length), message);

            return;
        }

        String label = new String(Arrays.copyOfRange(domain, i, i + size), ASCII);
        i += size;
        labels.add(label);
    }

    setEncodedLength(i);
}

另一件事:在某些服务器(例如NS google.com)中工作得非常好,在其他服务器中只有一些时间 谢谢你的帮助!

0 个答案:

没有答案