Чтобы помочь вам понять, как работает Internet, мы посмотрим, что происходит, когда вы выполняете обычную Internet-операцию — указываете браузеру открыть заглавную страницу этого документа, дом которого в Web на Linux Documentation Project. Этот документ:
http://www.tldp.org/HOWTO/Unix-and-Internet-Fundamentals-HOWTO/index.html |
это значит, что он живёт в файле HOWTO/Unix-and-Internet-Fundamentals-HOWTO/index.html в каталоге, предназначенном для экспорта в World Wide Web на хосте www.tldp.org.
Первое, что делает ваш браузер, — устанавливает соединение по сети с машиной, на которой живёт документ. Чтобы сделать это, он, во-первых, устанавливает местоположение хоста (host) www.tldp.org («хост» это сокращённое именование «узел сети» или «сетевой компьютер»; www.tldp.org — это символьное имя хоста (hostname)). Соответствующее ему местоположение в действительности имеет номер, называемый IP-адрес (IP address) (что такое «IP», мы объясним чуть позже).
Чтобы сделать это, ваш браузер задаёт вопрос программе, называемой сервер имён (name server). Сервер имён может жить на вашей машине, но вероятнее всего он запущен на специальной машине, предоставляющей подобный сервис, к которой и обращается браузер. Когда вы заключаете договор с вашим Internet-провайдером, то частью процедуры установки является настройка в программах, работающих с Internet, IP-адреса сервера имён, предоставляемого вашим провайдером.
Сервера имён на разных машинах общаются между собой, обмениваясь информацией и поддерживая её в должном состоянии, необходимом для разрешения имён хостов (перевода их в IP-адреса). Ваш сервер имён может отправить запрос в три или четыре различных места в сети в процессе разрешения www.tldp.org, но обычно это происходит очень быстро (менее секунды). Мы рассмотрим работу серверов имён подробнее в следующем параграфе.
Сервер имён даст ответ вашему браузеру, что IP-адрес www.tldp.org — 152.19.254.81; зная это, ваша машина может обмениваться информацией с www.tldp.org напрямую.
Вся сеть программ и баз данных, осуществляющих сотрудничество для преобразования имён хостов в соответствующие им адреса, называется «DNS» (Domain Name System) (Система доменных имён). Когда вы видите ссылки на «сервер DNS», это означает то, что мы по-простому называем сервером имён. Теперь я объясню полностью, как эта система работает.
Имена хостов Internet состоят из частей, разделённых точками. Домен (domain) — это собрание машин, имеющих общий суффикс в имени. Домены могут обитать внутри других доменов. Например, машина www.tldp.org живёт на .tldp.org, субдомене домена .org.
Каждый домен определён управляющим сервером имён (authoritative name server), который знает IP-адреса других машин в домене. Управляющий (или «основной» («primary»)) сервер имён может сопровождаться резервным, на случай выхода из строя; если вы видите ссылки на вторичный сервер имён (secondary name server) или («вторичный DNS»), имеется в виду именно это. Вторичные сервера обычно обновляют свою информацию каждые несколько часов, используя основные сервера, таким образом, изменения в соответствии имён хостов и IP-адресов на основном сервере автоматически распространяются на вторичный.
Теперь важная часть. Сервера имён домена не знают местоположение всех машин в других доменах (включая их субдомены); им известно только местоположения имён серверов. В нашем примере управляющий сервер имён для домена .org знает IP-адрес сервера имён для .tldp.org, но не адреса все других машин в .tldp.org.
Домены в системе DNS расположены как большое перевёрнутое дерево. На вершине находятся корневые сервера. IP-aдреса корневых серверов известны всем, они прикручены к вашему программному обеспечению, работающему с DNS. Корневые серверы знают IP-адреса серверов имён для доменов верхнего уровня, таких как .com и .org, но не адреса машин внутри этих доменов. Каждому серверу имён доменов верхнего уровня известно, где находятся сервера имён, располагающиеся непосредственно внизу него и так далее.
DNS разработан заботливо, так что каждая машина может хранить минимальный объем знаний, требуемый для формирования дерева, и локальные изменения в поддереве могут осуществляться простым изменением в базе данных имён и IP-адресов одного управляющего сервера.
Когда вы запрашиваете IP-адрес для www.tldp.org, фактически происходит следующее: во-первых, ваш сервер имён спрашивает у корневого сервера, где он может найти сервер имён .org. Узнав это, он обращается к серверу .org за тем, чтоб получить IP-адрес сервера имён .tldp.org. Получив его, делает запрос к серверу имён .tldp.org и получает адрес хоста www.tldp.org.
На самом деле, большую часть времени серверам имён не приходится выполнять столько работы. Серверы имён достаточно много кэшируют; когда вы разрешаете имя хоста, он сохраняет ассоциированный с ним IP-адрес в памяти на некоторый промежуток времени. Вот почему, когда вы посещаете новый вебсайт, обычно можно увидеть сообщение вашего браузера "Ищу", он ищет хост с впервые запрошенной вами страницей. В конце концов время хранения связки имя—адрес в кэше сервера истекает и ваш DNS запрашивает её снова — это важно, в случае изменения имён и адресов, для того чтобы неверная информация не зависала навсегда. Информация в кэше также сбрасывается, если хост оказывается недоступен.
Что хочет сделать браузер, так это послать команду Web-серверу на www.tldp.org, которая выглядит так:
GET /LDP/HOWTO/Fundamentals.html HTTP/1.0 |
Теперь о том, как это происходит. Команда упаковывается в пакет (packet), блок битов типа телеграммы, который является оболочкой для трёх важных вещей; адрес источника (source address) (IP-адрес вашей машины), адрес места назначения (destination address) (152.19.254.81), и номер сервиса (service number) или номер порта (port number) (в данном случае 80), что указывает на запрос к World Wide Web (Всемирной паутине).
Ваша машина отправляет этот пакет в путь по проводам (через вашего провайдера Internet или по локальной сети), и он перемещается к специализированной машине, называемой маршрутизатор (router). В памяти маршрутизатора находится карта Internet —, не всегда полная, но полностью описывающая ваших сетевых соседей и знающая, где в Internet находятся соседние маршрутизаторы.
Ваш пакет может пройти через несколько маршрутизаторов на пути к месту назначения. Маршрутизаторы достаточно умны. Они следят, сколько времени потребовалось пакету для достижения другого маршрутизатора и получения подтверждения о получении. Они также используют эту информацию для того, чтобы управлять движением пакетов, направляя их быстрейшим путём. Используется это и для предупреждения в тех случаях, когда другой маршрутизатор (или кабель) выходит из строя, и для балансирования нагрузки через другой маршрутизатор, если это возможно.
Существует легенда, что Internet был спроектирован так, чтобы выжить и продолжать функционировать в условиях ядерной войны. Это не правда, но именно то, как Internet спроектирован, даёт чрезвычайно хорошую и надёжную работу на всех слоях аппаратного обеспечения в этом изменчивом мире. Это прямая заслуга того, что его интеллект распределён в тысячах маршрутизаторов, а не сконцентрирован в нескольких массивных и уязвимых переключателях (как телефонная сеть). Это позволяет локализовать сбои в работе сети и обойти их.
Когда ваш пакет достигает машины места назначения, она использует номер сервиса для передачи пакета web-серверу. Web-сервер, посмотрев на исходный IP-адрес пакета, знает, куда отвечать. Когда web-сервер возвращает данный документ, он разбивается на некоторое количество пакетов. Их размер может меняться в зависимости от вида передаваемой информации и типа сервиса.
Чтобы понять, как обрабатывается передача серии пакетов, вам необходимо знать, что Internet фактически использует два протокола, один из них лежит поверх другого.
Нижний уровень, IP (Internet Protocol) (протокол Internet), отвечает за маркировку индивидуальных пакетов при обмене информацией по сети между исходным адресом и адресом места назначения. Например, когда вы взаимодействуете с http://www.tldp.org, посылаемые вами пакеты имеют IP-адрес вашего компьютера, такой как 192.168.1.101, и IP-адрес компьютера www.tldp.org, 152.2.210.81. Эти адреса работают в общем-то так же, как почтовые адреса, когда кто-то посылает вам бумажное письмо. В почтовом отделении прочитают ваш адрес, определят, где это, и как наилучшим способом переслать вам письмо, это схоже с маршрутизатором, управляющим движением в Internet.
Верхний уровень, TCP (Transmission Control Protocol) (протокол управления передачей), даёт вам надёжность. Когда две машины создают соединение TCP (используя IP), получатель знает, что надо отправить подтверждение о получении пакета отправителю. Если отправитель не увидит подтверждения о получении пакета, то через некоторое время он отправит пакет заново. Более того, отправитель назначает каждому пакету последовательный номер, который получатель использует того, чтобы собрать пакеты в нужном порядке, в случае поступления их к нему не по порядку. (Это запросто может произойти, если во время соединения отдельные участки сети работают то быстрее, то медленнее).
Пакеты TCP/IP содержат также контрольную сумму для определения, не повреждены ли данные из-за плохой связи. (Контрольная сумма вычисляется по всему пакету, таким образом, можно вычислить контрольную сумму, сравнить с указанной и обнаружить ошибку: если они не совпадают, то это значит, что либо повреждён пакет, либо сама запись контрольной суммы.) Итак, с любой точки зрения использование TCP/IP и серверов имён выглядит надёжным путём передачи потоков байт между парой «имя хоста»/«номер сервиса». Люди, создающие новые сетевые протоколы, почти никогда не задумываются обо всем этом: пакетирование, упорядочивание пакетов, проверка ошибок, контрольные суммы и переотправка, все это останется уровнем ниже.
Теперь вернёмся к нашему примеру. Web-браузеры и серверы общаются с помощью протокола приложений (application protocol), который работает поверх TCP/IP, используя его просто для передачи строк байтов туда и обратно. Этот протокол называется HTTP (Hyper-Text Transfer Protocol) (протокол передачи гипертекста), и мы уже видели одну его команду, это показанный выше GET.
Когда команда GET достигает web-сервера www.tldp.org с номером сервиса 80, она посылается демону сервера, прослушивающему 80-й порт. Большинство сервисов Internet, осуществляемых демонами сервера, не делают ничего, кроме как ожидают, наблюдая за портами, и выполняют поступившие команды.
Если описать устройство Internet одним всеобъемлющим правилом, то оно будет звучать так: все части должны быть настолько просты и доступны человеку, насколько это возможно. HTTP, его родственники (как Simple Mail Transfer Protocol, SMTP (протокол простой передачи сообщений), используемый для передачи электронной почты между хостами) склонны к использованию простых текстовых команд, оканчивающихся символом «возврат каретки/перевод строки».
Это крайне малопроизводительно, в некоторых обстоятельствах вы можете получить большую скорость, используя плотно закодированный двоичный протокол. Однако опыт показал, что выгоды от команд, легко понятных человеческим существам, перевешивают любые предельные коэффициенты повышения эффективности, которые можно получить ценой создания мудрёных и непрозрачных вещей.
Теоретически, то, что демон сервера отправляет вам в ответ посредством TCP/IP, — также текст. Начало ответа будет выглядеть примерно так (несколько заголовков опущено):
HTTP/1.1 200 OK Date: Sat, 10 Oct 1998 18:43:35 GMT Server: Apache/1.2.6 Red Hat Last-Modified: Thu, 27 Aug 1998 17:55:15 GMT Content-Length: 2982 Content-Type: text/html |
За этими заголовками следует пустая строка и текст веб-страницы (после чего соединение обрывается). Ваш браузер просто отобразит эту страницу. Заголовки скажут, как это делать (в данном случае заголовок Content-Type говорит, что возвращаемые данные на самом деле HTML).