📜  如何实现正向DNS查找缓存?

📅  最后修改于: 2021-04-17 11:49:46             🧑  作者: Mango

我们已经讨论了反向DNS查找缓存的实现。正向DNS查找正在获取在Web浏览器中键入的给定域名的IP地址。

缓存应执行以下操作:
1.添加从URL到IP地址的映射
2.查找给定URL的IP地址。

我们需要纳入反向DNS查找缓存的一些更改。
1.我们需要注意[AZ],[az]和(。)点而不是[0-9]和(。)点。由于大多数域名仅包含小写字符,我们可以假定每个trie节点将有[az]和(。)27个子代。

2.当我们在浏览器中输入www.google.in和google.in时,将带我们到同一页面。因此,我们需要在Trie中为www(。)之后的单词添加一个域名。同样,在搜索域名对应的IP地址时,如果用户提供了www(。),则将其删除。

这只是一项练习,为简单起见,我们已经使用了www。还。

一种解决方案是使用哈希。在本文中,将讨论基于Trie的解决方案。基于Trie的解决方案的一个优势是,对于Trie,最坏情况的上限是O(1),对于哈希,最好的平均情况下时间复杂度是O(1)。同样,使用Trie,我们可以实现前缀搜索(为URL的公共前缀查找所有IP)。 Trie的一般缺点是需要大量内存。
这个想法是将URL存储在Trie节点中,并将相应的IP地址存储在最后一个节点或叶节点中。

以下是C++中的C样式实现。

// C based program to implement reverse DNS lookup
#include
#include
#include
  
// There are atmost 27 different chars in a valid URL
// assuming URL consists [a-z] and (.)
#define CHARS 27
  
// Maximum length of a valid URL
#define MAX 100
  
// A utility function to find index of child for a given character 'c'
int getIndex(char c)
{
    return (c == '.') ? 26 : (c - 'a');
}
  
// A utility function to find character for a given child index.
char getCharFromIndex(int i)
{
    return (i == 26) ? '.' : ('a' + i);
}
  
// Trie Node.
struct trieNode
{
    bool isLeaf;
    char *ipAdd;
    struct trieNode *child[CHARS];
};
  
// Function to create a new trie node.
struct trieNode *newTrieNode(void)
{
    struct trieNode *newNode = new trieNode;
    newNode->isLeaf = false;
    newNode->ipAdd = NULL;
    for (int i = 0; ichild[i] = NULL;
    return newNode;
}
  
// This method inserts a URL and corresponding IP address
// in the trie. The last node in Trie contains the ip address.
void insert(struct trieNode *root, char *URL, char *ipAdd)
{
    // Length of the URL
    int len = strlen(URL);
    struct trieNode *pCrawl = root;
  
    // Traversing over the length of the URL.
    for (int level = 0; levelchild[index])
            pCrawl->child[index] = newTrieNode();
  
        // Move to the child
        pCrawl = pCrawl->child[index];
    }
  
    //Below needs to be carried out for the last node.
    //Save the corresponding ip address of the URL in the
    //last node of trie.
    pCrawl->isLeaf = true;
    pCrawl->ipAdd = new char[strlen(ipAdd) + 1];
    strcpy(pCrawl->ipAdd, ipAdd);
}
  
// This function returns IP address if given URL is
// present in DNS cache. Else returns NULL
char  *searchDNSCache(struct trieNode *root, char *URL)
{
    // Root node of trie.
    struct trieNode *pCrawl = root;
    int  len = strlen(URL);
  
    // Traversal over the length of URL.
    for (int level = 0; levelchild[index])
            return NULL;
        pCrawl = pCrawl->child[index];
    }
  
    // If we find the last node for a given ip address,
    // print the ip address.
    if (pCrawl != NULL && pCrawl->isLeaf)
        return pCrawl->ipAdd;
  
    return NULL;
}
  
// Driver function.
int main()
{
    char URL[][50] = { "www.samsung.com", "www.samsung.net",
                       "www.google.in"
                     };
    char ipAdd[][MAX] = { "107.108.11.123", "107.109.123.255",
                          "74.125.200.106"
                        };
    int n = sizeof(URL) / sizeof(URL[0]);
    struct trieNode *root = newTrieNode();
  
    // Inserts all the domain name and their corresponding
    // ip address
    for (int i = 0; i %s",
               url, res_ip);
    else
        printf("Forward DNS look up not resolved in cache ");
  
    return 0;
}

输出:

Forward DNS look up resolved in cache:
www.samsung.com --> 107.108.11.123