当前位置: 首页 > 知识库问答 >
问题:

当存在多个NS记录时解析dns响应

萧鹏云
2023-03-14

你好,我正在为学校做一个作业,要求你使用java构建自己的DNS CLient,而不使用任何现有的库。我想出了如何解析响应,但在回答部分中有多条记录时出错。

public void processResponse(DatagramPacket packet) throws IOException{
    DataInputStream din = new DataInputStream(new ByteArrayInputStream(packet.getData()));
    din.readShort(); //Transaction ID
    din.readShort(); //Flags

    int questions = din.readShort();
    int answers = din.readShort();
    int authorities = din.readShort();
    int additional = din.readShort();
    int recLen = 0;
    while ((recLen = din.readByte()) > 0) {
        for (int i = 0; i < recLen; i++) {
            din.readByte();
        }
    }
    din.readShort(); // Record type for question
    din.readShort(); // Class for question

    //ANSWERS
    //Just looping for one answer here
    for(int i=0;i<1;i++){
        din.readShort(); // Record name for Answer
        String response = "";
        int typeOfRec = din.readShort();
        din.readShort(); // Class for answers
        int ttl = din.readInt();
        short resLength = din.readShort();
        switch(typeOfRec){
        //A
        case 1:{
            response+="IP\t";
            String ip = "";
            for (int j = 0; j < resLength; j++ ) {
                ip+=("" + String.format("%d", (din.readByte() & 0xFF)) + ".");
            }

            response+=ip+"\t"+ttl;
            System.out.println(response);
            break;
        }
        //NS
        case 2:{
            String ip = "";
            response+="NS\t";
            while ((recLen = din.readByte()) > 0) {
                byte[] record = new byte[recLen];

                for (int j = 0; j < recLen; j++) {
                    record[j] = din.readByte();
                }

                ip+=new String(record, "UTF-8");
                ip+=".";
            }
            response+=ip+"\t"+ttl;
            System.out.println(response);
            break;
        }
        //CNAME
        case 5:{
            response+="CNAME\t";
            break;
        }
        //MX
        case 15:{
            response+="MX\t";
            break;
        }
        default:{
            break;
        }
        }
    }        
}

这是最终处理响应数据包以获得所需数据的函数。但是,当我运行此代码时,响应仅为NS-358。awsdns-44。86399。com不见了

共有1个答案

奚昌胤
2023-03-14

看起来您需要了解名称是如何以DNS wire格式编码的。特别是它们是如何被压缩的。RFC 1035第4.1.4节将是一个良好的起点。

 类似资料:
  • 我在DNS名称服务器配置和DNS NS记录不一致方面遇到一些问题。 例如域名zzpeter。nl: 当执行是dns1。下一步。nl和dns2。下一步。净 但是在执行它返回ns1。未开发。com和ns2。未开发。通用域名格式。 当执行时,您可以真正看到发生了什么: 我可以从dig跟踪调用中获取已配置的名称服务器,并将其作为人工进行处理,但是是否也有一种方法可以以编程方式检索在注册器中配置的名称服务器

  • 根据AWS文档,路由53应该是权威名称服务器。如果example.com是我购买的域名,并且我www.example.com指向IP192.0.2.4,那么顶级域名服务器(“. com”的NS)将存储权威域名之间的映射域名example.com和域名example.com的名称服务器(ANS)如下所示: example.com.172800 IN NSns1.awsdns.com 所以,这是NS记

  • 相当意外的是,我在谷歌搜索中似乎找不到这个问题的答案。 SRV记录集中有多少记录太多? 10,50 100? 如果我想提供一个在同一物理位置的50台服务器之间保持平衡的单一主机名,如何做到最好? 如何将其扩展到100台服务器?

  • 我最近更改了DNS提供商,我正在尝试将DNS记录添加到我的新提供商。但是,我不确定应该添加多少记录。 我的旧名称服务器有一大堆自动创建的记录,如“ftp.example.com”、“cpanel.example.com”、“carddavs.\u tcp.example.com”、“webdisk.example.com”、“autodiscover.example.com”等。 所以我的问题是,

  • 我试图保存多个记录通过 但是从上面来看,只创建了第一个数组。我哪里做错了?感谢您的帮助。

  • 我正在构建一个自定义DNS服务器,除其他外,它提供记录以及相关的和记录。我可以验证直接查询服务器是否返回预期的答案: 然而,当通过我的ISPs解析器(或任何公共解析器,如谷歌的8.8.8.8)查询时,我得到的答案是空的: 查询立即返回,我可以看到我的服务器接收到一个传入查询,但它是空的。解析程序剥离和其他答案是已知的行为吗?如果是这种情况,为什么查询被转发到我的服务器?或者是错误在我这边,服务器只