2012-01-14 66 views
1

我目前在C中實現了一個微小且快速的dns-resolver。通常,dns-resolver會在向root-nameserver發送請求之前詢問本地緩存,然後詢問其路由器的緩存等等,但就我而言,我只想解析可能未保存在本地的名稱。那麼解決主機名最快的方法是什麼?解決未緩存域名的最快方法?

發射數據包到我的本地域名服務器(在我的情況下我的路由器),或直接發送到根名稱服務器?我要選擇哪個根名稱服務器有什麼關係?我應該隨機選擇它們嗎(從13個root-dns服務器的列表中)?

回答

1

解析名稱是一件棘手的事情。從一開始看起來很容易,但它確實充滿了一些讓它「不那麼容易」的事情。因此,最好的做法實際上是使用現有的實現,而不是自己推出,因爲有很多可供選擇的東西,其中大部分都非常好。如果你的本地域名服務器(路由器)有一個解析器,就使用它,因爲它會考慮到複雜性(但它本身會有一個緩存)。

如果您打算自行解決問題,那麼您需要做的不僅僅是在根名稱服務器上激發請求。你需要隨機發送請求給一個,處理如果你沒有得到迴應(嘗試另一個)會發生什麼,然後當你得到答案時,它不會是你正在尋找的答案。如果你發送一個「www.example.com」的請求,它只會列出所有名稱服務器的「com」(在NS記錄中)並告訴你下一步去問問他們。然後,你需要去問問com,誰會告訴你去問example.com的域名服務器,並告訴你去問問他們。同時,example.com的NS記錄實際上可能會指出您在其他地方指定服務器名稱,例如「dns1.example.net」,這意味着您需要再次從根目錄開始,以瞭解如何進行示例。網絡的名稱服務器。

無論如何,以上實際上是一種簡化,不管你信不信。所以,是的:您應該詢問本地路由器或您的ISP的解決方案,而不是自己做。如果你確實想在你的應用程序本地執行它,請選擇一個主要的C實現爲你做,而不是重寫。除非你想學很多東西(這總是一件好事)。

+1

耶,謝謝。我想我想學習很多:) – 2012-01-16 13:46:50