DNS是現(xiàn)代因特網(wǎng)使用的命名系統(tǒng),url轉(zhuǎn)換為IP地址的操作就是通過DNS完成的;本文主要總結DNS的基礎知識部分。
I、上帝視角看域名
1.1 點分十進制與網(wǎng)絡字節(jié)序
1、 IP地址是固定的32位網(wǎng)絡字節(jié)序(IPV4, IPV6為128位),用十六進制表示起來比較困難,于是經(jīng)常采用我們看到的點分十進制方式表示,這就需要進行網(wǎng)絡字節(jié)序與點分十進制之間的轉(zhuǎn)化:
#include<arpa/inet.h>
//將cp指向的點分十進制轉(zhuǎn)化為無符號長整型,存儲在int指針中,成功返回1,出錯返回0
int inet_aton(const char *cp, struct in_addr *inp);
//將無符號整型IP地址轉(zhuǎn)化為點分十進制
char *inet_ntoa(struct in_addr in);
1.2 主機字節(jié)序與網(wǎng)絡字節(jié)序
主機字節(jié)序是由CPU決定的,網(wǎng)絡字節(jié)序為統(tǒng)一規(guī)定。這兩種字節(jié)序可能會有不同的存儲方式,分別為大端模式與小端模式:
1、 大端模式與小端模式
大端模式(BG):高地址為低位,低地址為高位;
小端模式(LG)正好相反,高地址為高位,低地址為低位。
如: 對于地址0x012345678
Big-Endian: 低地址存放高位,如下:
高地址
---------------
buf[3] (0x78) -- 低位
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) -- 高位
---------------
低地址
Little-Endian: 低地址存放低位,如下:
高地址
---------------
buf[3] (0x12) -- 高位
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) -- 低位
--------------
低地址
2、大小端模式的轉(zhuǎn)化
對于Intel類型的CPU采用的是小端對齊模式,而網(wǎng)絡字節(jié)序規(guī)定采用大端對齊模式,于是在編程過程中就可能需要對大小端模式進行轉(zhuǎn)化:
#include<netinet/in.h>
//將32位長整型主機字節(jié)序轉(zhuǎn)化為網(wǎng)絡字節(jié)序
unsigned long int htonl(unsigned long int hostlong);
//將16位短整型主機字節(jié)序轉(zhuǎn)化為網(wǎng)絡字節(jié)序
unsigned short int htons(unsigned short int hostshort);
//將32為網(wǎng)絡字節(jié)序轉(zhuǎn)化為主機字節(jié)序
unsigned long int ntohl(unsigned long int netlong);
//將16為網(wǎng)絡字節(jié)序轉(zhuǎn)化為主機字節(jié)序
unsigned short int ntohs(unsigned short int netshort);
1.3 url與IP地址
url是為了方便記憶而產(chǎn)生的域名系統(tǒng),其通過DNS進行轉(zhuǎn)化,接下來就說明DNS的轉(zhuǎn)化過程。
II、因特網(wǎng)域名結構
因特網(wǎng)采用層次樹狀結構的命名方法。

III、DNS查詢過程
3.1、DNS域名服務器分布
DNS被設計成了一個聯(lián)機分布式數(shù)據(jù)庫系統(tǒng),域名到IP地址的解析是由分布在因特網(wǎng)上的許多域名服務器程序共同完成的。
因特網(wǎng)以“區(qū)”為單位確定DNS服務器的管轄范圍:

如上圖所示,給出了DNS域名服務器樹狀結構圖。這種DNS域名服務器樹狀結構圖可以準確的反應DNS分布式結構。其中的每個域名服務器都能夠進行部分域名到IP地址的解析。當某個DNS服務器不能進行解析請求時,就設法找因特網(wǎng)上別的域名服務器進行解析。
3.2 域名服務器
1、根域名服務器:是最高層次的域名服務器,所有的根域名服務器都知道所有的頂級域名服務器的域名和IP地址(對應上圖)。
如果本地域名服務器自己無法完成解析,就首先求助于根域名服務器(因特網(wǎng)上一共有13個不同的根域名服務器)。
2、頂級域名服務器:負責管理在該頂級域名服務器注冊的二級域名。當收到DNS查詢請求時,就給出相應回答。
3、權限域名服務器:負責一個“區(qū)”,當一個權限域名服務器不能給出查詢回答時,會告訴查詢客戶,下一步應當找那一個權限域名服務器。
4、本地域名服務器:本地域名服務器不在上圖的域名服務器層次結構中,但是非常重要。
當一個主機發(fā)出DNS請求時,這個查詢請求報文就發(fā)送給了本地域名服務器。
3.3 域名解析過程
解析過程包括遞歸查詢與迭代查詢兩種形式。
1、主機向本地域名服務器的查詢采用遞歸查詢:所謂遞歸查詢就是,如果主機所詢問的本地域名服務器不知道被查詢域名的IP地址,則本地域名服務器以DNS客戶的身份,向其他根域名服務器繼續(xù)發(fā)送查詢報文,而不是讓主機自己進行下一步查詢。
2、本地域名服務器向根域名服務器的查詢通常采用迭代查詢:迭代查詢的特點是當根域名服務器收到本地域名服務器發(fā)出的迭代查詢請求報文時,要么給出所要查詢的IP地址,要么告訴本地域名服務器下一步需要查詢的域名服務器。然后讓本地域名服務器自己進行后續(xù)查詢。
以上兩種查詢方式的對比如下圖:

3.4 域名解析實例
上圖中的(a)為實際查詢過程中常用的方式,我們以它為例說明:
1、m.xyz.com主機向本地域名服務器(dns.xyz.com)發(fā)起遞歸查詢;
2、本地域名服務器無法完成查詢要求,所以向根域名服務器求助,這是采用迭代查詢;
3、跟域名服務器將下一次要查詢的IP地址返回給本地域名服務器;
4、本地域名服務器根據(jù)返回的IP地址找到頂級域名服務器(dns.com);
5、頂級域名服務器將下一次查詢的IP返回給本地域名服務器;
6、本地域名服務器根據(jù)返回的IP對權限域名服務器(dns.abc.com)進行查詢;
7、權限域名服務器將成功查詢的IP地址回復給本地域名服務器;
8、本地域名服務器傳回給主機。
IV、DNS補充內(nèi)容
1、DNS在以上查詢過程中由于數(shù)據(jù)量小,使用UDP協(xié)議傳輸,以達到DNS服務器負載更低, 響應更快的效果。
2、主域名服務器與輔助域名服務器
為了提高域名服務器的可靠性,DNS域名服務器把數(shù)據(jù)復制到幾個域名服務器來保存,其中一個為主域名服務器,其他的是輔助域名服務器。
主域名服務器與輔助域名服務器要完成復制信息,同步等操作采用TCP協(xié)議傳輸,這樣一是保證數(shù)據(jù)的可靠性,二是要進行的同步操作比請求應答的數(shù)量大得多,所以需要采用報文更大的TCP操作。
【參考】
[1] 《計算機網(wǎng)絡》
[2] 《深入理解計算機系統(tǒng)》
歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明出處wenmingxing 計算機網(wǎng)絡之DNS總結