1、DNS
域名系統(英文:Domain Name System,縮寫:DNS)是互聯網的一項服務。它作為將域名和IP地址相互映射的一個分布式數據庫,能夠使人更方便地訪問互聯網。DNS使用UDP端口53。當前,對於每一級域名長度的限制是63個字符,域名總長度則不能超過253個字符。
該系統用於命名組織到域層次結構中的計算機和網絡服務。在Internet上域名與IP地址之間是一一對應的,域名雖然便於人們記憶,但機器之間只能互相認識IP地址,它們之間的轉換工作稱為域名解析,域名解析需要由專門的域名解析服務器來完成。
DNS協議運行在UDP協議之上,使用端口號53。在傳輸層TCP提供端到端可靠的服務,在UDP端提供盡力交付的服務。其控制端口作用於UDP端口53。
在架設dns服務器時,linux系統需要在防火牆規則中內加入UDP端口53的外網訪問,windows系統需要在防火牆里添加端口,選擇UDP,輸入端口號53,如果使用服務器安全狗等防火牆,請添加53端口在UDP的完全訪問,例外中去掉127.0.0.1即可。
2、域名解析流程
當一個用戶在地址欄輸入www.taobao.com時,DNS解析有大致十個過程,如下:
(1)瀏覽器先檢查自身緩存中有沒有被解析過的這個域名對應的ip地址,如果有,解析結束。同時域名被緩存的時間也可通過TTL屬性來設置。
(2)如果瀏覽器緩存中沒有(專業點叫還沒命中),瀏覽器會檢查操作系統緩存中有沒有對應的已解析過的結果。而操作系統也有一個域名解析的過程。在windows中可通過c盤里一個叫hosts的文件來設置,如果你在這里指定了一個域名對應的ip地址,那瀏覽器會首先使用這個ip地址。但是這種操作系統級別的域名解析規程也被很多黑客利用,通過修改你的hosts文件里的內容把特定的域名解析到他指定的ip地址上,造成所謂的域名劫持。所以在windows7中將hosts文件設置成了readonly,防止被惡意篡改。
(3)如果至此還沒有命中域名,才會真正的請求本地域名服務器(LDNS)來解析這個域名,這台服務器一般在你的城市的某個角落,距離你不會很遠,並且這台服務器的性能都很好,一般都會緩存域名解析結果,大約80%的域名解析到這里就完成了。
(4)如果LDNS仍然沒有命中,就直接跳到Root Server 域名服務器請求解析
(5) 根域名服務器返回給LDNS一個所查詢域的主域名服務器(gTLD Server,國際頂尖域名服務器,如.com .cn .org等)地址
(6)此時LDNS再發送請求給上一步返回的gTLD
(7)接受請求的gTLD查找並返回這個域名對應的Name Server的地址,這個Name Server就是網站注冊的域名服務器
(8)Name Server根據映射關系表找到目標ip,返回給LDNS
(9)LDNS緩存這個域名和對應的ip
(10) LDNS把解析的結果返回給用戶,用戶根據TTL值緩存到本地系統緩存中,域名解析過程至此結束
3、DNS報文格式解析
DNS 分為查詢請求和查詢響應,請求和響應的報文結構基本相同。DNS 報文格式如圖所示。
DNS報文格式分為DNS查詢和響應的報文格式。這個報文由12字節長的首部和4個長度可變的字段組成。報文中問題字段是由客戶填入的,由服務器返回問題的回答、授權和附加信息字段。
上圖中顯示了 DNS 的報文格式。其中,事務 ID、標志、問題計數、回答資源記錄數、權威名稱服務器計數、附加資源記錄數這 6 個字段是DNS的報文首部,共 12 個字節。
整個 DNS 格式主要分為 3 部分內容,即基礎結構部分、問題部分、資源記錄部分。
3.1、基礎結構部分
DNS 報文的基礎結構部分指的是報文首部,如圖所示。

該部分中每個字段含義如下:
- 事務 ID:DNS 報文的 ID 標識。對於請求報文和其對應的應答報文,該字段的值是相同的。通過它可以區分 DNS 應答報文是對哪個請求進行響應的。
- 標志:DNS 報文中的標志字段。
- 問題計數:DNS 查詢請求的數目。
- 回答資源記錄數:DNS 響應的數目。
- 權威名稱服務器計數:權威名稱服務器的數目。
- 附加資源記錄數:額外的記錄數目(權威名稱服務器對應 IP 地址的數目)。
基礎結構部分中的標志字段又分為若干個字段,如圖所示:

