2010-01-10 50 views
1

我試圖實施排序算法,以確保我的DNS庫始終與DNS記錄的有序列表一起工作,即使響應來自循環配置。在循環DNS配置中排序響應的算法

讓我們看看以下兩個回答。

首先。

$ dig google.com A 

; <<>> DiG 9.6.0-APPLE-P2 <<>> google.com A 
;; ... 

;; ANSWER SECTION: 
google.com. 201 IN A 74.125.39.106 
google.com. 201 IN A 74.125.39.105 
google.com. 201 IN A 74.125.39.147 
google.com. 201 IN A 74.125.39.104 
google.com. 201 IN A 74.125.39.103 
google.com. 201 IN A 74.125.39.99 

;; ... 

二。

$ dig google.com A 

; <<>> DiG 9.6.0-APPLE-P2 <<>> google.com A 
;; ... 

;; ANSWER SECTION: 
google.com. 119 IN A 74.125.39.147 
google.com. 119 IN A 74.125.39.104 
google.com. 119 IN A 74.125.39.103 
google.com. 119 IN A 74.125.39.99 
google.com. 119 IN A 74.125.39.106 
google.com. 119 IN A 74.125.39.105 

;; ... 

他們除了ANSWER部分包含不同次序的DNS記錄的事實平等。 我需要應用排序算法來規範答案部分。

我已經想出了該算法的初始版本,但我添加的測試越多,發現的案例越多。 例如,在以下響應中,第一條記錄的順序必須保持不變。

$ dig www.google.com A 

; <<>> DiG 9.6.0-APPLE-P2 <<>> www.google.com A 
;; ... 

;; ANSWER SECTION: 
www.google.com. 603039 IN CNAME www.l.google.com. 
www.l.google.com. 78 IN A 74.125.39.105 
www.l.google.com. 78 IN A 74.125.39.104 
www.l.google.com. 78 IN A 74.125.39.147 
www.l.google.com. 78 IN A 74.125.39.106 
www.l.google.com. 78 IN A 74.125.39.99 
www.l.google.com. 78 IN A 74.125.39.103 

;; ... 

是否有任何一種現有的實現/參考我可以讀取以提取合適的算法?

更新:對我原來的問題的一些澄清。我不需要一個圖書館來獲取DNS記錄,I've got it。 我需要找到一個有效的算法來排序答案的答案部分。

此外,請記住問題不限於一個問題。原始的DNS查詢可能是NS查詢,CNAME查詢或任何你想要的。

我正在使用Ruby,但這與問題本身無關。

回答

2

根據您使用的語言,將所有答案放在散列/字典中,根據類型/地址將數組放入葉中,這可能會更簡單。

我推薦tie :: sorted :: array :: lazy,如果你使用perl的話。

+0

'ruby'標籤沒有給你提示語言的提示嗎? – womble 2010-01-10 20:28:51

+0

這正是我想到的規則。這似乎是最合理的解決方案。 – 2010-01-11 13:15:34

0

應該有一個庫可用於大多數編程語言來獲取給定主機名的IP地址列表。它會像gethostbyname這樣會返回一個IP地址數組,你可以像任何標準數組那樣排序。在PHP中它是gethostbynamel,在Ruby中它是Socket :: gethostbyname。

有沒有必要通過自己獲取DNS記錄的過程,但如果你真的想要那麼DNS規則是非常簡單的。主機名將返回CNAME或A記錄(假設我們只是處理IPv4);一個A記錄將返回IP地址,如果你得到一個CNAME,你會想使用遞歸來獲取CNAME結果的A記錄。

+0

我不需要一個庫來獲取DNS記錄。我需要找出一個有效的算法來排序響應。 – 2010-01-11 11:38:13

0
  1. 獲取IP地址列表。
  2. 將IP地址轉換爲整數表示。
  3. 按整數表示對IP地址進行排序。
  4. 利潤。
+0

這是行不通的,因爲正如我在答案中所解釋的那樣,有一些例外。您不能簡單地對響應中的所有記錄進行排序,因爲無法將CNAME記錄與A記錄進行比較等等。 – 2010-01-11 11:37:25

0

請問您能解釋一下爲什麼需要排序嗎?

通常,數據包的每個部分內的DNS記錄的順序是不相關的。也不保證兩個連續的查詢將返回可能記錄的相同子集。

+0

我需要對它們進行排序,因爲排序後的列表在後續必須比較數千條記錄時效率更高。 – 2010-01-11 11:36:49

+0

只需將它們寫入數據庫並在需要對其進行比較時對其進行分類。 C. – symcbean 2010-01-11 12:12:59

+0

這是我可以做的事情。問題是另一個:是否有任何參考資料來排序答案部分。正如我的問題所解釋的,我不能簡單地按IP排列答案,因爲根據原始查詢,某些記錄具有更高的優先級。 – 2010-01-11 12:43:00