通过Wireshark抓包分析谈谈DNS域名解析的那些事儿
本文主要想通過動(dòng)手實(shí)際分析一下是如何通過DNS服務(wù)器來解析域名獲取對應(yīng)IP地址的,畢竟,紙上得來終覺淺,絕知此事要躬行。
域名與IP地址
當(dāng)在瀏覽器上敲下“www.baidu.com”時(shí),一鍵回車,很快,瀏覽器上就會(huì)刷新出熟悉的百度搜索頁面。以前剛接觸網(wǎng)絡(luò)時(shí),總以為這個(gè)過程是通過域名www.baidu.com來訪問遠(yuǎn)程服務(wù)器,其實(shí)不然,本質(zhì)上,還是通過IP去遠(yuǎn)程訪問服務(wù)器獲取資源。
這時(shí),聰明的小伙伴就會(huì)出現(xiàn)一個(gè)疑問,為啥不直接通過域名去尋找到相應(yīng)的服務(wù)器主機(jī)呢?
其實(shí),若要實(shí)現(xiàn)通過域名的方式去尋找服務(wù)器主機(jī),也不是不行,但沒這個(gè)必要。
先來對比一下域名方式與IP地址方式兩者的最關(guān)鍵差異在哪里,就知道為啥沒這個(gè)必要了。
我們?nèi)粘9ぷ鹘佑|的IPv4地址一般都是以十進(jìn)制的方式表示,例如,192.168.200.111,但在計(jì)算機(jī)當(dāng)中,它其實(shí)是以二進(jìn)制形式存在,192.168.200.111的二進(jìn)制為1100 0000 1010 1000 1100 1000 0110 1111,總共32位,也就是32比特。眾所周知,1個(gè)字節(jié)占了8比特,那么就意味著,一個(gè)32比特的IP地址長度也就4個(gè)字節(jié)。
在網(wǎng)絡(luò)傳輸過程中,4個(gè)字節(jié)的長度,可以說,微不足道,但,若換成域名呢?
目前,域名最大長度可達(dá):63個(gè)字符,每個(gè)char字符就占了2字節(jié),63字符占了126字節(jié),可見,若要用域名當(dāng)成傳輸?shù)牡刂?#xff0c;是多么耗性能,但若用IP地址就不一樣了,32位也就只占4字節(jié)。
事實(shí)上,在瀏覽器上通過IP同樣可以訪問到對應(yīng)域名的網(wǎng)址,但I(xiàn)P地址是一長串?dāng)?shù)字,難以記住,更難以理解這一堆數(shù)字代表了啥,但域名就不一樣了,像百度的域名www.baidu.com,很直觀就知道,這是訪問百度的網(wǎng)址。
按照百度百科的說法,設(shè)計(jì)域名的作用,就是為了讓用戶更好理解。
當(dāng)在瀏覽器上敲下“www.baidu.com”,在這個(gè)過程當(dāng)中,會(huì)做一步域名解析成IP地址的操作,這里就涉及到一個(gè)叫做DNS的概念。DNS,全稱Domain Name System,即域名系統(tǒng),它提供的作用是將域名和IP地址相互映射。最通俗的理解,它就像是Java里key-value形式的Map,key是域名,value是對應(yīng)映射的IP地址,通過map.get(域名),可得到域名對應(yīng)的IP地址。
這里值得多提一點(diǎn)是,與DNS相反的另一個(gè)相似概念,是ARP(Address Resolution Protocol,地址解析協(xié)議),它是根據(jù)已知的IP地址,可獲得MAC地址,當(dāng)然,MAC這塊已是數(shù)據(jù)鏈路層的知識(shí),DNS則是應(yīng)用層的東西了。
域名解析IP的步驟
域名解析出其映射的IP地址,主要有以下幾個(gè)步驟:
首先,會(huì)根據(jù)域名從瀏覽器緩存當(dāng)中獲取,若能獲取到,直接返回對應(yīng)的IP地址;若獲取失敗,會(huì)嘗試獲取操作系統(tǒng)本地的域名解析系統(tǒng),即在hosts文件檢查是否有對應(yīng)的域名映射,若能找到,直接獲取其映射的IP地址返回。其中,關(guān)于這一步,作為程序員,可能多少都做過相關(guān)操作。例如,網(wǎng)上有一些關(guān)于Windows系統(tǒng)如何加快訪問Github網(wǎng)站的教程,其中有一個(gè)方式,就是將Github的域名與對應(yīng)的IP地址,添加到Windows的C:\Windows\System32\drivers\etc\hosts文件當(dāng)中,隨后再瀏覽Github,發(fā)現(xiàn)速度確實(shí)快了不少。這是因?yàn)?#xff0c;直接本地DNS解析出IP地址,可以減少遠(yuǎn)程網(wǎng)絡(luò)方式去DNS服務(wù)器上獲取域名對應(yīng)的IP地址操作,也就意味著,域名解析IP速度將更快。
在hosts文件里存儲(chǔ)的域名與IP地址映射,一般都是針對IP比較穩(wěn)定且經(jīng)常用的,例如工作當(dāng)中的一些線上開發(fā)環(huán)境或者測試環(huán)境等域名,如果是IP變化比較頻繁或者是根本就不知道IP是啥的,這類情況就無法通過hosts文件進(jìn)行配置獲取,只能通過網(wǎng)絡(luò)訪問DNS服務(wù)器去獲取。
首先,會(huì)先去本地區(qū)域的DNS服務(wù)器找,我們可以在系統(tǒng)的網(wǎng)絡(luò)配置上查看,究竟哪個(gè)是屬于所在網(wǎng)絡(luò)的本地區(qū)域DNS服務(wù)器,在命令行提示窗口輸入,ipconfig /all,然后按回車鍵,可以找到“DNS服務(wù)器”一欄——
例如,我所在網(wǎng)絡(luò)的DNS服務(wù)器IP是192.168.31.1,當(dāng)瀏覽器訪問某個(gè)域名時(shí),就會(huì)向這個(gè)DNS服務(wù)器發(fā)送查詢消息。
可以使用Wireshark抓包軟件驗(yàn)證一下,還是以www.baidu.com域名來做實(shí)驗(yàn),我們先看一下該域名對應(yīng)的IP是啥,直接在命令窗口ping一下,就可以知道了,其IPv4地址是14.215.177.38
通過Wireshark分析域名解析網(wǎng)絡(luò)傳輸
這時(shí),先打開Wireshark抓包軟件。
接著,在谷歌瀏覽器上輸入www.baidu.com,回車,可以看到,本機(jī)IP會(huì)向本區(qū)域DNS服務(wù)器192.168.31.1發(fā)送了一個(gè)DNS協(xié)議的消息,該消息包含了域名www.baidu.com,A,還有一個(gè)0x1515這幾個(gè)數(shù)據(jù),然后,DNS服務(wù)器response返回了 以下信息:response 0x1515 A www.baidu.com CNAME www.a.shifen.com A 14.215.177.38 A 14.215.177.39 ......
這些信息當(dāng)中,正好包含了域名www.baidu.com映射的IP地址(不止一個(gè)),其中就有一個(gè)是前面ping返回的14.215.177.38。
理論上,若在最近的DNS服務(wù)器上,無法解析到域名對應(yīng)的IP地址時(shí),那么最近的DNS服務(wù)器就會(huì)類似充當(dāng)一個(gè)中介角色,幫助客戶端去其他DNS服務(wù)器尋找,看看哪臺(tái)DNS服務(wù)器上可以找到該域名對應(yīng)的IP。同時(shí),需要理解一個(gè)知識(shí)點(diǎn)是,任何一臺(tái)DNS服務(wù)器,都存儲(chǔ)了根域名的IP地址。在www.baidu.com域名這個(gè)案例當(dāng)中,加入無法從192.168.31.1這條最近的DNS服務(wù)器上解析到對應(yīng)IP地址時(shí),該DNS服務(wù)器就會(huì)將客戶端的查詢請求發(fā)送給根域名服務(wù)器去詢問www.baidu.com域名在哪里可以解析。根域名服務(wù)器不做解析,更像是一位指路人,告知去com域?qū)?yīng)的DNS服務(wù)器查詢。com域所在的DNS服務(wù)器同樣無法解析,繼續(xù)充當(dāng)一位指路人,告知把請求轉(zhuǎn)發(fā)去baidu.com所在的DNS服務(wù)器,層層轉(zhuǎn)發(fā)下去,最后找的目標(biāo)DNS服務(wù)器,解析出域名對應(yīng)的IP地址,然后返回給客戶端,這時(shí),客戶端就可以通過IP地址獲取到相應(yīng)的服務(wù)器資源了。
在《網(wǎng)絡(luò)是怎樣連接的》一書當(dāng)中,有一個(gè)關(guān)于DNS服務(wù)器解析流程的插圖,覺得比較直觀地表達(dá)出從最近DNS域名如何轉(zhuǎn)發(fā)到目標(biāo)DNS域名的流程,這里直接引用了——
當(dāng)然,這只是理論,實(shí)際情況其實(shí)還是存在一些區(qū)別的。
再回到剛剛Wireshark抓包獲取的截圖上分析,可以看到一點(diǎn)是,客戶端發(fā)送給DNS服務(wù)器的消息,不止域名這一個(gè)信息,還包括了A等書,那么,問題就來了,DNS協(xié)議的查詢請求當(dāng)中,都包含了哪些參數(shù)呢?
在《網(wǎng)絡(luò)是怎樣連接的》一書當(dāng)中,有相關(guān)一些介紹,客戶端發(fā)送給DNS服務(wù)器的查詢消息包含了3種信息:
- 域名:服務(wù)器的域名名稱,例如本文中提到的www.baidu.com這樣的域名;
- Class:Class是用來識(shí)別網(wǎng)絡(luò)的信息,但目前除了互聯(lián)網(wǎng)已經(jīng)沒有其他網(wǎng)絡(luò)了,因此,Class只有一個(gè)IN值;
- type類型:表示該域名映射對應(yīng)的類型,當(dāng)類型為A,表示DNS服務(wù)器上域名映射的是IP地址;當(dāng)類似是MX時(shí),則表示映射的是郵件服務(wù)地址;
針對以上說明,我們可以具體通過Wireshark被選中數(shù)據(jù)包詳細(xì)信息欄來分析,通過DNS服務(wù)器解析www.baidu.com過程當(dāng)中,客戶端都發(fā)送了哪些查詢信息。
可見,該DNS查詢信息的域名為www.baidu.com,Class為IN,type類型為A,即代表映射的是IP地址。
通過本文,主要是分享一些自己對DNS解析的學(xué)習(xí)與理解,同時(shí),通過實(shí)際Wireshark抓包方式,來深入分析下本機(jī)如何發(fā)送DNS協(xié)議去DNS服務(wù)器上獲取訪問域名對應(yīng)的IP地址,希望也能讓您有一些收獲。
總結(jié)
以上是生活随笔為你收集整理的通过Wireshark抓包分析谈谈DNS域名解析的那些事儿的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入浅出Spring Boot,你和大神
- 下一篇: 解析Markdown文件生成React组