Dns解析(上) (轉)
解析(上)
Dns(ain Name Server)即域名,在中承擔著將域名轉換為的工作。在很多中都要用到這種技術,就是使用域名解析。這篇文章將說明這項技術。
透過Dns伺服器,可以查詢很多地址,比如伺服器地址,伺服器等等,我在這裡就以mail伺服器為例,並以實現。
+---------------------+:namespace prefix = o ns = "urn:schemas--com::office" />
| Header |
+---------------------+
| Question |
+---------------------+
| Answer |
+---------------------+
| Authority |
+---------------------+
| Additional |
+---------------------+
這個表是從1035文件中拷出來的,大致說明了dns包的格式。
Header
0 1 2 3 4 5 6 7 8 9 A B C D E F
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ID |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|QR| Opcode |AA|TC|RD|RA| Z | RCODE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QDCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ANCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| NUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ARCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
這個也是從rfc文件中拷出來的,只是我將其頭部數字改成16進位制了。
ID: 16位的一個標誌,用以驗證請求和回覆訊息的匹配。就實用產生一個16位的隨機數。
QR: 1位資料表明這是一個請求,還是一個回覆(0為請求,1為恢復)。
Opcode: 4位的資料表示查詢的型別。
0 基本查詢
1 反向查詢
2 查詢伺服器情況
3-15 保留
RD:(recursion desired)即是否以遞迴方式的查詢,RD=1為遞迴。
RA:(Recursion Available)表示伺服器是否支援遞迴方式查詢,只在回覆中有效。
QDCOUNT:16位資料表示要查詢的問題個數。
ANCOUNT:16位資料表示回覆結果的個數,只在回覆中有效。
其他幾個請參考rfc文件,在這裡我們只用這些,並將其他引數設為0。
Question
0 1 2 3 4 5 6 7 8 9 A B C D E F
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| |
/ QNAME /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QTYPE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QCLASS |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
QNAME: 要求查詢的域名地址地址XXX@163">。比如有這樣一個郵件地址XXX@163.net,
我們將@後面的地址提取出來,即163.net。然後將其變為這樣一個序列,31633net0,也就是以 . 分界,並以各自的字元個數作為字首,最後以0結束
QTYPE: 2位資料表示查詢型別。
A 1 a host address
NS 2 an authoritative name server
MD 3 a mail destination (Obsolete - use MX)
MF 4 a mail forwarder (Obsolete - use MX)
CNAME 5 the canonical name for an alias
6 marks the start of a zone of authority
MB 7 a mailbox domain name (EXPERIMENTAL
MG 8 a mail group member (EXPERIMENTAL)
MR 9 a mail rename domain name (EXPERIMENTAL)
NULL 10 a null RR (EXPERIMENTAL)
WKS 11 a well known service description
PTR 12 a domain name pointer
HINFO 13 host information
MINFO 14 mailbox or mail list information
MX 15 mail
TXT 16 text strings
這是在rfc文件中列出的各類type,我們在這裡用MX,即QTYPE=15。
QCLASS: 2位資料表示查詢方式。
IN 1 the Internet
CS 2 the CSNET class (Obsolete - used only for examples in some obsolete RFCs)
CH 3 the CHAclass
HS 4 Hesiod [Dyer 87]
這是在rfc文件中列出的各類class,我們在這裡用IN,即QCLASS=15。
下面使用JAVA實現的原碼:
說明:DnsTool.IntToBytes(int,int)是將一個整數轉換為幾個8位數的組合。
DnsTool.StringToBytes(String)是將一個字串轉換為QNAME需要的格式,並以BYTE[]的格式返回。
class DnsHeader {
private int ID;
private int Flags=0;
private byte[] head=new byte[]{0,0,0,0,0,0,0,0,0,0,0,0};
/** Creates new DnsHeader */
public DnsHeader()
{
setID();
setFlags(Flags);
setAnswer(false);//does not an answer
setRecursionDesired(true);
}
private void setID()
{
byte[] tmp=new byte[2];
ID=new Random().nextInt(10);
tmp=DnsTool.IntToBytes(ID,2);
head[0]=tmp[0];
head[1]=tmp[1];
}
public int getID()
{
return this.ID;
}
private void setFlags(int Flags)
{
byte[] tmp=new byte[2];
tmp=DnsTool.IntToBytes(ID,2);
head[2]=tmp[0];
head[3]=tmp[1];
}
public void setAnswer(boolean isAnswer)
{
head[2]=isAnswer?(byte)(head[2]|0x80):(byte)
(head[2]&0x7f);
}
public void setRecursionDesired(boolean isRecursionDesired)
{
head[2]=isRecursionDesired?((byte)(head[2]|0x1))
:((byte)(head[2] & 0xFE));
}
public void setQDcount(int num)//set the number of question
{
byte[] tmp=new byte[2];
tmp=DnsTool.IntToBytes(num,2);
head[4]=tmp[0];
head[5]=tmp[1];
}
public byte[] getBytes()
{
return head;
}
}
class Question {
private byte[] question;
private int QuestionLength;
/** Creates new Question */
public Question(String questionLabel,int questionType,
int questionClass)
{
byte[] transName=DnsTool.StringToBytes(questionLabel);
byte[] ty=DnsTool.IntToBytes(questionType,2);
byte[] cl=DnsTool.IntToBytes(questionClass,2);
QuestionLength=0;
//traner the QuestionLabel to the bytes
question=new byte[transName.length+4];
System.arraycopy(transName,0,question,QuestionLength,
transName.length);
QuestionLength+=transName.length;
//transfer the type to the bytes
System.arraycopy(ty,0,question,QuestionLength,
ty.length);
QuestionLength+=ty.length;
//transfer the class to the bytes
System.arraycopy(cl,0,question,QuestionLength,
cl.length);
QuestionLength+=cl.length;
}
public byte[] getBytes()
{
return question;
}
}
這裡實現了dns 的包頭和要查詢的question的資料,然後只要將它們組合在一起就成了dns包了,接下來就只要將它發出去就可以了,下面這段程式就實現了這一功能。
說明:
DNSSERVER:就是dns伺服器的地址。
DNSPORT:dns伺服器的埠,即53。
DnsQuery:這個是header 和 question 組合的資料。
DatagramPacket ID_Packet;
DatagramSocket ID_Socket;
byte[] query=DnsQuery.getBytes();
int i;
try
{
ID_Packet=new DatagramPacket(query,query.length,InetAddress.getByName
(DNSSERVER),Constant.DNSPORT);
ID_Socket=new DatagramSocket();
//send query
ID_Socket.send(ID_Packet);
//close socket
ID_Socket.close();
}
catch(IOException e)
{
System.out.println(e);
return null;
}
}
這裡只講了Dns的查詢包,下篇將講述Dns的返回包。
文章不免有錯,請各位多指點craks@263.net
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991747/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Dns解析(下) (轉)DNS
- 轉:DNS解析過程詳解DNS
- Redhat9上配置DNS(轉)RedhatDNS
- 什麼是DNS解析?如何提升DNS解析安全?DNS
- DNS解析流程DNS
- DNS解析原理DNS
- 詳解 DNS 解析DNS
- DNS域名解析DNS
- 玩轉“網路上的芳鄰”之DNS解析(二)DNS
- DNS解析為什麼不生效?DNS解析不生效原因分析DNS
- 如何判斷DNS解析故障?如何解決DNS解析錯誤?DNS
- DNS.com和DNS盾免費DNS解析、DNSPOD阿里公共DNS等DNS阿里
- DNS分層結構及DNS解析流程DNS
- 雲解析DNS有必要買嗎?雲解析DNS有什麼用?DNS
- DNS隧道技術解析DNS
- iOS 本地DNS解析方法iOSDNS
- DNS解析過程原理DNS
- 【中科三方】什麼是雲解析DNS?雲解析DNS有必要購買嗎?如何購買雲解析DNS?DNS
- 雲解析DNS如何實現智慧解析?DNS
- 解析最快的dns 最快最穩定的dnsDNS
- 什麼是DNS解析?DNS解析的過程是什麼樣的?DNS
- DNS解析是什麼?DNS解析在網路通訊中作用有哪些?DNS
- DNS直接解析域名與泛域名解析DNS
- Grafana展示DNS解析延時GrafanaDNS
- DNS域名解析過程DNS
- DNS域名解析服務DNS
- dns解析失敗無法瀏覽器上網解決辦法DNS瀏覽器
- 國內DNS最快的伺服器 解析最快的dnsDNS伺服器
- DNS (域名解析伺服器), DNS子域授權DNS伺服器
- dns解析狀態異常怎麼處理 dns解析異常怎麼修復DNS
- 【中科三方】什麼是雲解析DNS?雲解析DNS有必要購買嗎?DNS
- 雲解析DNS是什麼意思?雲解析DNS有什麼用?(中科三方)DNS
- DNS 解析除錯(dig & nslookup)DNS除錯
- 簡單理解DNS解析流程(一)DNS
- DNS的原理和解析過程DNS
- 超詳細 DNS 協議解析DNS協議
- 淺談智慧DNS雲解析(一)DNS
- 淺談智慧DNS雲解析(二)DNS