基於LWIP協議棧實現DNS服務

前言

TCP/IP協議是網絡通信的基礎,日常在對TCP/IP協議設置時會涉及到IP地址,子網掩碼,默認網關和DNS這幾個參數。這裏咱們主要談下IP地址和DNS這兩個參數之間的關係。瀏覽器

首先計算機在網絡中進行通信時只能識別「101.86.134.121」之類的IP地址,那麼爲何咱們平時在訪問網站時只在瀏覽器地址欄中輸入「www.baidu.com」之類的域名就能看到所須要的頁面呢?這是由於DNS服務器在起到一個翻譯的做用。這麼作的緣由其實很容易理解,由於IP地址沒有規律,很難記,可是訪問網站必需要事先知道對方服務器的IP地址,那麼就選擇了像www.baidu.com,www.163.com這些有意義的字符串(域名)代替了IP地址,同時發明了DNS服務器對這些域名進行解析,DNS服務器知道全部域名對應的IP地址,當咱們訪問www.baidu.com的時候,計算機會去向DNS服務器查詢這個域名對應的IP地址,當計算機拿到IP地址後就能夠訪問該網站了。緩存


DNS查詢

DNS 查詢的過程以下:服務器

  • 在瀏覽器中輸入http://www.baidu.com域名,計算機會先檢查本身本地的hosts文件、本地DNS解析器緩存是否有這個網址映射關係,若是有則直接返回,完成域名解析。
  • 若是hosts與本地DNS解析器緩存都沒有相應的網址映射關係,會經過TCP/IP參數中設置的首選DNS服務器進行查詢,若是該服務器具備網址映射關係,則調用這個IP地址映射,完成域名解析。
  • 當以上的DNS服務器和緩存解析都失效了,則會將請求轉發至上一級DNS服務器或根DNS進行解析,以此循環。該過程屬於DNS服務器之間的交互查詢。

使用瀏覽器請求網站,經過Wireshark抓包分析DNS數據包以下所示:DNS爲應用層協議,在傳輸層UDP協議基礎上實現,DNS目的端口(Dst Port)是53,域名爲www.baidu.com,DNS服務器的IP地址是(172.20.1.2 在網絡鏈接中配置)。做爲DNS服務器,能夠經過監聽網卡53端口號的數據來得到DNS數據包,對應DNS協議格式進行解析。網絡

圖片描述


LWIP實現

接下來說述下LwIP協議棧對DNS服務的支持。LwIP是應用於嵌入式領域的輕量級開源以太網協議棧, 它使用C語言實現很是方便移植,並且支持socket接口,所以使用十分普遍。LwIP協議棧中涉及到DNS服務的代碼爲dns.c文件,主要功能是完成ipv4的客戶端域名解析,不涉及複雜的服務器端的處理過程。客戶端調用API接口能夠實現DNS查詢請求,解析DNS響應,創建本地緩存。socket

  • 宏定義開啓DNS模塊

圖片描述

  • 配置DNS服務器地址,相似在網絡鏈接中配置DNS服務器地址,也能夠經過DHCP方式自動分配

圖片描述

  • DNS初始化,其中包括建立UDP pcb,配置默認DNS服務器,若是有本地緩存則初始化緩存列表(該函數在初始化時執行)。

圖片描述

  • 經過域名字符串解析出IP地址。客戶端須要根據域名獲取對應的IP地址時,若是不久前已經查詢過該域名對應的IP地址,那麼直接從本地DNS解析器緩存中獲取(dns_lookup函數)。不然,客戶端就以DNS客戶的身份,向DNS服務器發出查詢請求報文(dns_enqueue函數,此時返回狀態ERR_INPROGRESS正在處理,後續dns_tmr函數會週期處理請求隊列的內容)。

圖片描述

  • 該函數須要週期處理,主要做用是處理向DNS服務器請求的隊列

圖片描述

  • 該函數向隊列中加入一條向DNS服務器查詢的請求,而且根據每條請求的狀態進行對應的處理

圖片描述

  • 接收函數在初始化時註冊到UDP pcb中,用於處理接收到的DNS響應包。在接收函數中會將獲取的IP地址保存至對應的dns_table[DNS_TABLE_SIZE]中

圖片描述

圖片描述

相關文章
相關標籤/搜索