標志字段中每個字段的含義如下:
- QR(Response):查詢請求/響應的標志信息。查詢請求時,值為 0;響應時,值為 1。
- Opcode:操作碼。其中,0 表示標准查詢;1 表示反向查詢;2 表示服務器狀態請求。
- AA(Authoritative):授權應答,該字段在響應報文中有效。值為 1 時,表示名稱服務器是權威服務器;值為 0 時,表示不是權威服務器。
- TC(Truncated):表示是否被截斷。值為 1 時,表示響應已超過 512 字節並已被截斷,只返回前 512 個字節。
- RD(Recursion Desired):期望遞歸。該字段能在一個查詢中設置,並在響應中返回。該標志告訴名稱服務器必須處理這個查詢,這種方式被稱為一個遞歸查詢。如果該位為 0,且被請求的名稱服務器沒有一個授權回答,它將返回一個能解答該查詢的其他名稱服務器列表。這種方式被稱為迭代查詢。
- RA(Recursion Available):可用遞歸。該字段只出現在響應報文中。當值為 1 時,表示服務器支持遞歸查詢。
- Z:保留字段,在所有的請求和應答報文中,它的值必須為 0。
- rcode(Reply code):返回碼字段,表示響應的差錯狀態。當值為 0 時,表示沒有錯誤;當值為 1 時,表示報文格式錯誤(Format error),服務器不能理解請求的報文;當值為 2 時,表示域名服務器失敗(Server failure),因為服務器的原因導致沒辦法處理這個請求;當值為 3 時,表示名字錯誤(Name Error),只有對授權域名解析服務器有意義,指出解析的域名不存在;當值為 4 時,表示查詢類型不支持(Not Implemented),即域名服務器不支持查詢類型;當值為 5 時,表示拒絕(Refused),一般是服務器由於設置的策略拒絕給出應答,如服務器不希望對某些請求者給出應答。
基礎部分格式:
字段 | 長度 | 描述 |
---|---|---|
ID | 16 bit | 標識字段,客戶通過標識字段來確定DNS響應是否與查詢請求匹配。 |
QR | 1 bit | 操作類型:
|
OPCODE | 4 bit | 查詢類型:
反向查詢是客戶端請求服務器根據回答生成導致此回答的問題,這個查詢類型的使用並不多。 |
AA | 1 bit | 若置位,則表示該域名解析服務器是授權回答該域的。 |
TC | 1 bit | 若置位,則表示報文被截斷。 使用UDP傳輸時,應答的總長度超過512字節時,只返回報文的前512個字節內容。 |
RD | 1 bit | 客戶端希望域名解析服務器采取的解析方式:
|
RA | 1 bit | 域名解析服務器采取的解析方式:
|
Z | 3 bit | 全部置0,保留未用。 |
RCODE | 4 bit | 響應類型:
|
QDCOUNT | 16 bit | 無符號16位整數表示報文請求段中的問題記錄數。 |
ANCOUNT | 16 bit | 無符號16位整數表示報文回答段中的回答記錄數。 |
NSCOUNT | 16 bit | 無符號16位整數表示報文授權段中的授權記錄數。 |
ARCOUNT | 16 bit | 無符號16位整數表示報文附加段中的附加記錄數。 |
3.2、問題部分
問題部分指的是報文格式中查詢問題區域(Queries)部分。該部分是用來顯示 DNS 查詢請求的問題,通常只有一個問題。該部分包含正在進行的查詢信息,包含查詢名(被查詢主機名字)、查詢類型、查詢類。
問題部分格式如圖所示:

該部分中每個字段含義如下:
- 查詢名:一般為要查詢的域名,有時也會是 IP 地址,用於反向查詢,以0長度和空字符串來表示域名結束。
- 查詢類型:DNS 查詢請求的資源類型。通常查詢類型為 A 類型,表示由域名獲取對應的 IP 地址。
- 查詢類:地址類型,通常為互聯網地址,值為 1。
字段 | 長度 | 描述 |
---|---|---|
查詢名 | 變長 | 域名被編碼為一些labels序列,每個labels包含一個字節表示后續字符串長度,以及這個字符串,以0長度和空字符串來表示域名結束。注意這個字段可能為奇數字節,不需要進行邊界填充對齊。 |
查詢類型 | 2個字節 | 表示查詢類型,.取值可以為任何可用的類型值,以及通配碼來表示所有的資源記錄。 |
查詢類 | 2個字節 | 表示查詢的協議類,比如,IN代表Internet。 |
3.3、資源記錄部分(DNS響應時才有)
資源記錄部分是指 DNS 報文格式中的最后三個字段,包括回答問題區域字段、權威名稱服務器區域字段、附加信息區域字段。這三個字段均采用一種稱為資源記錄的格式,格式如圖所示:

