通過Wireshark抓包分析談談DNS域名解析的那些事兒

文/朱季謙

本文主要想通過動手實際分析一下是如何通過DNS服務器來解析域名獲取對應IP地址的,畢竟,紙上得來終覺淺,絕知此事要躬行。

域名與IP地址

當在瀏覽器上敲下“www.baidu.com”時,一鍵回車,很快,瀏覽器上就會刷新出熟悉的百度搜索頁面。以前剛接觸網絡時,總以爲這個過程是通過域名www.baidu.com來訪問遠程服務器,其實不然,本質上,還是通過IP去遠程訪問服務器獲取資源。

這時,聰明的小夥伴就會出現一個疑問,爲啥不直接通過域名去尋找到相應的服務器主機呢?

其實,若要實現通過域名的方式去尋找服務器主機,也不是不行,但沒這個必要。

先來對比一下域名方式與IP地址方式兩者的最關鍵差異在哪裏,就知道爲啥沒這個必要了。

我們日常工作接觸的IPv4地址一般都是以十進制的方式表示,例如,192.168.200.111,但在計算機當中,它其實是以二進制形式存在,192.168.200.111的二進制爲1100 0000 1010 1000 1100 1000 0110 1111,總共32位,也就是32比特。衆所周知,1個字節佔了8比特,那麼就意味着,一個32比特的IP地址長度也就4個字節。

在網絡傳輸過程中,4個字節的長度,可以說,微不足道,但,若換成域名呢?

目前,域名最大長度可達:63個字符,每個char字符就佔了2字節,63字符佔了126字節,可見,若要用域名當成傳輸的地址,是多麼耗性能,但若用IP地址就不一樣了,32位也就只佔4字節。

事實上,在瀏覽器上通過IP同樣可以訪問到對應域名的網址,但IP地址是一長串數字,難以記住,更難以理解這一堆數字代表了啥,但域名就不一樣了,像百度的域名www.baidu.com,很直觀就知道,這是訪問百度的網址。

按照百度百科的說法,設計域名的作用,就是爲了讓用戶更好理解。

當在瀏覽器上敲下“www.baidu.com”,在這個過程當中,會做一步域名解析成IP地址的操作,這裏就涉及到一個叫做DNS的概念。DNS,全稱Domain Name System,即域名系統,它提供的作用是將域名和IP地址相互映射。最通俗的理解,它就像是Java裏key-value形式的Map,key是域名,value是對應映射的IP地址,通過map.get(域名),可得到域名對應的IP地址。

這裏值得多提一點是,與DNS相反的另一個相似概念,是ARP(Address Resolution Protocol,地址解析協議),它是根據已知的IP地址,可獲得MAC地址,當然,MAC這塊已是數據鏈路層的知識,DNS則是應用層的東西了。

域名解析IP的步驟

域名解析出其映射的IP地址,主要有以下幾個步驟:

首先,會根據域名從瀏覽器緩存當中獲取,若能獲取到,直接返回對應的IP地址;若獲取失敗,會嘗試獲取操作系統本地的域名解析系統,即在hosts文件檢查是否有對應的域名映射,若能找到,直接獲取其映射的IP地址返回。其中,關於這一步,作爲程序員,可能多少都做過相關操作。例如,網上有一些關於Windows系統如何加快訪問Github網站的教程,其中有一個方式,就是將Github的域名與對應的IP地址,添加到Windows的C:\Windows\System32\drivers\etc\hosts文件當中,隨後再瀏覽Github,發現速度確實快了不少。這是因爲,直接本地DNS解析出IP地址,可以減少遠程網絡方式去DNS服務器上獲取域名對應的IP地址操作,也就意味着,域名解析IP速度將更快。

image

在hosts文件裏存儲的域名與IP地址映射,一般都是針對IP比較穩定且經常用的,例如工作當中的一些線上開發環境或者測試環境等域名,如果是IP變化比較頻繁或者是根本就不知道IP是啥的,這類情況就無法通過hosts文件進行配置獲取,只能通過網絡訪問DNS服務器去獲取。

