分享
 
 
 

Dns解析(下)

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

Dns解析(下)

上篇讲述了Dns的查询包和发送,本文将分析Dns的返回包。

下面这段程序是从Dns服务器上得到dns的返回包:

ID_Packet=new DatagramPacket(new byte[Constant.DNSUDPLEN],

Constant.DNSUDPLEN);

ID_Socket.receive(ID_Packet);

这里的变量已在上篇中定义了,Constant.DNSUDPLEN为512。

接下来就只要将这数据解压缩就可以了。这里就涉及了RR的格式了(Resource Record Format)。

0 1 2 3 4 5 6 7 8 9 A B C D E F

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

| |

/ /

/ NAME /

| |

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

| TYPE |

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

| CLASS |

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

| TTL |

| |

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

| RDLENGTH |

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|

/ RDATA /

/ /

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

这是在rfc文档中定义的RR格式。

NAME:就是在question中的QNAME;

TYPE:question中的QTYPE;

CLASS:question中的QCLASS;

RDLENGTH:RDATA的长度;

RDATA:返回的数据,这才是真正有用的数据,也是我们要解析的东西。

因为其数据是被压缩的,所以得想知道他的压缩格式:

0 1 2 3 4 5 6 7 8 9 A B C D E F

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

| 1 1| OFFSET |

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

他的压缩方式是将在数据中重复出现的字符放在一起,然后再字符出现的地方加上一个偏移位置,即如上图所示,16位的数据以11开头,后跟偏移量。偏移量是从信息的头部开始算得。下面是一个rfc文档中的例子:

0 1 2 3 4 5 6 7 8 9 A B C D E F

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

20 | 1 | F |

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

22 | 3 | I |

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

24 | S | I |

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

26 | 4 | A |

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

28 | R | P |

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

30 | A | 0 |

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

40 | 3 | F |

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

42 | O | O |

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

44 | 1 1| 20 |

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

这个结果是:在40位置的域名是FOO.F.ISI.ARPA。

了解了他的压缩方式,解析就简单了。

上篇中在Header中我们已提到ANCOUNT这个字段,他表示的是回复中结果的数目,我们相见他解析出来:

public int getAnswerCount()

{

int INDEX=6;

byte[] AnCountArray=new byte[2];

System.arraycopy(message,INDEX,AnCountArray,0,2);

return DnsTool.BytesToInt(AnCountArray);//将byte[]变为int

}

得到了ANCOUNT,就可以解释结果了:

public Vector parseAnswer()

{

int theOffset=8;

int pos=thePosOfAnswer;(thePosOfAnswer是你发得dns包的长度)

int i=0,p;

int RDlength;

byte[] tmp;

String Name="";

Vector IV_ Answer=new Vector();

//get return name from message

while(i<getAnswerCount())

{

Name="";

//get type

pos+=2;

tmp=new byte[2];

System.arraycopy(message,pos,tmp,0,2);

if(DnsTool.BytesToInt(tmp)==Constant.TYPE_MX)//check the type

{

pos+=theOffset;

//get RDlength

tmp=new byte[2];

System.arraycopy(message,pos,tmp,0,2);

RDlength=DnsTool.BytesToInt(tmp);

pos+=4;

p=pos;

while((pos-p)<RDlength-2)

{

if((message[pos]&0xC0)==0xC0)

{

//this is a offset

Name+=getPrior((message[pos]&0x3F)

|(message[pos+1]&0xFF));

pos+=2;

}

else

{

//not offset

tmp=new byte[message[pos]];

System.arraycopy(message,pos+1,tmp,0,tmp.length);

pos+=message[pos]+1;

if(message[pos]!=0)

Name+=new String(tmp)+".";

else

Name+=new String(tmp);

}

}

}

IV_Answer.addElement(Name);

i++;

}

}

函数Stirng getPrior(int)是根据其偏移量等到所要的字符串,这是一个递归函数:

private String getPrior(int j)

{

byte[] tmp;

String Name="";

while(message[j]!=0)

{

if((message[j]&0xC0)==0xC0)

{

String mid=getPrior((message[j]&0x3F)|(message[j+1]&0xFF));

Name+=mid;

j+=mid.length()+1;

}

else

{

tmp=new byte[message[j]];

System.arraycopy(message,j+1,tmp,0,tmp.length);

j+=message[j]+1;

if(message[j]!=0)

Name+=new String(tmp)+".";

else

Name+=new String(tmp);

}

}

return Name;

}

我们只介绍了mail地址的dns解析,其他几类都大同小异,如需要可参考rfc1035。

文章不免有错,请各位多指点craks@263.net

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有