資源記錄格式中每個字段含義如下:
- 域名:DNS 請求的域名。
- 類型:資源記錄的類型,與問題部分中的查詢類型值是一樣的。
- 類:地址類型,與問題部分中的查詢類值是一樣的。
- 生存時間:以秒為單位,表示資源記錄的生命周期,一般用於當地址解析程序取出資源記錄后決定保存及使用緩存數據的時間。它同時也可以表明該資源記錄的穩定程度,穩定的信息會被分配一個很大的值。
- 資源數據長度:資源數據的長度。
- 資源數據:表示按查詢段要求返回的相關資源記錄的數據。
應答,授權,附加段都共用相同的格式:多個資源記錄,資源記錄的個數由報文頭段中對應的幾個數值確定,每個資源記錄格式如下:
字段 | 長度 | 描述 |
---|---|---|
NAME | 不定長 | 資源記錄包含的域名。 |
TYPE | 2個字節 | 表示資源記錄的類型,指出RDATA數據的含義。 |
CLASS | 2個字節 | 表示RDATA的類。 |
TTL | 4字節 | 無符號整數,表示資源記錄可以緩存的時間。0代表只能被傳輸,但是不能被緩存。 |
RDLENGTH | 2個字節 | 無符號整數,表示RDATA的長度。 |
RDATA | 不定長 | 字符串,表示記錄,格式跟TYPE和CLASS有關。比如,TYPE是A,CLASS是IN,那么RDATA就是一個4個字節的ARPA網絡地址。 |
4、DNS查詢報文實例
//測試程序 #include <stdio.h> #include <sys/socket.h> #include <netdb.h> #include <string.h> #include <arpa/inet.h> int main() { struct hostent *hptr = NULL; char str[32]; const char * ptr = "www.baidu.com"; if( (hptr = gethostbyname(ptr) ) == NULL ) //得到域名相關信息,失敗返回NULL { printf("gethostbyname error : %s\n", hstrerror(h_errno)); //打印錯誤字符串 return -1; } struct sockaddr_in me; int i = 0; for (; hptr->h_addr_list[i]; i++) //h_addr_list[i]中有多個ip,則h_addr_list[i]不為空 { memset(&me, 0, sizeof(struct sockaddr_in)); memcpy(&me.sin_addr, hptr->h_addr_list[i], hptr->h_length); printf("address:%s\n", inet_ntop(hptr->h_addrtype, &me.sin_addr, str, sizeof(str))); printf("hptr->h_name:%s\n", hptr->h_name); printf("me.sin_addr.s_addr [%u]\n", ntohl(me.sin_addr.s_addr)); //網絡序轉換成主機序 printf("\n"); } return 0; }
4.1、DNS 請求數據包報文
圖中的數據包為 DNS 查詢請求包,查詢請求包只包含基礎結構部分和查詢問題區域,為了方便講解這里將信息列出進行說明:
Frame 60: 103 bytes on wire (824 bits), 103 bytes captured (824 bits) on interface \Device\NPF_{CFE29DA0-6701-4126-9A0F-273DF6D359B2}, id 0 Ethernet II, Src: VMware_c9:23:23 (00:0c:29:c9:23:23), Dst: HuaweiDe_05:07:1d (04:f1:69:05:07:1d) Internet Protocol Version 4, Src: 192.168.1.102, Dst: 192.168.1.1 User Datagram Protocol, Src Port: 48591, Dst Port: 53 Domain Name System (query) Transaction ID: 0x271c #事務ID Flags: 0x0000 Standard query #報文中的標志字段 0... .... .... .... = Response: Message is a query #QR字段, 值為0, 因為是一個請求包 .000 0... .... .... = Opcode: Standard query (0) #Opcode字段, 值為0, 因為是標准查詢 .... ..0. .... .... = Truncated: Message is not truncated #TC字段 .... ...0 .... .... = Recursion desired: Don't do query recursively #RD字段 .... .... .0.. .... = Z: reserved (0) #保留字段, 值為0 .... .... ...0 .... = Non-authenticated data: Unacceptable #保留字段, 值為0 Questions: 1 #問題計數, 這里有1個問題 Answer RRs: 0 #回答資源記錄數 Authority RRs: 0 #權威名稱服務器計數 Additional RRs: 0 #附加資源記錄數 Queries #問題部分 www.baidu.com: type A, class IN Name: www.baidu.com #查詢名字段, 這里請求域名baidu.com [Name Length: 13] [Label Count: 3] Type: A (Host Address) (1) #查詢類型字段, 這里為A類型 Class: IN (0x0001) #查詢類字段, 這里為互聯網地址 [Response In: 18]
這里需要注意的是,在請求中 Questions 的值不可能為 0;Answer RRs,Authority RRs,Additional RRs 的值都為 0,因為在請求中還沒有響應的查詢結果信息。這些信息在響應包中會有相應的值。
4.2、 DNS 響應數據包報文
(1)基礎結構部分
Frame 57: 302 bytes on wire (2416 bits), 302 bytes captured (2416 bits) on interface \Device\NPF_{CFE29DA0-6701-4126-9A0F-273DF6D359B2}, id 0 Ethernet II, Src: HuaweiDe_05:07:1d (04:f1:69:05:07:1d), Dst: VMware_c9:23:23 (00:0c:29:c9:23:23) Internet Protocol Version 4, Src: 192.168.1.1, Dst: 192.168.1.102 User Datagram Protocol, Src Port: 53, Dst Port: 48591 Domain Name System (response) Transaction ID: 0x1bd2 #事務ID Flags: 0x8180 Standard query response, No error #報文中的標志字段 1... .... .... .... = Response: Message is a response #QR字段, 值為1, 因為是一個響應包 .000 0... .... .... = Opcode: Standard query (0) # Opcode字段 .... .0.. .... .... = Authoritative: Server is not an authority for domain #AA字段 .... ..0. .... .... = Truncated: Message is not truncated #TC字段 .... ...1 .... .... = Recursion desired: Do query recursively #RD字段 .... .... 1... .... = Recursion available: Server can do recursive queries #RA字段 .... .... .0.. .... = Z: reserved (0) .... .... ..0. .... = Answer authenticated: Answer/authority portion was not authenticated by the server .... .... ...0 .... = Non-authenticated data: Unacceptable .... .... .... 0000 = Reply code: No error (0) #返回碼字段 Questions: 1 Answer RRs: 3 Authority RRs: 5 Additional RRs: 5 Queries Answers Authoritative nameservers Additional records [Request In: 53] [Time: 0.048977000 seconds]
以上輸出信息中加粗部分為 DNS 響應包比請求包中多出來的字段信息,這些字段信息只能出現在響應包中。在輸出信息最后可以看到 Answer RRs,Authority RRs,Additional RRs 都有了相應的值(不一定全為 0)。
(2)查詢問題區域
Frame 57: 302 bytes on wire (2416 bits), 302 bytes captured (2416 bits) on interface \Device\NPF_{CFE29DA0-6701-4126-9A0F-273DF6D359B2}, id 0 Ethernet II, Src: HuaweiDe_05:07:1d (04:f1:69:05:07:1d), Dst: VMware_c9:23:23 (00:0c:29:c9:23:23) Internet Protocol Version 4, Src: 192.168.1.1, Dst: 192.168.1.102 User Datagram Protocol, Src Port: 53, Dst Port: 48591 Domain Name System (response) Transaction ID: 0x1bd2 Flags: 0x8180 Standard query response, No error Questions: 1 Answer RRs: 3 Authority RRs: 5 Additional RRs: 5 Queries #問題部分 www.baidu.com: type A, class IN Name: www.baidu.com #查詢名字段, 這里請求域名baidu.com [Name Length: 13] [Label Count: 3] Type: A (Host Address) (1) #查詢類型字段, 這里為A類型 Class: IN (0x0001) #查詢類字段, 這里為互聯網地址 Answers Authoritative nameservers Additional records [Request In: 53] [Time: 0.048977000 seconds]