首先,會先去本地區域的DNS服務器找,我們可以在系統的網絡配置上查看,究竟哪個是屬於所在網絡的本地區域DNS服務器,在命令行提示窗口輸入,ipconfig /all,然後按回車鍵,可以找到“DNS服務器”一欄——
image

例如,我所在網絡的DNS服務器IP是192.168.31.1,當瀏覽器訪問某個域名時,就會向這個DNS服務器發送查詢消息。

可以使用Wireshark抓包軟件驗證一下,還是以www.baidu.com域名來做實驗,我們先看一下該域名對應的IP是啥,直接在命令窗口ping一下,就可以知道了,其IPv4地址是14.215.177.38

image


通過Wireshark分析域名解析網絡傳輸

這時,先打開Wireshark抓包軟件。

接着,在谷歌瀏覽器上輸入www.baidu.com,回車,可以看到,本機IP會向本區域DNS服務器192.168.31.1發送了一個DNS協議的消息,該消息包含了域名www.baidu.com,A,還有一個0x1515這幾個數據,然後,DNS服務器response返回了 以下信息:response 0x1515 A www.baidu.com CNAME www.a.shifen.com A 14.215.177.38 A 14.215.177.39 ......
image
這些信息當中,正好包含了域名www.baidu.com映射的IP地址(不止一個),其中就有一個是前面ping返回的14.215.177.38。

理論上,若在最近的DNS服務器上,無法解析到域名對應的IP地址時,那麼最近的DNS服務器就會類似充當一箇中介角色,幫助客戶端去其他DNS服務器尋找,看看哪臺DNS服務器上可以找到該域名對應的IP。同時,需要理解一個知識點是,任何一臺DNS服務器,都存儲了根域名的IP地址。在www.baidu.com域名這個案例當中,加入無法從192.168.31.1這條最近的DNS服務器上解析到對應IP地址時,該DNS服務器就會將客戶端的查詢請求發送給根域名服務器去詢問www.baidu.com域名在哪裏可以解析。根域名服務器不做解析,更像是一位指路人,告知去com域對應的DNS服務器查詢。com域所在的DNS服務器同樣無法解析,繼續充當一位指路人,告知把請求轉發去baidu.com所在的DNS服務器,層層轉發下去,最後找的目標DNS服務器,解析出域名對應的IP地址,然後返回給客戶端,這時,客戶端就可以通過IP地址獲取到相應的服務器資源了。

在《網絡是怎樣連接的》一書當中,有一個關於DNS服務器解析流程的插圖,覺得比較直觀地表達出從最近DNS域名如何轉發到目標DNS域名的流程,這裏直接引用了——
image

當然,這只是理論,實際情況其實還是存在一些區別的。

再回到剛剛Wireshark抓包獲取的截圖上分析,可以看到一點是,客戶端發送給DNS服務器的消息,不止域名這一個信息,還包括了A等書,那麼,問題就來了,DNS協議的查詢請求當中,都包含了哪些參數呢?

在《網絡是怎樣連接的》一書當中,有相關一些介紹,客戶端發送給DNS服務器的查詢消息包含了3種信息:

  • 域名:服務器的域名名稱,例如本文中提到的www.baidu.com這樣的域名;
  • Class:Class是用來識別網絡的信息,但目前除了互聯網已經沒有其他網絡了,因此,Class只有一個IN值;
  • type類型:表示該域名映射對應的類型,當類型爲A,表示DNS服務器上域名映射的是IP地址;當類似是MX時,則表示映射的是郵件服務地址;

針對以上說明,我們可以具體通過Wireshark被選中數據包詳細信息欄來分析,通過DNS服務器解析www.baidu.com過程當中,客戶端都發送了哪些查詢信息。

image

可見,該DNS查詢信息的域名爲www.baidu.com,Class爲IN,type類型爲A,即代表映射的是IP地址。

通過本文,主要是分享一些自己對DNS解析的學習與理解,同時,通過實際Wireshark抓包方式,來深入分析下本機如何發送DNS協議去DNS服務器上獲取訪問域名對應的IP地址,希望也能讓您有一些收穫。

歡迎關注微信公衆號——
image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章