DNS协议详解及报文格式分析
https://blog.csdn.net/tianxuhong/article/details/74922454
目錄
- 一. DNS協(xié)議理論知識
- 1.1. 域名結(jié)構(gòu)
- 1.2. 域名服務(wù)器
- 1.3. 域名解析過程
- 二. DNS協(xié)議報文格式
- 2.1 頭部
- 2.2 正文
- 三. Wireshark分析DNS協(xié)議
- 3.1 請求報文
- 3.2 響應(yīng)報文
解BUG的過程中碰到了DNS相關(guān)的內(nèi)容,折騰網(wǎng)站和域名郵箱時也對DNS做了一些配置,發(fā)現(xiàn)對一些細(xì)節(jié)有點記不清晰了,因此很有必要重新溫習(xí)一下這方面的知識。學(xué)過網(wǎng)絡(luò)的應(yīng)該記得現(xiàn)代計算機通信的基石是TCP/IP協(xié)議,計算機A想要與計算機B進行通信,首先就必須要知道計算機B的IP地址,就像打電話一樣,你給別人打電話首先必須得知道別人的電話號碼吧,電話號碼都不知道還搞個毛。但是問題來了,讓人們?nèi)ビ洃涍@又臭又長的IP地址或是電話號碼,無疑是不人道的,當(dāng)然,這個小問題也并莫有難倒勤勞勇敢的人民群眾。很快就發(fā)明了通訊錄這個東西,用于將人名與電話號碼聯(lián)系起來。在計算機領(lǐng)域也出現(xiàn)了DNS(Domain Name System),即域名系統(tǒng),用于將域名解析成對應(yīng)的IP地址。本文將介紹DNS協(xié)議的基本理論及其報文格式,最后給出了用Wireshark抓取DNS報文的記錄。如果需要了解更為詳細(xì)的內(nèi)容,請參考 RFC1034 和 RFC1035。
回到頂部
一. DNS協(xié)議理論知識
1.1. 域名結(jié)構(gòu)
域名系統(tǒng)并不像電話號碼通訊錄那么簡單,通訊錄主要是單個個體在使用,同一個名字出現(xiàn)在不同個體的通訊錄里并不會出現(xiàn)問題,但域名是群體中所有人都在用的,必須要保持唯一性。為了達到唯一性的目的,因特網(wǎng)在命名的時候采用了層次結(jié)構(gòu)的命名方法。每一個域名(本文只討論英文域名)都是一個標(biāo)號序列(labels),用字母(A-Z,a-z,大小寫等價)、數(shù)字(0-9)和連接符(-)組成,標(biāo)號序列總長度不能超過255個字符,它由點號分割成一個個的標(biāo)號(label),每個標(biāo)號應(yīng)該在63個字符之內(nèi),每個標(biāo)號都可以看成一個層次的域名。級別最低的域名寫在左邊,級別最高的域名寫在右邊。域名服務(wù)主要是基于UDP實現(xiàn)的,服務(wù)器的端口號為53。
比如:本網(wǎng)站的域名?jocent.me,由點號分割成了兩個域名jocent?和?me,其中?me是頂級域名(TLD,Top-Level Domain),?jocent是二級域名(SLD,Second Level Domain)。關(guān)于域名的層次結(jié)構(gòu),請看下面的示意圖。
注意:最開始的域名最后都是帶了點號的,比如?jocent.me?擱以前的話應(yīng)該是?jocent.me.?,最后面的點號表示根域名服務(wù)器,后來發(fā)現(xiàn)所有的網(wǎng)址都要加上最后的點,就簡化了寫法,干脆所有的都不加,但是你在網(wǎng)址后面加上點號也是可以正常解析的。
1.2. 域名服務(wù)器
有域名結(jié)構(gòu)還不行,還需要有一個東西去解析域名,手機通訊錄是由通訊錄軟件解析的,域名需要由遍及全世界的域名服務(wù)器去解析,域名服務(wù)器實際上就是裝有域名系統(tǒng)的主機。由高向低進行層次劃分,可分為以下幾大類:
- 根域名服務(wù)器: ? ?最高層次的域名服務(wù)器,也是最重要的域名服務(wù)器,本地域名服務(wù)器如果解析不了域名就會向根域名服務(wù)器求助。全球共有13個不同IP地址的根域名服務(wù)器,它們的名稱用一個英文字母命名,從a一直到m。這些服務(wù)器由各種組織控制,并由 ICANN(互聯(lián)網(wǎng)名稱和數(shù)字地址分配公司)授權(quán),由于每分鐘都要解析的名稱數(shù)量多得令人難以置信,所以實際上每個根服務(wù)器都有鏡像服務(wù)器,每個根服務(wù)器與它的鏡像服務(wù)器共享同一個 IP 地址,中國大陸地區(qū)內(nèi)只有6組根服務(wù)器鏡像(F,I(3臺),J,L)。當(dāng)你對某個根服務(wù)器發(fā)出請求時,請求會被路由到該根服務(wù)器離你最近的鏡像服務(wù)器。所有的根域名服務(wù)器都知道所有的頂級域名服務(wù)器的域名和地址,如果向根服務(wù)器發(fā)出對?“jocent.me”?的請求,則根服務(wù)器是不能在它的記錄文件中找到與?“jocent.me”?匹配的記錄。但是它會找到?“me”?的頂級域名記錄,并把負(fù)責(zé)?“me”?地址的頂級域名服務(wù)器的地址發(fā)回給請求者。
- 頂級域名服務(wù)器:負(fù)責(zé)管理在該頂級域名服務(wù)器下注冊的二級域名。當(dāng)根域名服務(wù)器告訴查詢者頂級域名服務(wù)器地址時,查詢者緊接著就會到頂級域名服務(wù)器進行查詢。比如還是查詢"jocent.me",根域名服務(wù)器已經(jīng)告訴了查詢者“me”頂級域名服務(wù)器的地址,“me”頂級域名服務(wù)器會找到?“jocent.me”的域名服務(wù)器的記錄,域名服務(wù)器檢查其區(qū)域文件,并發(fā)現(xiàn)它有與?“jocent.me”?相關(guān)聯(lián)的區(qū)域文件。在此文件的內(nèi)部,有該主機的記錄。此記錄說明此主機所在的 IP 地址,并向請求者返回最終答案。
- 權(quán)限域名服務(wù)器:負(fù)責(zé)一個區(qū)的域名解析工作
- 本地域名服務(wù)器:當(dāng)一個主機發(fā)出DNS查詢請求的時候,這個查詢請求首先就是發(fā)給本地域名服務(wù)器的。
1.3. 域名解析過程
域名解析總體可分為兩大步驟,第一個步驟是本機向本地域名服務(wù)器發(fā)出一個DNS請求報文,報文里攜帶需要查詢的域名;第二個步驟是本地域名服務(wù)器向本機回應(yīng)一個DNS響應(yīng)報文,里面包含域名對應(yīng)的IP地址。從下面對jocent.me進行域名解析的報文中可明顯看出這兩大步驟。注意:第二大步驟中采用的是迭代查詢,其實是包含了很多小步驟的,詳情見下面的流程分析。
其具體的流程可描述如下:
其中有兩個概念遞歸查詢和迭代查詢,其實在整個描述的過程中已經(jīng)體現(xiàn)的很明顯,這里再說明一下:
- 遞歸查詢:本機向本地域名服務(wù)器發(fā)出一次查詢請求,就靜待最終的結(jié)果。如果本地域名服務(wù)器無法解析,自己會以DNS客戶機的身份向其它域名服務(wù)器查詢,直到得到最終的IP地址告訴本機
- 迭代查詢:本地域名服務(wù)器向根域名服務(wù)器查詢,根域名服務(wù)器告訴它下一步到哪里去查詢,然后它再去查,每次它都是以客戶機的身份去各個服務(wù)器查詢
二. DNS協(xié)議報文格式
2.1 頭部
| QR(1bit) | 查詢/響應(yīng)標(biāo)志,0為查詢,1為響應(yīng) |
| opcode(4bit) | 0表示標(biāo)準(zhǔn)查詢,1表示反向查詢,2表示服務(wù)器狀態(tài)請求 |
| AA(1bit) | 表示授權(quán)回答 |
| TC(1bit) | 表示可截斷的 |
| RD(1bit) | 表示期望遞歸 |
| RA(1bit) | 表示可用遞歸 |
| rcode(4bit) | 表示返回碼,0表示沒有差錯,3表示名字差錯,2表示服務(wù)器錯誤(Server Failure) |
?
2.2 正文
| 類型 | 助記符 | 說明 |
| 1 | A | 由域名獲得IPv4地址 |
| 2 | NS | 查詢域名服務(wù)器 |
| 5 | CNAME | 查詢規(guī)范名稱 |
| 6 | SOA | 開始授權(quán) |
| 11 | WKS | 熟知服務(wù) |
| 12 | PTR | 把IP地址轉(zhuǎn)換成域名 |
| 13 | HINFO | 主機信息 |
| 15 | MX | 郵件交換 |
| 28 | AAAA | 由域名獲得IPv6地址 |
| 252 | AXFR | 傳送整個區(qū)的請求 |
| 255 | ANY | 對所有記錄的請求 |
這里給一個域名,可用來模擬DNS的查詢類型,可以選擇不同的類型,比如A,PTR等玩一下,?https://www.nslookuptool.com/chs/ ??? ??
1.3 查詢類:通常為1,表明是Internet數(shù)據(jù)
該區(qū)域有三個,但格式都是一樣的。這三個區(qū)域分別是:回答區(qū)域,授權(quán)區(qū)域和附加區(qū)域
2.1. 域名(2字節(jié)或不定長):它的格式和Queries區(qū)域的查詢名字字段是一樣的。有一點不同就是,當(dāng)報文中域名重復(fù)出現(xiàn)的時候,該字段使用2個字節(jié)的偏移指針來表示。比如,在資源記錄中,域名通常是查詢問題部分的域名的重復(fù),因此用2字節(jié)的指針來表示,具體格式是最前面的兩個高位是 11,用于識別指針。其余的14位從DNS報文的開始處計數(shù)(從0開始),指出該報文中的相應(yīng)字節(jié)數(shù)。一個典型的例子,C00C(1100000000001100,12正好是頭部的長度,其正好指向Queries區(qū)域的查詢名字字段)。
2.2 查詢類型:表明資源紀(jì)錄的類型,見1.2節(jié)的查詢類型表格所示?
2.3 查詢類:對于Internet信息,總是IN
2.4 生存時間(TTL):以秒為單位,表示的是資源記錄的生命周期,一般用于當(dāng)?shù)刂方馕龀绦蛉〕鲑Y源記錄后決定保存及使用緩存數(shù)據(jù)的時間,它同時也可以表明該資源記錄的穩(wěn)定程度,極為穩(wěn)定的信息會被分配一個很大的值(比如86400,這是一天的秒數(shù))。
2.5. 資源數(shù)據(jù):該字段是一個可變長字段,表示按照查詢段的要求返回的相關(guān)資源記錄的數(shù)據(jù)。可以是Address(表明查詢報文想要的回應(yīng)是一個IP地址)或者CNAME(表明查詢報文想要的回應(yīng)是一個規(guī)范主機名)等。
回到頂部三. Wireshark分析DNS協(xié)議
下面給出wireshark抓包的記錄,感興趣的可以根據(jù)上面介紹的協(xié)議報文格式手動解析一下,相信會有很大收獲。
3.1 請求報文
3.2 響應(yīng)報文
?
DNS相關(guān)的命令小貼士:
- Windows環(huán)境下清空DNS緩存的命令是?ipconfig/flushdns?也可以通過重啟DNS client 和 DHCP client 兩項服務(wù)清空DNS緩存
- Windows環(huán)境下可以用命令?ipconfig /displaydns? 來查看DNS緩存的內(nèi)容
- nslookup?命令可以用來查看域名對應(yīng)的IP地址,比如?nslookup jocent.me
本文撰寫過程中參考了以下幾篇博文的內(nèi)容,現(xiàn)列出鏈接如下:
轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/articles/10660051.html
總結(jié)
以上是生活随笔為你收集整理的DNS协议详解及报文格式分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UNIX 网络协议的深度分析
- 下一篇: 邮件协议(SMTP)性能测试总结(Fox