Frame 57: 302 bytes on wire (2416 bits), 302 bytes captured (2416 bits) on interface \Device\NPF_{CFE29DA0-6701-4126-9A0F-273DF6D359B2}, id 0 Ethernet II, Src: HuaweiDe_05:07:1d (04:f1:69:05:07:1d), Dst: VMware_c9:23:23 (00:0c:29:c9:23:23) Internet Protocol Version 4, Src: 192.168.1.1, Dst: 192.168.1.102 User Datagram Protocol, Src Port: 53, Dst Port: 48591 Domain Name System (response) Transaction ID: 0x1bd2 Flags: 0x8180 Standard query response, No error Questions: 1 Answer RRs: 3 Authority RRs: 5 Additional RRs: 5 Queries Answers #“回答問題區域”字段 www.baidu.com: type CNAME, class IN, cname www.a.shifen.com Name: www.baidu.com Type: CNAME (Canonical NAME for an alias) (5) Class: IN (0x0001) Time to live: 1036 (17 minutes, 16 seconds) Data length: 15 CNAME: www.a.shifen.com www.a.shifen.com: type A, class IN, addr 14.215.177.38 #資源記錄部分 Name: www.a.shifen.com #域名字段 Type: A (Host Address) (1) #類型字段, 這里為A類型 Class: IN (0x0001) #類字段 Time to live: 600 (10 minutes) #生存時間 Data length: 4 #數據長度 Address: 14.215.177.38 #資源數據, 這里為IP地址 www.a.shifen.com: type A, class IN, addr 14.215.177.39 Name: www.a.shifen.com Type: A (Host Address) (1) Class: IN (0x0001) Time to live: 600 (10 minutes) Data length: 4 Address: 14.215.177.39 Authoritative nameservers Additional records [Request In: 53] [Time: 0.048977000 seconds]
(4)權威名稱服務器區域
Frame 57: 302 bytes on wire (2416 bits), 302 bytes captured (2416 bits) on interface \Device\NPF_{CFE29DA0-6701-4126-9A0F-273DF6D359B2}, id 0 Ethernet II, Src: HuaweiDe_05:07:1d (04:f1:69:05:07:1d), Dst: VMware_c9:23:23 (00:0c:29:c9:23:23) Internet Protocol Version 4, Src: 192.168.1.1, Dst: 192.168.1.102 User Datagram Protocol, Src Port: 53, Dst Port: 48591 Domain Name System (response) Transaction ID: 0x1bd2 Flags: 0x8180 Standard query response, No error Questions: 1 Answer RRs: 3 Authority RRs: 5 Additional RRs: 5 Queries Answers Authoritative nameservers #“權威名稱服務器區域”字段 a.shifen.com: type NS, class IN, ns ns5.a.shifen.com #資源記錄部分 Name: a.shifen.com Type: NS (authoritative Name Server) (2) #類型字段, 這里為NS類型 Class: IN (0x0001) Time to live: 1138 (18 minutes, 58 seconds) Data length: 6 Name Server: ns5.a.shifen.com #權威名稱服務器 a.shifen.com: type NS, class IN, ns ns3.a.shifen.com a.shifen.com: type NS, class IN, ns ns1.a.shifen.com a.shifen.com: type NS, class IN, ns ns2.a.shifen.com a.shifen.com: type NS, class IN, ns ns4.a.shifen.com Additional records [Request In: 53] [Time: 0.048977000 seconds]
(5)附加信息區域字段
Frame 57: 302 bytes on wire (2416 bits), 302 bytes captured (2416 bits) on interface \Device\NPF_{CFE29DA0-6701-4126-9A0F-273DF6D359B2}, id 0 Ethernet II, Src: HuaweiDe_05:07:1d (04:f1:69:05:07:1d), Dst: VMware_c9:23:23 (00:0c:29:c9:23:23) Internet Protocol Version 4, Src: 192.168.1.1, Dst: 192.168.1.102 User Datagram Protocol, Src Port: 53, Dst Port: 48591 Domain Name System (response) Transaction ID: 0x1bd2 Flags: 0x8180 Standard query response, No error Questions: 1 Answer RRs: 3 Authority RRs: 5 Additional RRs: 5 Queries Answers Authoritative nameservers Additional records #“附加信息區域”字段 ns5.a.shifen.com: type A, class IN, addr 180.76.76.95 #資源記錄部分 Name: ns5.a.shifen.com #“權威名稱服務器”名稱 Type: A (Host Address) (1) #類型字段, 這里為A類型 Class: IN (0x0001) Time to live: 426 (7 minutes, 6 seconds) Data length: 4 Address: 180.76.76.95 #“權威名稱服務器”的IP地址 ns1.a.shifen.com: type A, class IN, addr 110.242.68.42 ns2.a.shifen.com: type A, class IN, addr 220.181.33.32 ns3.a.shifen.com: type A, class IN, addr 112.80.255.253 ns4.a.shifen.com: type A, class IN, addr 14.215.177.229 [Request In: 53] [Time: 0.048977000 seconds]
其中,Name 的值為“權威名稱服務器”名稱,Type 的值為 A,表示獲取域名對應的 IP 地址;Address 的值顯示了所有獲取到的權威名稱服務器對應的 IP 地址。