我目前正在C中实现一个小而快的dns-resolver。通常,在将它的请求发送到根名称服务器之前,dns-resolver会询问本地缓存,然后是路由器的缓存等等。 ,但就我而言,我只想解决可能未在本地保存的名称。那么解决主机名的最快方法是什么?
将数据包发送到我的本地名称服务器(在我的情况下是我的路由器),或直接发送到根名称服务器?我将选择哪个root-nameserver是否重要?我应该随机选择它们(从13个root-dns服务器的列表中)?
答案 0 :(得分:1)
解析名称是一件棘手的事。它从一开始看起来很容易,但它确实充斥着一些让它“变得不那么容易”的东西。因此,最好的办法实际上是使用现有的实现而不是自己的实现,因为有很多可供选择,而且大多数都非常好。如果您的本地名称服务器(路由器)中有一个解析器,只需使用它,因为它会处理复杂性(但它本身会有一个缓存)。
如果您打算自行解决,那么您需要做的不仅仅是在根名称服务器上发出请求。你需要随机发出一个请求,处理如果你没有得到回应会发生什么(尝试另一个),然后当你得到答案时,它不会是你正在寻找的答案。如果您向它发送“www.example.com”请求,它只是列出“com”的所有名称服务器(在NS记录中)并告诉您接下来询问它们。然后你需要去问com,谁会告诉你去问example.com的名称服务器并告诉你去问他们。同时,example.com的NS记录实际上可能指向您在其他地方命名服务器,例如“dns1.example.net”,这意味着您需要再次从根开始查看如何获得示例。网络名称服务器。
无论如何,以上实际上是一种简化,信不信由你。所以,是的:您应该询问本地路由器或ISP的解析器,而不是自己动手。如果您确实希望在本地对应用程序执行此操作,请选择一个主要的C实现来为您执行此操作而不是重写。除非你想学到很多东西(这总是好事)。