1、前言
foxmail新版中有1個《郵件特快專遞》的功能。起先弄不懂如何用,后來知道要在 工具->系統選項 那邊設置 本地DNShttp://www.vxbq.cn/server/的IP地址。
覺得這個新功能蠻好用的。不需要通過SMTP代理,可以直接通過本地往郵箱所在的郵件交換器發送郵件。在暑假1開始想在VC++中實現這個功能。用IRIS截包后,發現程序后mx8.263.net發送郵箱,不知道這個是甚么東西所以作罷。 后來才想到這個就是263.net的MX記錄主機,原來特快專遞的原理就是往這個主機上發送數據就行。
運行nslookup程序:
set type=mx
263.net
有了,有了,得到結果:
Non-authoritative answer:
263.net MX preference = 10, mail exchanger = mx06.263.net
263.net MX preference = 10, mail exchanger = mx08.263.net
263.net MX preference = 10, mail exchanger = mx09.263.net
263.net MX preference = 10, mail exchanger = mx11.263.net
263.net MX preference = 10, mail exchanger = mx12.263.net
263.net MX preference = 40, mail exchanger = mx03.263.net
263.net MX preference = 10, mail exchanger = mx01.263.net
沒有錯了。就是這個了。后來由于不知道怎樣實現nslookup的功能,就放棄了,學了半個多月的C#。后來偶然在網上查找到了1些相干的文檔。幾次實驗。把我的開發進程拿過來分享,我第1次寫教程性文檔。所以不規范的地方,請大家包涵。本文觸及的域名、郵箱及IP均為真實的。
2、DNS協議原理
我認為,要想成為1個好的網絡軟件http://www.vxbq.cn,必須得讀懂RFC文檔。由于本文是面向大多廣泛程序愛好者,所以我盡可能從細節上寫,如果高手的話,可以跳過此部份。
DNS協議的相干RFC文檔:
RFC1034-《DOMAIN NAMES - CONCEPTS AND FACILITIES》
RFC1035-《DOMAIN NAMES - IMPLEMENTATION AND SPECIFICATION》
網上的計算機用形如 220.162.75.1 這樣稱為IP地址的數字串來標識1臺計算機。而如果每次訪問1臺計算機都是通過輸入這樣的東東來訪問,那不就太可怕了?以是出了DNS這樣的好東東,用要唆使其綁定的IP地址,當我們在閱讀器內輸入 http://zzsy.com 時,閱讀器不知道網頁該到哪里取,因而就向設定好的DNShttp://www.vxbq.cn/server/查詢zzsy.com這個域名。DNShttp://www.vxbq.cn/server/會先尋覓自己的記錄庫,如果沒有發現就轉向上1級DNShttp://www.vxbq.cn/server/進行查詢(轉發要求)。把找到后的IP告知你的閱讀器。這里邊閱讀器查詢的記錄類型是A記錄。RFC1035文檔第11頁中定義有16種記錄類型,而常見的有A(地址)記錄、CNAME(別名)記錄、MX(郵件交換)記錄。我們本篇要關心的是MX記錄。
查詢的進程1般是:客戶向DNShttp://www.vxbq.cn/server/的53端口發送UDP報文,DNShttp://www.vxbq.cn/server/收到落后行處理,并把結果記錄仍以UDP報文的情勢返回過來。
此UDP報文的1般格式:
+---------------------+
| 報文頭 |
+---------------------+
| 問題 | 向http://www.vxbq.cn/server/提出的查詢部份
+---------------------+
| 回答 | http://www.vxbq.cn/server/回復的資源記錄
+---------------------+
| 授權 | 權威的資源記錄
+---------------------+
| 格外的 | 格外的資源記錄
+---------------------+
除報文頭是固定的12字節外,其他每部份的長度均為不定字節數。
我們在這邊關心的是報文頭、問題、回答這3個部份。
其中報文頭的格式:
1 1 1 1 1 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ID |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|QR| Opcode |AA|TC|RD|RA| Z | RCODE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QDCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ANCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| NSCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ARCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
好家伙,是甚么鬼畫符!
其中最上邊是位的數字標識,0⑴5(注意,后邊的10⑴5寫成上下的情勢了,1開始我楞沒看懂)。
接下來是:
ID:占16位,2個字節。此報文的編號,由客戶端指定。DNS回復時帶上此標識,以唆使處理的對應請應要求。
QR:占1位,1/8字節。0代表查詢,1代表DNS回復
Opcode:占4位,1/2字節。唆使查詢種類:0:標準查詢;1:反向查詢;2:http://www.vxbq.cn/server/狀態查詢;3⑴5:未使用。
AA:占1位,1/8字節。是不是權威回復。
TC:占1位,1/8字節。由于1個UDP報文為512字節,所以該位唆使是不是截掉超過的部份。
RD:占1位,1/8字節。此位在查詢中指定,回復時相同。設置為1唆使http://www.vxbq.cn/server/進行遞歸查詢。
RA:占1位,1/8字節。由DNS回復返回指定,說明DNShttp://www.vxbq.cn/server/是不是支持遞歸查詢。
Z:占3位,3/8字節。保存字段,必須設置為0。
RCODE:占4位,1/2字節。由回復時指定的返回碼:0:無過失;1:格式錯;2:DNS出錯;3:域名不存在;4:DNS不支持這類查詢;5:DNS謝絕查詢;6⑴5:保存字段。
QDCOUNT:占16位,2字節。1個無符號數唆使查詢記錄的個數。
ANCOUNT:占16位,2字節。1個無符號數指明回復記錄的個數。
NSCOUNT:占16位,2字節。1個無符號數指明權威記錄的個數。
ARCOUNT:占16位,2字節。1個無符號數指明格外記錄的個數。
其中每一個查詢的資源記錄格式:
1 1 1 1 1 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| |
/ QNAME /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QTYPE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QCLASS |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
QNAME:不定長,表示要查詢的域名。(兩邊的方框用 / 來表示不定長)
QTYPE:2字節,根據RFC1035及nslookup的幫助文檔,我定義以下枚舉類型:
enum QueryType //查詢的資源記錄類型。
{
A=0x01, //指定計算機 IP 地址。
NS=0x02, //指定用于命名區域的 DNS 名稱http://www.vxbq.cn/server/。
MD=0x03, //指定郵件接收站(此類型已過時了,使用MX代替)
MF=0x04, //指定郵件中轉站(此類型已過時了,使用MX代替)
CNAME=0x05, //指定用于別名的規范名稱。
SOA=0x06, //指定用于 DNS 區域的“起始授權機構”。
MB=0x07, //指定郵箱域名。
MG=0x08, //指定郵件組成員。
MR=0x09, //指定郵件重命名域名。
NULL=0x0A, //指定空的資源記錄
WKS=0x0B, //描寫已知服務。
PTR=0x0C, //如果查詢是 IP 地址,則指定計算機名;否則指定指向其它信息的指針。
HINFO=0x0D, //指定計算機 CPU 和操作系統類型。
MINFO=0x0E, //指定郵箱或郵件列表信息。
MX=0x0F, //指定郵件交換器。
TXT=0x10, //指定文本信息。
AAAA=0x1c,//IPV6資源記錄。
UINFO=0x64, //指定用戶信息。
UID=0x65, //指定用戶標識符。
GID=0x66, //指定組名的組標識符。
ANY=0xFF //指定所有數據類型。
};
QTYPE:2字節。 根據RFC1035及nslookup的幫助文檔,我定義以下枚舉類型:
enum QueryClass //指定信息的協議組。
{
IN=0x01, //指定 Internet 種別。
CSNET=0x02, //指定 CSNET 種別。(已過時)
CHAOS=0x03, //指定 Chaos 種別。
HESIOD=0x04,//指定 MIT Athena Hesiod 種別。
ANY=0xFF //指定任何之前列出的通配符。
};
QTYPE中的A,MX,CNAME為經常使用,QCLASS中的IN為經常使用。
其中每一個回復的記錄格式:
1 1 1 1 1 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| |
/ /
/ NAME /
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| TYPE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| CLASS |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| TTL |
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| RDLENGTH |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
/ RDATA /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
NAME:回復查詢的域名,不定長。
TYPE:回復的類型。2字節,與查詢同義。唆使RDATA中的資源記錄類型。
CLASS:回復的類。2字節,與查詢同義。唆使RDATA中的資源記錄類。
TTL:生存時間。4字節,唆使RDATA中的資源記錄在緩存的生存時間。
RDLENGTH:長度。2字節,唆使RDATA塊的長度。
RDATA:資源記錄。不定義,依TYPE的不同,此記錄的格示不同,通常1個MX記錄是由1個2字節的唆使該郵件交換器的優先級值及不定長的郵件交換器名組成的。
這邊陳述1下名稱的組合情勢。名稱由多個標識序列組成,每個標識序列的首字節說明該標識符的長度,接著用是ASCII碼表示字符,多個序列以后由字節0表示名字結束。其中某1個標識序列的首字符的長度若是0xC0的話,表示下1字節唆使不是標識符序列,而是唆使接下部份在本接收包內的偏移位置。
比如 bbs.zzsy.com 以.分開bbs、zzsy、com3個部份。每一個部份的長度為3、4、3
在DNS報文中的情勢就如 3 b b s 4 z z s y 3 c o m 0
假設在包內的第12個字節位置存在有 4 z z s y 3 c o m 0 這樣的名稱了。
那此時有可能為:3 b b s 4 z z s y 0xC0 0x0C 這樣的情勢。
3、DNS協議實例講授
說了這么多理論屁話,可能頭都有兩個大了吧。還是用1個實例的方法來講明吧。
我選用著名的網絡截包及協議分析工具IRIS 4.05,您可以從我的站點上下載:
http://itboy.cn/data/Iris405Full.rar
運行Iris,點擊菜單的Filters 選 Port標簽頁 應用 53 端口后點肯定。
點擊Iris工具欄上的綠色運行圖標進行監聽。
在windows中運行nslookup程序。
輸入以下命令:
set type=mx
然后返回nslookup程序。
再輸入命令:
yahoo.com.cn
會得到
yahoo.com.cn MX preference = 20, mail exchanger = mx5.mail.yahoo.com
yahoo.com.cn MX preference = 10, mail exchanger = mta-v1.mail.
=====================================================================
DNS報文格式:
該報文由12字節的首部和4個長度可變的字段組成。
標識字段由客戶程序設置并有http://www.vxbq.cn/server/返回結果。
16bit的標志字段 以下:
QR:0表示查詢報文,1表示響應報文
Opcode:通常值為0(標準查詢),其他值為1(反向查詢)和2(http://www.vxbq.cn/server/狀態要求)。
AA:表示授權回答(authoritative answer).
TC:表示可截斷的(truncated)
RD:表示期望遞歸
RA:表示可用遞歸
隨后3bit必須為0
Rcode:返回碼,通常為0(沒有過失)和3(名字過失)
后面4個16bit字段說明最后4個變長字段中包括的條目數。
問題部份:
報文格式:
查詢名為要查找的名字,它由1個或多個標示符序列組成。每一個標示符已首字節數的計數值來講明該標示符長度,每一個名字以0結束。計數字節數必須是0~63之間。該字段無需填充字節。如:gemini.tuc.noao.edu
每一個問題有1個查詢類型,通常查詢類型為A(由名字取得IP地址)或PTR(取得IP地址對應的域名)
資源記錄部份:
報文格式:
DNS最后3個字段,回答字段,授權字段和附加信息字段均采取資源記錄RR(Resource Record)的相同格式。
域名是記錄中資源數據對應的名字。它的格式和查詢名字段格式相同。
類型說明R R的類型碼。類通常為1,指I n t e r n e t數據。
生存時間字段是客戶程序保存該資源記錄的秒數。
資源數據長度說明資源數據的數量。該數據的格式依賴于類型字段的值。對類型1(A記錄)資源數據是4字節的I P地址。
數據包DNS 查詢:(DNS query)
0000 00 19 56 6e 19 bf 00 17 a4 1a b2 e0 08 00 45 00 ..Vn.... ......E.
0010 00 3b ed c6 00 00 80 11 e3 c3 ac 15 0f 04 ac 15 .;...... ........
0020 01 f9 04 a9 00 35 00 27 2f bd 3e 3a 01 00 00 01 .....5.' /.>:....
0030 00 00 00 00 00 00 03 77 77 77 06 67 6f 6f 67 6c .......w ww.googl
0040 65 02 63 6e 00 00 01 00 01 e.cn.... .
說明:
前面3段分別為以太網包頭,ip包頭和UDP包頭。
從0020行后面開始為DNS數據包.
3e 3a 為標識字段
01 00 為標志字段,該字段設置了TC表示該報文是可截斷的。
00 01 查詢報文數量為1。
00 00 00 00 00 00 表示回答,授權和額外信息都為0。
03 77 77 77 06 67 6f 6f 67 6c 65 02 63 6e 00 表示查詢的名字為
www.google.com
00 01 為類型,1表示A查詢
00 01 為類,1表示Internet數據。
數據包 DNS response (DNS response)
0000 00 17 a4 1a b2 e0 00 19 56 6e 19 bf 08 00 45 00 ........ Vn....E.
0010 00 78 48 af 00 00 7d 11 8b 9e ac 15 01 f9 ac 15 .xH...}. ........
0020 0f 04 00 35 04 a9 00 64 75 db 3e 3a 81 80 00 01 ...5...d u.>:....
0030 00 03 00 00 00 00 03 77 77 77 06 67 6f 6f 67 6c .......w ww.googl
0040 65 02 63 6e 00 00 01 00 01 c0 0c 00 05 00 01 00 e.cn.... ........
0050 00 05 42 00 11 02 63 6e 01 6c 06 67 6f 6f 67 6c ..B...cn .l.googl
0060 65 03 63 6f 6d 00 c0 2b 00 01 00 01 00 00 00 5f e.com..+ ......._
0070 00 04 cb d0 21 65 c0 2b 00 01 00 01 00 00 00 5f ....!e.+ ......._
0080 00 04 cb d0 21 64 ....!d
說明:
前面3段分別為以太網包頭,ip包頭和UDP包頭。
3e 3a 為標識字段
81 80 為標志字段,其中設置了QR = 1,RD = 1,RA = 1
00 01 問題數1,00 03 回答數3,其余兩個為0。
03 77 77 77 06 67 6f 6f 67 6c 65 02 63 6e 00 表示查詢的名字為
www.google.com
00 01 為類型,1表示A查詢
00 01 為類,1表示Internet數據。
接下來為回答報文,
c0 0c 為域名指針
00 05 表示CNAME(規范名稱)
00 01 類,表示為Internet數據
00 00 05 42 生存時間
00 11 數據長度
02 63 6e 01 6c 06 67 6f 6f 67 6c 65 03 63 6f 6d 00 為數據 cn.l.google.cn
然后接下來兩段為另外兩個回答。
最后的數據為IP地址
轉自:http://blog.chinaunix.net/uid⑴2077794-id⑼1657.html
上一篇 Android源碼之高仿愛奇藝
下一篇 遠程centos修改yum源