Различия между версиями 13 и 14
Версия 13 от 2008-07-13 12:59:28
Размер: 21413
Редактор: George Tarasov
Комментарий:
Версия 14 от 2008-07-13 12:59:59
Размер: 21413
Редактор: George Tarasov
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 37: Строка 37:
|| 29 || 1 || 1 || 1 || || 1 || ArtemSerebriyskiy, GeorgeTarasov + ОльгаТочилкина, VsevolodKrishchenko|| || || || 50 || 1 || 1 || 1 || || 1 || ArtemSerebriyskiy, GeorgeTarasov + ОльгаТочилкина, VsevolodKrishchenko|| || ||

Преобразование имён и IP-адресов: теория

Из всех служб, работающих на прикладном уровне в качестве программ-обработчиков сетевых запросов, существует как минимум одна сетевая служба, без которой работать очень тяжело, если вообще возможно. Эта служба называется DNS (Domain Name Service). В чём её смысл? В прошлый раз мы говорили о том, на каких условиях, как и кем раздаются ip-адреса (ICAAN, региональные провайдеры, локальные, и т.д.). Если посмотреть на технологию маршрутизации, то можно увидеть, что структура сети с точки зрения IP-адресов строго подчиняется топологии. Если несколько компьютеров объединены в единую локальную сеть, то у них будут адреса одной сети, а если компьютеры находятся в разных локальных сетях,то у них будут существенно разные IP-адреса. Если какая-нибудь организация сначала получила 10 адресов из диапазона, а затем ей оказалось этого мало и она получила ещё 100, то, тем не менее, эти два диапазона IP-адресов вполне могут быть совершенно разными, поскольку они отражают не тот факт, какая конкретная организация ими владеет, а тот факт, какая "часть" интернета ими занята, т.е. топологию.

Это очень неудобно с социальной точки зрения, так как мы не можем без дополнительной информации ответить на вопрос о том, чья же сеть перед нами, что это за компьютеры, и так далее. Другая проблема состоит в том, что человек довольно тяжело запоминает числа. Представьте себе, если бы мы набирали в браузере вместо имен сайтов четырехбайтные IP-адреса. Это крайне неудобно. Поэтому хочется решить сразу две задачи: присвоить всем компьютерам имена, чтобы идентифицировать их ими, и так составить эти имена, чтобы отражали не топологическую структуру интернета, а административную, то есть чтобы по имени компьютера было понятно, какой организации он принадлежит. Более того, в качестве бонуса, или даже в качестве решения этой проблемы сама процедура выдачи этих имён должна подчиняться этой административной структуре интернета. Задача именования всех компьютеров в интернете сложнее, чем задача их перенумерации. Сложнее потому, что в отличии от перенумерации административная структура никак не подчиняется физическим аспектам сети. Соответственно, пытаться создавать централизованную базу всех имён всех компьютеров в интернете --- это шаг в заведомо неверном направлении, так как это очень сложно, и учитывая, что интернет испытывает сбои, такая база никогда не будет актуальна - там будут устаревшие части и не будет вновь появившихся, к тому же нагрузка на эту базу будет слишком высокой. Поэтому возникла идея устроить не только процесс именования, но и процесс раздачи имён не с помощью единого хранилища, а пирамидально.

Процесс организован следующим образом: существует несколько корневых серверов, которые ни в коем случае не знают все имена всех компьютеров в сети (и, более того, не обязаны этого знать), но содержащих информацию о зонах, состоящих из одного имени. Например, зона ru, com, info, de... Во-первых, они знают о том, какие имена первого уровня существуют в принципе, поскольку их немного. Недавно их было совсем мало --- в старых справочниках по интернету указывались только com, net, org, edu, gov и еще несколько зон, связанных с государствами, по двух-буквенным кодам. В какой-то момент было принято решение сильно расширить диапазон, а недавно приняли решение, что для записи имен зон будет использоваться Юникод.

Корневые сервера знают о наличии так называемых зон, а именно о том, какие вообще бывают окончания у доменных имен. Помимо этого, они также знают адреса серверов, обладающих информацией о содержимом этих зон --- т.е. о компьютерах, имена которых кончаются на окончание зоны. Указанные сервера называются серверами имен (nameserver).

