一.DNS原理
1.DNS是什么
DNS 全稱:Domain Name System (域名系統)
DNS其實是一個數據庫,是用於 TCP/IP 程序的分布式數據庫,同時也是一種重要的網絡協議。DNS儲存了網絡中的 IP 地址與對應主機的信息,郵件路由信息和其他網絡應用方面的信息,用戶通過詢問解決庫(解決庫發送詢問並對DNS回應進行說明)在 DNS 上查詢信息。
2.DNS作用
DNS是網絡分層里的應用層協議,事實上他是為其他應用層協議工作的,就是把域名,或者說主機名轉化為IP地址(同時也提供反向域名查詢的功能),類似字典,比如訪問 www.baidu.com,實際訪問的是它的IP地址,因為機器識別的是擁有固定格式和含義的IP地址,而域名可以千奇百怪,甚至是中文,不利於識別。還有比如公司內部的域驗證,通過分配給員工的域賬號登錄內網就必須通過DNS來找到域名權限服務器,來認證身份,故有些書上說:DNS是因特網世界里不可缺少的東西,簡單來說DNS就是每個IP地址都可以有一個主機名,主機名由一個或多個字符串組成,字符串之間用小數點隔開。有了主機名,就不要死記硬背每台IP設備的IP地址,只要記住相對直觀有意義的主機名就行了。這就是DNS協議所要完成的功能
3.DNS記錄類型
A記錄 A(Address)記錄是用來指定主機名(或域名)對應的IP地址記錄。用戶可以將該域名下的網站服務器指向到自己的web server上。同時也可以設置域名的子域名。通俗來說A記錄就是服務器的IP,域名綁定A記錄就是告訴DNS,當你輸入域名的時候給你引導向設置在DNS的A記錄所對應的服務器。 簡單的說,A記錄是指定域名對應的IP地址。
NS記錄 NS(Name Server)記錄是域名服務器記錄,用來指定該域名由哪個DNS服務器來進行解析。 注冊域名時,總有默認的DNS服務器,每個注冊的域名都是由一個DNS域名服務器來進行解析的,DNS服務器NS記錄地址一般以以下的形式出現: ns1.domain.com、ns2.domain.com等。 簡單的說,NS記錄是指定由哪個DNS服務器解析你的域名。
MX記錄 MX(Mail Exchanger)記錄是郵件交換記錄,它指向一個郵件服務器,用於電子郵件系統發郵件時根據收信人的地址后綴來定位郵件服務器。例如,當Internet上的某用戶要發一封信給 user@mydomain.com 時,該用戶的郵件系統通過DNS查找mydomain.com這個域名的MX記錄,如果MX記錄存在, 用戶計算機就將郵件發送到MX記錄所指定的郵件服務器上。
CNAME記錄 CNAME(Canonical Name )別名記錄,允許您將多個名字映射到同一台計算機。通常用於同時提供WWW和MAIL服務的計算機。例如,有一台計算機名為 “host.mydomain.com”(A記錄),它同時提供WWW和MAIL服務,為了便於用戶訪問服務。可以為該計算機設置兩個別名(CNAME):WWW和MAIL, 這兩個別名的全稱就“www.mydomain.com”和“mail.mydomain.com”,實際上他們都指向 “host.mydomain.com”。
TXT記錄 TXT記錄,一般指某個主機名或域名的說明,如:admin IN TXT "管理員, 電話:XXXXXXXXXXX",mail IN TXT "郵件主機,存放在xxx , 管理人:AAA",Jim IN TXT "contact: abc@mailserver.com",也就是您可以設置 TXT 內容以便使別人聯系到您。 TXT的應用之一,SPF(Sender Policy Framework)反垃圾郵件。SPF是跟DNS相關的一項技術,它的內容寫在DNS的TXT類型的記錄里面。MX記錄的作用是給寄信者指明某個域名的郵件服務器有哪些。SPF的作用跟MX相反,它向收信者表明,哪些郵件服務器是經過某個域名認可會發送郵件的。SPF的作用主要是反垃圾郵件,主要針對那些發信人偽造域名的垃圾郵件。例如:當郵件服務器收到自稱發件人是spam@gmail.com的郵件,那么到底它是不是真的gmail.com的郵件服務器發過來的呢,我們可以查詢gmail.com的SPF記錄,以此防止別人偽造你來發郵件。
TTL值 TTL(Time-To-Live)原理:TTL是IP協議包中的一個值,它告訴網絡路由器包在網絡中的時間是否太長而應被丟棄。有很多原因使包在一定時間內不能被傳遞到目的地。例如,不正確的路由表可能導致包的無限循環。一個解決方法就是在一段時間后丟棄這個包,然后給發送者一個報文,由發送者決定是否要重發。TTL的初值通常是系統缺省值,是包頭中的8位的域。
TTL的最初設想是確定一個時間范圍,超過此時間就把包丟棄。由於每個路由器都至少要把TTL域減一,TTL通常表示包在被丟棄前最多能經過的路由器個數。當記數到0時,路由器決定丟棄該包,並發送一個ICMP報文給最初的發送者。
簡單的說,TTL就是一條域名解析記錄在DNS服務器中的存留時間。當各地的DNS服務器接受到解析請求時,就會向域名指定的NS服務器發出解析請求從而獲得解析記錄;在獲得這個記錄之后,記錄會在DNS服務器中保存一段時間,這段時間內如果再接到這個域名的解析請求,DNS服務器將不再向NS服務器發出請求,而是直接返回剛才獲得的記錄,而這個記錄在DNS服務器上保留的時間,就是TTL值。
TTL值設置的應用: 一是增大TTL值,以節約域名解析時間,給網站訪問加速。 一般情況下,域名的各種記錄是極少更改的,很可能幾個月、幾年內都不會有什么變化。我們完全可以增大域名記錄的TTL值讓記錄在各地DNS服務器中緩存的時間加長,這樣在更長的一段時間內,我們訪問這個網站時,本地ISP的DNS服務器就不需要向域名的NS服務器發出解析請求,而直接從緩存中返回域名解析記錄。
二是減小TTL值,減少更換空間時的不可訪問時間。 更換空間99.9%會有DNS記錄更改的問題,因為緩存的問題,新的域名記錄在有的地方可能生效了,但在有的地方可能等上一兩天甚至更久才生效。結果就是有的人可能訪問到了新服務器,有的人訪問到了舊服務器。僅僅是訪問的話,這也不是什么大問題,但如果涉及到了郵件發送,這個就有點麻煩了,說不定哪封重要信件就被發送到了那已經停掉的舊服務器上。
為了盡可能的減小這個各地的解析時間差,合理的做法是:
第一步,先查看域名當前的TTL值,我們假定是1天。
第二步,修改TTL值為可設定的最小值,可能的話,建議為1分鍾,就是60。
第三步,等待一天,保證各地的DNS服務器緩存都過期並更新了記錄。
第四步,設置修改新記錄,這個時候各地的DNS就能以最快的速度更新到新的記錄。
第五步,確認各地的DNS已經更新完成后,把TTL值設置成您想要的值。 一般操作系統的默認TTL值如下: TTL=32 Windows 9x/Me TTL=64 LINUX TTL=128 Windows 200x/XP TTL=255 Unix
PTR值 PTR是pointer的簡寫,用於將一個IP地址映射到對應的域名,也可以看成是A記錄的反向,IP地址的反向解析。 PTR主要用於郵件服務器,比如郵箱AAA@XXX.com給郵箱BBB@yahoo.com發了一封郵件,yahoo郵件服務器接到郵件時會查看這封郵件的頭文件,並分析是由哪個IP地址發出來的,然后根據這個IP地址進行反向解析,如果解析結果對應XXX.com的IP地址就接受這封郵件,反之則拒絕接收這封郵件。
泛域名與泛解析 泛域名是指在一個域名根下,以 .Domain.com的形式表示這個域名根所有未建立的子域名。 泛解析是把.Domain.com的A記錄解析到某個IP 地址上,通過訪問任意的前綴.domain.com都能訪問到你解析的站點上。
域名綁定 域名綁定是指將域名指向服務器IP的操作。
域名轉向 域名轉向又稱為域名指向或域名轉發,當用戶地址欄中輸入您的域名時,將會自動跳轉到您所指定的另一個域名。一般是使用短的好記的域名轉向復雜難記的域名。
4.查詢自己的DNS與dig命令使用
5.原理性文檔
以訪問www.為例說明(主機為Windows系統)
1)客戶端首先檢查本地c:\windows\system32\drivers\etc\host文件,是否有對應的IP地址,若有,則直接訪問WEB站點,若無
2)客戶端檢查本地緩存信息,若有,則直接訪問WEB站點,若無
3)本地DNS檢查緩存信息,若有,將IP地址返回給客戶端,客戶端可直接訪問WEB站點,若無
4)本地DNS檢查區域文件是否有對應的IP,若有,將IP地址返回給客戶端,客戶端可直接訪問WEB站點,若無,
5)本地DNS根據cache.dns文件中指定的根DNS服務器的IP地址,轉向根DNS查詢。
6)根DNS收到查詢請求后,查看區域文件記錄,若無,則將其管轄范圍內.com服務器的IP地址告訴本地DNS服務器
7).com服務器收到查詢請求后,查看區域文件記錄,若無,則將其管轄范圍內.xxx服務器的IP地址告訴本地DNS服務器
8).xxx服務器收到查詢請求后,分析需要解析的域名,若無,則查詢失敗,若有,返回www.的IP地址給本地服務器
9)本地DNS服務器將www.的IP地址返回給客戶端,客戶端通過這個IP地址與WEB站點建立連接
二.域名系統中的域名
1.何為域名
人和人要互相識別和記憶,需要名字作為輔助,而對於網絡世界,在因特網內也需要一種命名系統來做類似的事情,該系統使用了域來划分,任何一個網絡里的主機(或者路由器)都有獨一無二的域名(類似國家代碼),域又能繼續划分為子域(類似每個國家有不同的省份代碼),子域還能繼續划分(每個省都有自己的各個城市的代碼)……在因特網內對應的就是頂級域名(com,net,cn,org等),二級域名……注意這僅僅是一種邏輯的划分。而這些域名系統在形式上組成了一種樹結構。如下圖
名字(也叫標號)組成只能是英文或者數字,目前中文也支持了,長度不大於63個字符,總共完整域名長度不超過255個字符,英文域名不區分大小寫,從右到左,域名級別依次降低。www是表示萬維網,不屬於域名
2.域名的樹結構'
3.域名服務器
DNS服務器管理范圍的單位是區,不是域,因為區才是DNS服務器管理的實際范圍,區是域的子集,同一個區里的主機節點必須互通,它們都有一個統一的訪問權限,該訪問權限在通過一個權限域名服務器管理。比如,公司睿擇世紀,有兩個部門研發和后勤,部門研發又有兩個分部ios和java,睿擇世紀會設立一個區叫ruizeshiji.com(區和域可以同名),這是一個大的權限范圍,然后下屬再設立一個區,叫ios.ruizeshiji.com,那么區ruizeshiji.com和ios.ruizeshiji.com都屬於域ruizeshiji.com。
DNS服務器也是類似域名空間樹一樣的樹結構,依次分為根域名服務器(知道所有的頂級域名服務器的域名和IP,最重要,它要是癱瘓,整個DNS就完蛋),然后是頂級域名服務器(管理二級域名),其次是權限域名服務器(負責區的域名服務器)。
最后是本地域名服務器(也叫默認域名服務器),本地域名服務器離主機很近(書上說不超過幾個路由器),速度很快,其實本地域名服務器本質不屬於域名服務器架構。
三.域名解析過程
當一個應用需要把主機名解析為IP地址時,該應用進程就調用地址解析程序,它自己就變為了DNS的一個客戶,把待解析的域名放在DNS請求報文中,以UDP方式先發給本地域名服務器,本地域名服務器在查找域名后,把對應的IP地址放在回答報文中返回,應用程序獲得目的主機的IP地址后即可進行通信。若本地域名服務器不能回答該請求,則此域名服務器就暫時稱為DNS的另一個客戶,並向其他域名服務器發出查詢請求。這種過程直至找到能夠回答該請求的域名服務器為止。
1.客戶端向域名服務器查詢采用遞歸模式
如果主機所詢問的本地域名服務器不知道被查詢的域名的IP地址,那么本地域名服務器就以DNS客戶端的身份(遞歸思想),向根域名服務器繼續發出查詢報文(替主機查詢),不讓主機自己進行查詢。遞歸查詢返回的結果或者是IP,或者報錯。這是從上到下的遞歸查詢過程。
2.本地域名服務器向根域查詢采用迭代查詢
當根域名服務器收到本地域名服務器的查詢請求,要么給出ip,要么通知本地域名服務器下一步應該去請求哪一個頂級域名服務器查詢(並告知本地域名服務器自己知道的頂級域名的IP),讓本地域名服務器繼續查詢,而不是替他查詢。同理,頂級域名服務器無法返回IP的時候,也會通知本地域名服務器下一步向誰查詢(查詢哪一個權限域名服務器)……這是一個迭代過程。
四.DNS協議端口
1.DNS網絡層協議
DNS同時支持UDP和TCP訪問,當名字解析器發出一個查詢請求,並且返回響應報文中的TC位設置為1時,名字解析器通常使用TCP重發原來的查詢請求,TCP能將用戶的數據流分為一些報文段,用多個報文段來傳送任意長度的用戶數據,即允許返回的響應超過512個字節。
此外,為了減輕單台DNS服務器的負載,有時要將同一DNS區域的內容保存在多個DNS服務器中(主從備份,分布式存儲),這時,就要用到DNS的“區域傳輸”功能。在分布式的DNS數據庫中,當一個域的輔助名字服務器在啟動時,將從該域的主名字服務器執行區域傳送。輔助服務器將定時(通常是3小時)向主服務器進行查詢以便了解主服務器數據是否發生變動,如果有變動,為了數據一致性,將執行一次區域傳送,區域傳送將使用TCP,因為傳送的數據遠比一個查詢或響應多。
故DNS主要使用UDP,TCP為輔,如果是UDP,那么無論是名字解析器還是名字服務器都必須自己處理超時和重傳。此外,DNS不像其他的使用UDP的應用一樣,大部分操作集中在局域網上,DNS查詢和響應通常經過廣域網。分組丟失率和往返時間的不確定性在廣域網上比局域網上更大。這樣對於DNS客戶程序,一個好的重傳和超時程序就顯得更重要。
2.DNS使用端口
DNS服務器使用的熟知端口號無論對UDP還是TCP都是53