DNS представляет распределенную децентрализованную систему для получении информации о доменах. Физичеcки dns - это сеть серверов, в которой размещен каталог, где доменные имен сопоставлены с IP-адресами. Любое доменное имя, которое было зарегистрировано у сертифицированного регистратора доменных имен и соответствует стандартам доменного имени (и которое еще не было зарегистрировано), считается действительным. Действительные доменные имена добавляются в распределенный реестр, размещенный на dns-серверах.
При отправке запроса по имени домена, например, при вводе в адресной строке браузере адреса "https://metanit.com" и отправке запроса, вначале идет запрос на один из этих dns-серверов. Каждый сервер будет проверять данное доменное имя и искать домен в своем собственном каталоге, где сопоставляются домены и IP-адреса. Если сервер или один из подчиненных серверов смог сопоставить домен с одним из ip-адресов, то сервер просто заменяет доменное имя в запросе на IP-адрес, с которым он сопоставляется, и соответствующим образом пересылает запрос. Однако, если текущий сервер не может разрешить доменное имя, он перенаправит его вверх по иерархии серверов имен в более общий родительский домен. Этот процесс продолжается до корневого сервера имен или до разрешения имени.
Для идентификации ip-адресов .NET предоставляет статический класс Dns, который располагается в пространстве имен System.Net
. В частности,
мы можем использовать следующие методы данного класса:
GetHostAddresses (string hostNameOrAddress): запрашивает DNS-сервер и возвращает все ip-адреса для определенного имени хоста в виде массива System.Net.IPAddress[]
.
Данный метод имеет асинхронного двойника в виде метода GetHostAddressesAsync(string hostNameOrAddress)
GetHostEntry (string hostNameOrAddress): запрашивает DNS-сервер и возвращает объект IPHostEntry
для определенного имени хоста или ip-адреса.
Данный метод имеет асинхронного двойника в виде метода GetHostEntryAsync(string hostNameOrAddress)
GetHostName(): возвращает имя хоста для локального компьютера
Например, получим данные по доменному имени "google.com":
using System.Net; var googleEntry = await Dns.GetHostEntryAsync("google.com"); Console.WriteLine(googleEntry.HostName); foreach (var ip in googleEntry.AddressList) { Console.WriteLine(ip); }
Метод Dns.GetHostEntryAsync()
возвращает объект IPHostEntry, который представляет информацию о хосте и у которого можно выделить два свойства: HostName (имя хоста) и
AddressList (массив объектов IPAddress - ip-адресов данного хоста).
Консольный вывод в моем случае:
google.com 142.250.74.78
В данном случае подчеркну, что IP-адрес для домена google.com может отличаться, так как серверы компании Google довольно широко распределены по миру.
Подобным образом можно использовать метод Dns.GetHostAddresses()
для получения ip-адресов для определенного домена:
using System.Net; var googleIps = await Dns.GetHostAddressesAsync("google.com"); foreach (var ip in googleIps) { Console.WriteLine(ip); }