Важное добавление: соответствие имени и ip-адреса. Во времена, когда адресов в интернете было где-то около 15, существовал файл под названием /etc/hosts, который содержал базу данных по всем именам этих адресов. Его формат очень простой --- ip-адрес и имена, ему соответствующие. Идея состоит в том, что даже когда компьютеров всего 15, может так случиться, что один компьютер будет иметь несколько имен. Почему? Потому что он может выступать в нескольких ипостасях --- с одной стороны это компьютер, принадлежащий какой-либо организации, а с другой стороны, к примеру --- компьютер, участвующий в таком-то проекте. И соответственно, если мы хотим подключиться к этой организации, мы вспомним, что его имя связано с именем организации, а если мы хотим подключиться к проекту --- что его имя связанно с именем проекта. В данном случае мы видим, что имена устроены весьма примитивно. К существующей схеме пришли не от хорошей жизни. Когда компьютеров стало очень много, то:

  • во-первых, оказалось, что администраторы сетей почему-то хотят сами именовать свои компьютеры;
  • во-вторых --- администраторы всех компьютеров на свете почему-то не хотят скачивать постоянно /etc/hosts из центрального хранилища, предпочитая писать /etc/hosts собственноручно, и он, естественно, не совпадает у всех компьютеров в интернете.

В какой-то момент стало очевидным то, что файлом /etc/hosts дело ограничиться не может и что надо создать некую систему, которая сама преобразовывала строковое имя в числовой адрес и обратно. Но если общего файла не существует, то надо использовать некую программу с этими функциями. А тогда появилась идея: поскольку администраторы сами пишут /etc/hosts, то пусть они и дальше сами раздают имена компьютерам в своей области владения, т.е.: ты администрируешь какие-то компьютеры --- значит, раздать им имена --- тоже твоя обязанность. Таким образом, решается задача (1) --- преобразования доменных имен в адреса и обратно (поскольку все подключения по-прежнему осуществляются по IP-адресу , а служба доменных имен- это всего лишь надстройка для удобства, а вовсе не необходимая сущность). Поэтому прежде чем произойдет обмен данными между машинами, если в качестве ip-адреса указанно доменное имя, то необходимо запросить DNS, преобразовать это имя в ip и затем соединиться. Решение задачи состоит в том что у каждого системного администратора свой файл преобразования хостов и IP-адресов. Точнее не файл, а специальная таблица. но распределенная по вышеизложенной схеме.

Итак у нас есть корневые сервера, которые выдают ответ на вопрос довольно простого свойства --- во-первых, существует ли в принципе такое имя (проверяя окончание), и, если оно существует, то где находится сервер, знающий про имена с такими окончаниями (т.е. nameserver).

Если посмотреть в словаре слово домен, мы узнаем, что оно появилось очень давно, и означает оно область владений феодального вассала. Феодальная структура была устроена пирамидально и самое главное - по принципу (соблюденному и в DNS) "вассал моего вассала --- не мой вассал". Т.е. сервер отвечает за своих непосредственных подчиненных, и не отвечает за прямых подчиненных, которые не являются непосредственными. Рассмотрим имя imap.cs.msu.ru. Сервер, который отвечает за зону ru, отвечает только за те компьютеры, которые имеют двусложные имена, оканчивающиеся на ru, например, www.ru, msu.ru. А если в имени больше составляющих, то nameserver зоны ru не обязан знать ip адрес этого хоста (хотя он может хранить его случайно). Но он обязан знать адрес nameserver'а msu.ru. Дальше запрашивается msu.ru, а он уже обязан ответить, кто такой cmc.msu.ru, и так далее. В итоге мы получим в ответ либо ip-адрес, либо сообщение о том, что такого домена нету.

По сути, мы описали иерархическую распределённую базу данных. Если мы почитаем документацию к bind --- nameserver, чаще всего использующийся в Linux --- то увидим, что это не просто база данных, ведь там можно хранить что угодно --- любые текстовые поля, любые поля, соответствующие IP-адресам. Существует также RFC, описывающий, как хранить внутри текстовых полей данные разного типа.

