理解DNS
寫在前面:
目前,我們大部分的網絡通信都是基於TCP/IP協議的,而TCP/IP又基於IP地址作為唯一標識進行通信,隨着需要記憶的IP地址數量的增多,肯定會超出我們的記憶能力范圍,但如果使用一種利於人們的記憶的方式,如域名,例如"www.google.com",我們便可以輕松的記憶這種方式的標識,而不是繁雜的數字。而DNS(域名系統)就是為了可以使用這種方式提供服務的。
什么是DNS?
DNS(Domain Name System),域名系統,它是因特網的一項服務。它作為將域名和IP地址相互映射的一個分布式數據庫,能夠使人更方便地訪問互聯網。DNS使用TCP和UDP端口53。當前,對於每一級域名長度的限制是63個字符,域名總長度則不能超過253個字符。
DNS Domain Namespace,DNS域命名空間,是一種分層樹狀結構,其格式如下:"www.google.com",以點"."為分隔。結構如圖所示:

DNS域名空間結構
根域:絕對域名(FQDN),以點"."結尾的域名
頂級域:用來指示某個國家/地區或組織使用的名稱的類型名稱,例如.com
二級域:個人或組織在因特網上使用的注冊名稱,例如google.com
子域:已注冊的二級域名派生的域名,一般就是網站名,例如www.google.com
主機名:標識網絡上的特定計算機,例如h1.www.google.com
DNS資源記錄:(即映射關系,通常由域名管理員進行配置),常見類型如下:
SOA:起始授權機構
NS:名稱服務器
MX:郵件服務器
A:IP地址(最常用,映射IP地址)
CNAME:別名(較常用,映射到其他域名)
DNS工作原理
當我們請求一個域名時,會通過DNS服務器將域名解析成IP訪問最終的主機,那么,DNS是如何查詢到域名所對應的IP並返回給我們的呢?請工作機制如圖所示:

DNS工作原理
當我們請求一個域名時,直到獲取到IP地址,整個過程是如何工作的?以請求www.codecc.xyz為例:
1、首先,我們的主機會去查找本地的hosts文件和本地DNS解析器緩存,如果hosts文件和本地DNS緩存存在www.codecc.xyz和IP的映射關系,則完成域名解析,請求該IP地址,否則進入第二步。
2、當hosts和本地DNS解析器緩存都沒有對應的網址映射關系,則會根據機器(/etc/reslove.conf)配置的本地DNS服務器進行查詢,此服務器收到查詢時,如果要查詢的域名在本地配置區域資源或者緩存中存在映射關系,則跳到步驟9,將解析結果直接返回給客戶機。
PS:一二步驟為遞歸查詢,其余步驟為迭代查詢
3、若本地DNS服務器不存在該域名的映射關系,就把請求發送至13台根DNS服務器。
4、根DNS服務器會判斷這個域名(.xyz)由誰來授權管理,並返回一個負責該頂級域的DNS服務器的一個IP給本地DNS服務器。
5、本地DNS服務器收到該IP后,會再將查詢請求發送至(.xyz)所在的DNS服務器。
6、如果(.xyz)的DNS服務器無法解析該域名,就會去判斷這個二級域名(codecc.xyz)的管理者,返回一個負責該二級域的DNS服務器的IP給本地DNS服務器。
7、本地DNS服務器收到該IP后,會再次將查詢請求發送至(codecc.xyz)所在的DNS服務器。
8、(codecc.xyz)的DNS服務器會存有www.codecc.xzy的映射關系,將解析后的IP返回給本地DNS服務器
9、本地DNS服務器根據查詢到的解析IP發送給客戶機,至此,DNS解析完成。
常用DNS查詢命令
windows:
nslookup 域名

Linux:
nslookup 域名

dig 域名

參考:
https://en.wikipedia.org/wiki/Domain_Name_System
https://technet.microsoft.com/en-us/library/cc772774(v=ws.10).aspx
《TCP/IP詳解卷1:協議》