Есть некая проблема, связанная с тем, чтобы добраться до ip-адреса, соответствующего imap.cmc.msu.su. Неужели, каждый раз, когда нам понадобится, находясь в каком-то другом домене, зайти на факультетский почтовой сервер, потребуется запрашивать корневой сервер? Тогда зачем все это было придумано? Оказывается, для того, чтобы узнать ip-адрес машины, нам всё равно надо идти на корневой сервер. Как была база данных с единым узким местом, так и осталась. Но для того, чтобы эту процедуру сделать более эффективной, есть три идеи, которые сильно облегчают нагрузку:

  1. Каждая таблица с записью соответствия ip-адреса доменному имени содержит в себе информацию. о том, в течение какого времени эта таблица а)действительна и б)может не меняться (время жизни и задержка на изменение). То есть, если мы один раз выяснили, что имени imap.cs.msu.ru соответствует некий адрес, то в течение времени задержки на изменение --- т.е. времени, в течении которого эта запись гарантированно не будет меняться --- мы можем эту запись закэшировать и не обращаться к nameserver'ам в дальнейшем. Каждая такая таблица имеет свое время жизни (около недели), и время, в течение которого содержимое считается актуальным. Это сильно снижает нагрузку, поскольку в первый раз происходит, взаимодействие по всей иерархии DNS, а в следующие разы взаимодействия не происходит, пока время задержки на изменение еще не истекло. И даже когда время актуальности истечёт, то возможно, что не будет происходить все преобразование имени, а произойдет всего лишь запрос вышестоящему nameserver'у, не обновились ли данные у него. И если он отвечает "нет", то записью можно пользоваться дальше.
  2. Чем больше в распределенной системе узлов, тем ниже совокупная надёжность самой системы. Для борьбы с этим тоже годится использование кеширования. Сильно повышает надежность требование, чтобы NS-серверов было более одного. И желательно, чтобы у них были существенно разные ip. При этом для удобства администратора система устраивается так, что пользователю было абсолютно всё равно, какой из NS-серверов ему ответил. Все NS-сервера равноправны. Вопрос: а как несчастный администратор будет редактировать файлы сразу на двух машинах, которые лежат в абсолютно разных местах интернета? Ответ: На самом деле среди этих машин есть главная, но об этом знает только администратор. И он редактирует файл только на ней, а остальные просто скачивают с нее.
  3. Некоторое ограничение свободы обычного пользователя. Дело вот в чём: если вы обращаетесь к какому-либо NS-серверу с запросом относительно преобразования ip-адреса, никакого отношения к домену, за который отвечает этот сервер, не имеющего, то он имеет право ответить "не знаю". Такой запрос (на который можно получить ответ "не знаю") называется нерекурсивным. Все DNS-сервера в сети отвечают на нерекурсивные запросы. Другой вариант: когда вы обращаетесь к серверу с т.н. рекурсивным запросом, тогда NS-сервер самостоятельно обращается к корневому и так далее. В итоге либо преобразование будет произведено, либо вам ответят, что нет такого имени, либо вам ответят, что время запроса превысило лимит (timeout). И в отличие от нерекурсивного запроса, рекурсивные запросы обычно разрешены только для "своих" машин, т.е. решение, удовлетворяет ли сервер рекурсивные запросы или нет, принимает системный администратор этого сервера. В результате получается так, что далеко не все компьютеры могут посылать далеко не всем NS-серверам рекурсивные запросы. Как правило существует два уровня: существует некая группа адресов, которым доверяют и они могут посылать рекурсивные запросы, а остальным нельзя.


Сведения о ресурсах

Готовность (%)

Продолжительность (ак. ч.)

Подготовка (календ. ч.)

Полный текст (раб. д.)

Предварительные знания

Level

Maintainer

Start date

End date

50

1

1

1

1

ArtemSerebriyskiy, GeorgeTarasov + ОльгаТочилкина, VsevolodKrishchenko


PspoClasses/080703/01DNSTheory (последним исправлял пользователь eSyr 2008-10-10 00:15:58)