text: DNS ( «система доменных имён») — компьютерная распределённая система для получения информации о доменах. Чаще всего используется для получения IP-адреса по имени хоста (компьютера или устройства), получения информации о маршрутизации почты и/или обслуживающих узлах для протоколов в домене (SRV-запись). Распределённая база данных DNS поддерживается с помощью иерархии DNS-серверов, взаимодействующих по определённому протоколу. Основой DNS является представление об иерархической структуре имени и зонах. Каждый сервер, отвечающий за имя, может передать ответственность за дальнейшую часть домена другому серверу (с административной точки зрения — другой организации или человеку), что позволяет возложить ответственность за актуальность информации на серверы различных организаций (людей), отвечающих только за «свою» часть доменного имени. Начиная с 2010 года в систему DNS внедряются средства проверки целостности передаваемых данных, называемые DNS Security Extensions (DNSSEC). Передаваемые данные не шифруются, но их достоверность проверяется криптографическими способами. Внедряемый стандарт DANE обеспечивает передачу средствами DNS достоверной криптографической информации (сертификатов), используемых для установления безопасных и защищённых соединений транспортного и прикладного уровней. Ключевые характеристики DNS DNS обладает следующими характеристиками: Распределённость администрирования. Ответственность за разные части иерархической структуры несут разные люди или организации. Распределённость хранения информации. Каждый узел сети в обязательном порядке должен хранить только те данные, которые входят в его зону ответственности, и (возможно) адреса корневых DNS-серверов. Кэширование информации. Узел может хранить некоторое количество данных не из своей зоны ответственности для уменьшения нагрузки на сеть. Иерархическая структура, в которой все узлы объединены в дерево, и каждый узел может или самостоятельно определять работу нижестоящих узлов, или делегировать (передавать) их другим узлам. Резервирование. За хранение и обслуживание своих узлов (зон) отвечают (обычно) несколько серверов, разделённые как физически, так и логически, что обеспечивает сохранность данных и продолжение работы даже в случае сбоя одного из узлов. DNS важна для работы Интернета, так как для соединения с узлом необходима информация о его IP-адресе, а для людей проще запоминать буквенные (обычно осмысленные) адреса, чем последовательность цифр. В некоторых случаях это позволяет использовать виртуальные серверы, например, HTTP-серверы, различая их по имени запроса. Первоначально преобразование между доменными и IP-адресами производилось с использованием специального текстового файла hosts, который составлялся централизованно и автоматически рассылался на каждую из машин в своей локальной сети. С ростом Сети возникла необходимость в эффективном, автоматизированном механизме, которым и стала DNS. DNS была разработана Полом Мокапетрисом в 1983 году; оригинальное описание механизмов работы содержится в RFC 882 и RFC 883. В 1987 публикация RFC 1034 и RFC 1035 изменила спецификацию DNS и отменила RFC 882, RFC 883 и RFC 973 как устаревшие. Дополнительные возможности поддержка динамических обновлений защита данных (DNSSEC) и транзакций (TSIG) поддержка различных типов информации История Использование более простого и запоминающегося имени вместо числового адреса хоста относится к эпохе ARPANET. Стэнфордский исследовательский институт (теперь ) поддерживал текстовый файл HOSTS.TXT, который сопоставлял имена узлов с числовыми адресами компьютеров в ARPANET. За поддержание числовых адресов, называемых списком присвоенных номеров, отвечал Джон Постел в Институте информационных наук Университета Южной Калифорнии (ISI), команда которого тесно сотрудничала с НИИ. Адреса назначались вручную. Чтобы запросить имя хоста и адрес и добавить компьютер в главный файл, пользователи связывались с сетевым информационным центром (NIC) SRI, руководимым Элизабет Фейнлер, по телефону, в рабочее время. К началу 1980-х годов поддержание единой централизованной таблицы хостов стало медленным и громоздким, а развивающейся сети требовалась автоматическая система именования для решения технических и кадровых вопросов. Постел поставил перед собой задачу выработать компромисс между пятью конкурирующими предложениями для решения задачи, сформулированной . Мокапетрис вместо этого создал концепцию иерархической системы доменных имен. Рабочая группа IETF опубликовала оригинальные спецификации в RFC 882 и RFC 883 в ноябре 1983 года. В 1984 году четыре студента UC Berkeley, Дуглас Терри, Марк Пейнтер, Дэвид Риггл и Сонгниан Чжоу, написали первую версию сервера имен BIND (Berkeley Internet Name Daemon). В 1985 году Кевин Данлэп из DEC существенно пересмотрел реализацию DNS. Майк Карел, Фил Альмквист и Пол Викси поддерживали BIND с тех пор. В начале 1990-х годов BIND был перенесен на платформу Windows NT. Он широко распространен, особенно в Unix-системах, и по-прежнему является наиболее широко используемым программным обеспечением DNS в Интернете. В ноябре 1987 года были приняты спецификации DNS — RFC 1034 и RFC 1035. После этого были приняты сотни RFC, изменяющих и дополняющих DNS. Проблемы с безопасностью Первоначально проблемы безопасности не были основными соображениями при разработке программного обеспечения DNS или любого программного обеспечения для развёртывания в раннем Интернете, поскольку сеть не была открыта для широкой общественности. Однако рост Интернета в коммерческом секторе в 1990-х годах изменил требования к мерам безопасности для защиты целостности данных и аутентификации пользователей. Несколько уязвимостей были обнаружены и использованы злоумышленниками. Одной из таких проблем является отравление кэша DNS, в котором данные распространяются на кэширующие преобразователи под предлогом того, что они являются авторитетным сервером происхождения, тем самым загрязняя хранилище данных потенциально ложной информацией и длительными сроками действия (время жизни). Впоследствии, запросы легитимных приложений могут быть перенаправлены на сетевые хосты, контролируемые злоумышленником. DNS-ответы ранее не имели криптографической подписи, что давало возможность для множества вариантов атаки. Современные расширения системы безопасности доменных имен (DNSSEC) изменяют DNS, чтобы добавить поддержку криптографически подписанных ответов. Другие расширения, такие как TSIG, добавляют поддержку криптографической аутентификации между доверенными одноранговыми узлами и обычно используются для авторизации передачи зоны или операций динамического обновления. Некоторые доменные имена могут использоваться для достижения эффектов спуфинга. Например, paypal.com и paypa1.com — это разные имена, но пользователи могут не различать их в графическом пользовательском интерфейсе в зависимости от выбранного шрифта пользователя. Во многих шрифтах буква l и цифра 1 выглядят очень похожими или даже идентичными. Эта проблема остро стоит в системах, которые поддерживают интернационализированные доменные имена, поскольку многие коды символов в ISO 10646 могут отображаться на типичных экранах компьютеров. Эта уязвимость иногда используется в фишинге. Для подтверждения результатов DNS также могут использоваться такие методы, как обратный DNS с подтверждением прямых записей, но криптографически достоверными они не являются; при этом не учитывается вариант . Терминология и принципы работы Ключевыми понятиями DNS являются: Доме́н ( «область») — узел в дереве имён, вместе со всеми подчинёнными ему узлами (если таковые имеются), то есть именованная ветвь или поддерево в дереве имён. Структура доменного имени отражает порядок следования узлов в иерархии; доменное имя читается слева направо от младших доменов к доменам высшего уровня (в порядке повышения значимости): вверху находится корневой домен (имеющий идентификатор «.»(точка)), ниже идут домены первого уровня (доменные зоны), затем — домены второго уровня, третьего и т. д. (например, для адреса ru.wikipedia.org. домен первого уровня — org, второго — wikipedia, третьего — ru). DNS позволяет не указывать точку корневого домена. Поддомен () — подчинённый домен (например, wikipedia.org — поддомен домена org, а ru.wikipedia.org — домена wikipedia.org). Теоретически такое деление может достигать глубины 127 уровней, а каждая метка может содержать до 63 символов, пока общая длина вместе с точками не достигнет 254 символов. Но на практике регистраторы доменных имён используют более строгие ограничения. Например, если у вас есть домен вида mydomain.ru, вы можете создать для него различные поддомены вида mysite1.mydomain.ru, mysite2.mydomain.ru и т. д. Ресурсная запись — единица хранения и передачи информации в DNS. Каждая ресурсная запись имеет имя (то есть привязана к определённому доменному имени, узлу в дереве имён), тип и поле данных, формат и содержание которого зависит от типа. Зона — часть дерева доменных имён (включая ресурсные записи), размещаемая как единое целое на некотором сервере доменных имён (DNS-сервере, см. ниже), а чаще — одновременно на нескольких серверах (см. ниже). Целью выделения части дерева в отдельную зону является передача ответственности (см. ниже) за соответствующий домен другому лицу или организации. Это называется делегированием (см. ниже). Как связная часть дерева, зона внутри тоже представляет собой дерево. Если рассматривать пространство имён DNS как структуру из зон, а не отдельных узлов/имён, тоже получается дерево; оправданно говорить о родительских и дочерних зонах, о старших и подчинённых. На практике большинство зон 0-го и 1-го уровня ('.', ru, com, ...) состоят из единственного узла, которому непосредственно подчиняются дочерние зоны. В больших корпоративных доменах (2-го и более уровней) иногда встречается образование дополнительных подчинённых уровней без выделения их в дочерние зоны. Делегирование — операция передачи ответственности за часть дерева доменных имён другому лицу или организации. За счёт делегирования в DNS обеспечивается распределённость администрирования и хранения. Технически делегирование выражается в выделении этой части дерева в отдельную зону, и размещении этой зоны на DNS-сервере (см. ниже), управляемом этим лицом или организацией. При этом в родительскую зону включаются «склеивающие» ресурсные записи (NS и А), содержащие указатели на DNS-сервера дочерней зоны, а вся остальная информация, относящаяся к дочерней зоне, хранится уже на DNS-серверах дочерней зоны. DNS-сервер — специализированное ПО для обслуживания DNS, а также компьютер, на котором это ПО выполняется. DNS-сервер может быть ответственным за некоторые зоны и/или может перенаправлять запросы вышестоящим серверам. DNS-клиент — специализированная библиотека (или программа) для работы с DNS. В ряде случаев DNS-сервер выступает в роли DNS-клиента. Авторитетность () — признак размещения зоны на DNS-сервере. Ответы DNS-сервера могут быть двух типов: авторитетные (когда сервер заявляет, что сам отвечает за зону) и неавторитетные (), когда сервер обрабатывает запрос, и возвращает ответ других серверов. В некоторых случаях вместо передачи запроса дальше DNS-сервер может вернуть уже известное ему (по запросам ранее) значение (режим кеширования). DNS-запрос () — запрос от клиента (или сервера) серверу. Запрос может быть рекурсивным или нерекурсивным (см. Рекурсия). Система DNS содержит иерархию DNS-серверов, соответствующую иерархии зон. Каждая зона поддерживается как минимум одним авторитетным сервером DNS (от — авторитетный), на котором расположена информация о домене. Имя и IP-адрес не тождественны — один IP-адрес может иметь множество имён, что позволяет поддерживать на одном компьютере множество веб-сайтов (это называется виртуальный хостинг). Обратное тоже справедливо — одному имени может быть сопоставлено множество IP-адресов: это позволяет создавать балансировку нагрузки. Для повышения устойчивости системы используется множество серверов, содержащих идентичную информацию, а в протоколе есть средства, позволяющие поддерживать синхронность информации, расположенной на разных серверах. Существует 13 корневых серверов, их адреса практически не изменяются. Протокол DNS использует для работы TCP- или UDP-порт 53 для ответов на запросы. Традиционно запросы и ответы отправляются в виде одной UDP-датаграммы. TCP используется, когда размер данных ответа превышает 512 байт, и для AXFR-запросов. Рекурсия Термином рекурсия в DNS обозначают алгоритм поведения DNS-сервера: «выполнить от имени клиента полный поиск нужной информации во всей системе DNS, при необходимости обращаясь к другим DNS-серверам». DNS-запрос может быть рекурсивным — требующим полного поиска, — и нерекурсивным (или итеративным) — не требующим полного поиска. Аналогично — DNS-сервер может быть рекурсивным (умеющим выполнять полный поиск) и нерекурсивным (не умеющим выполнять полный поиск). Некоторые программы DNS-серверов, например, BIND, можно сконфигурировать так, чтобы запросы одних клиентов выполнялись рекурсивно, а запросы других — нерекурсивно. При ответе на нерекурсивный запрос, а также при неумении или запрете выполнять рекурсивные запросы, DNS-сервер либо возвращает данные о зоне, за которую он ответственен, либо возвращает ошибку. Настройки нерекурсивного сервера, когда при ответе выдаются адреса серверов, которые обладают большим объёмом информации о запрошенной зоне, чем отвечающий сервер (чаще всего — адреса корневых серверов), являются некорректными, и такой сервер может быть использован для организации DoS-атак. В случае рекурсивного запроса DNS-сервер опрашивает серверы (в порядке убывания уровня зон в имени), пока не найдёт ответ или не обнаружит, что домен не существует (на практике поиск начинается с наиболее близких к искомому DNS-серверов, если информация о них есть в кэше и не устарела, сервер может не запрашивать другие DNS-серверы). Рассмотрим на примере работу всей системы. Предположим, мы набрали в браузере адрес ru.wikipedia.org. Браузер ищет соответствие этого адреса IP-адресу в файле hosts. Если файл не содержит соответствия, то далее браузер спрашивает у сервера DNS: «какой IP-адрес у ru.wikipedia.org»? Однако сервер DNS может ничего не знать не только о запрошенном имени, но и даже обо всём домене wikipedia.org. В этом случае сервер обращается к корневому серверу — например, 198.41.0.4. Этот сервер сообщает — «У меня нет информации о данном адресе, но я знаю, что 204.74.112.1 является ответственным за зону org.» Тогда сервер DNS направляет свой запрос к 204.74.112.1, но тот отвечает «У меня нет информации о данном сервере, но я знаю, что 207.142.131.234 является ответственным за зону wikipedia.org.» Наконец, тот же запрос отправляется к третьему DNS-серверу и получает ответ — IP-адрес, который и передаётся клиенту — браузеру. В данном случае при разрешении имени, то есть в процессе поиска IP по имени: браузер отправил известному ему DNS-серверу рекурсивный запрос — в ответ на такой тип запроса сервер обязан вернуть «готовый результат», то есть IP-адрес, либо пустой ответ и код ошибки NXDOMAIN; DNS-сервер, получивший запрос от браузера, последовательно отправлял нерекурсивные запросы, на которые получал от других DNS-серверов ответы, пока не получил ответ от сервера, ответственного за запрошенную зону; остальные упоминавшиеся DNS-серверы обрабатывали запросы нерекурсивно (и, скорее всего, не стали бы обрабатывать запросы рекурсивно, даже если бы такое требование стояло в запросе). Иногда допускается, чтобы запрошенный сервер передавал рекурсивный запрос «вышестоящему» DNS-серверу и дожидался готового ответа. При рекурсивной обработке запросов все ответы проходят через DNS-сервер, и он получает возможность кэшировать их. Повторный запрос на те же имена обычно не идёт дальше кэша сервера, обращения к другим серверам не происходит вообще. Допустимое время хранения ответов в кэше приходит вместе с ответами (поле TTL ресурсной записи). Рекурсивные запросы требуют больше ресурсов от сервера (и создают больше трафика), так что обычно принимаются от «известных» владельцу сервера узлов (например, провайдер предоставляет возможность делать рекурсивные запросы только своим клиентам, в корпоративной сети рекурсивные запросы принимаются только из локального сегмента). Нерекурсивные запросы обычно принимаются ото всех узлов сети (и содержательный ответ даётся только на запросы о зоне, которая размещена на узле, на DNS-запрос о других зонах обычно возвращаются адреса других серверов). Обратный DNS-запрос DNS используется в первую очередь для преобразования символьных имён в IP-адреса, но он также может выполнять обратный процесс. Для этого используются уже имеющиеся средства DNS. Дело в том, что с записью DNS могут быть сопоставлены различные данные, в том числе и какое-либо символьное имя. Существует специальный домен in-addr.arpa, записи в котором используются для преобразования IP-адресов в символьные имена. Например, для получения DNS-имени для адреса 11.22.33.44 можно запросить у DNS-сервера запись 44.33.22.11.in-addr.arpa, и тот вернёт соответствующее символьное имя. Обратный порядок записи частей IP-адреса объясняется тем, что в IP-адресах старшие биты расположены в начале, а в символьных DNS-именах старшие (находящиеся ближе к корню) части расположены в конце. Записи DNS Записи DNS, или ресурсные записи (, ), — единицы хранения и передачи информации в DNS. Каждая ресурсная запись состоит из следующих полей: имя (NAME) — доменное имя, к которому привязана или которому «принадлежит» данная ресурсная запись, тип (TYPE) ресурсной записи — определяет формат и назначение данной ресурсной записи, класс (CLASS) ресурсной записи; теоретически считается, что DNS может использоваться не только с TCP/IP, но и с другими типами сетей, код в поле класс определяет тип сети, TTL (Time To Live) — допустимое время хранения данной ресурсной записи в кэше неответственного DNS-сервера, длина поля данных (RDLEN), поле данных (RDATA), формат и содержание которого зависит от типа записи. Наиболее важные типы DNS-записей: Запись A (address record) или запись адреса связывает имя хоста с адресом протокола IPv4. Например, запрос A-записи на имя referrals.icann.org вернёт его IPv4-адрес — 192.0.34.164. Запись AAAA (IPv6 address record) связывает имя хоста с адресом протокола IPv6. Например, запрос AAAA-записи на имя K.ROOT-SERVERS.NET вернёт его IPv6-адрес — 2001:7fd::1. Запись CNAME (canonical name record) или каноническая запись имени (псевдоним) используется для перенаправления на другое имя. Запись MX (mail exchange) или почтовый обменник указывает сервер(ы) обмена почтой для данного домена. Запись NS (name server) указывает на DNS-сервер для данного домена. Запись PTR (pointer) обратная DNS-запись или запись указателя связывает IP-адрес хоста с его каноническим именем. Запрос в домене in-addr.arpa на IP-адрес хоста в reverse-форме вернёт имя (FQDN) данного хоста (см. Обратный DNS-запрос). Например (на момент написания), для IP-адреса 192.0.34.164 запрос записи PTR 164.34.0.192.in-addr.arpa вернёт его каноническое имя referrals.icann.org. В целях уменьшения объёма нежелательной корреспонденции (спама) многие серверы-получатели электронной почты могут проверять наличие PTR-записи для хоста, с которого происходит отправка. В этом случае PTR-запись для IP-адреса должна соответствовать имени отправляющего почтового сервера, которым он представляется в процессе SMTP-сессии. Запись SOA (Start of Authority) или начальная запись зоны указывает, на каком сервере хранится эталонная информация о данном домене, содержит контактную информацию лица, ответственного за данную зону, тайминги (параметры времени) кеширования зонной информации и взаимодействия DNS-серверов. SRV-запись (server selection) указывает на серверы для сервисов, используется, в частности, для Jabber и Active Directory. Прочие записи: LOC-запись позволяет указать географическое положение сервера. Зарезервированные доменные имена Документ RFC 2606 (Reserved Top Level DNS Names — Зарезервированные имена доменов верхнего уровня) определяет названия доменов, которые следует использовать в качестве примеров (например, в документации), а также для тестирования. Кроме example.com, example.org и example.net, в эту группу также входят test, invalid и др. Интернациональные доменные имена Доменное имя может состоять только из ограниченного набора ASCII-символов, позволяя набрать адрес домена независимо от языка пользователя. ICANN утвердил основанную на Punycode систему IDNA, преобразующую любую строку в кодировке Unicode в допустимый DNS набор символов. Программное обеспечение DNS Серверы имен: BIND (Berkeley Internet Name Domain) djbdns (Daniel J. Bernstein's DNS) Dnsmasq MaraDNS NSD (Name Server Daemon) PowerDNS OpenDNS Microsoft DNS Server (в серверных версиях операционных систем Windows NT) MyDNS См. также EDNS — новый стандарт протокола DNS Альтернативные корневые серверы DNS OpenDNS Google Public DNS Яндекс.DNS Киберсквоттинг Тайпсквоттинг Динамический DNS Round robin DNS — распределение нагрузки между одинаковыми серверами. ICANN DNSSEC DNS-клиент DNS-сервер Nslookup Передача зоны DNS Примечания Ссылки DNS Resources Directory Ресурсы, посвящённые DNS & BIND Общество CircleID DNS Повышение безопасности DNS (DNSSEC) Рабочий комитет IETF занимающийся разработкой расширенной спецификации DNS (DNSEXT) Сайт корневых DNS-серверов Просмотр DNS-записей домена Веб-инструменты для DNS, каталог на сайте dmoz.org Статьи Обзор схем и типов DNS-атак Документы RFC RFC 1034 — Domain Names — Concepts and Facilities RFC 1035 — Domain Names — Implementation and Specification RFC 1912 — Common DNS Operational and Configuration Errors RFC 1591 — Domain Name System Structure and Delegation RFC 1713 — Tools for DNS Debugging RFC 2606 — Reserved Top Level DNS Names Стандарты Интернета TCP/IP Интернет-протоколы


source: wikipedia

text: FTP () — протокол передачи файлов по сети, появившийся в 1971 году задолго до HTTP и даже до TCP/IP, благодаря чему является одним из старейших прикладных протоколов. Изначально FTP работал поверх протокола NCP, на сегодняшний день широко используется для распространения ПО и доступа к удалённым хостам. В отличие от TFTP, гарантирует передачу (либо выдачу ошибки) за счёт применения квотируемого протокола. Протокол построен на архитектуре «клиент-сервер» и использует разные сетевые соединения для передачи команд и данных между клиентом и сервером. Пользователи FTP могут пройти аутентификацию, передавая логин и пароль открытым текстом, или же, если это разрешено на сервере, они могут подключиться анонимно. Можно использовать протокол SSH для безопасной передачи, шифрующей (скрывающей) логин и пароль, а также содержимое файла. Первые клиентские FTP-приложения были интерактивными инструментами командной строки, реализующими стандартные команды и синтаксис. С тех пор были разработаны графические пользовательские интерфейсы для многих используемых по сей день операционных систем. Среди этих интерфейсов как компоненты программы общего веб-дизайна вроде Microsoft Expression Web, так и специализированные FTP-клиенты (например, FileZilla). Описание протокола Отличие от HTTP Достаточно яркая особенность протокола FTP в том, что он использует множественное (как минимум — двойное) подключение. При этом один канал является управляющим, через который поступают команды серверу и возвращаются его ответы (обычно через TCP-порт 21), а через остальные происходит собственно передача данных, по одному каналу на каждую передачу. Поэтому в рамках одной сессии по протоколу FTP можно передавать одновременно несколько файлов, причём в обоих направлениях. Для каждого канала данных открывается свой TCP порт, номер которого выбирается либо сервером, либо клиентом, в зависимости от режима передачи. Протокол FTP (как и HTTP) имеет двоичный режим передачи, что сокращает накладные расходы трафика и уменьшает время обмена данными при передаче больших файлов. Начиная работу через протокол FTP, клиент входит в сессию, и все операции проводятся в рамках этой сессии (проще говоря, сервер помнит текущее состояние). Протокол HTTP ничего не «помнит» — его задача — отдать данные и забыть, поэтому запоминание состояния при использовании HTTP осуществляется внешними по отношению к протоколу методами. FTP работает на прикладном уровне модели OSI и используется для передачи файлов с помощью TCP/IP. Для этого должен быть запущен FTP-сервер, ожидающий входящих запросов. Компьютер-клиент может связаться с сервером Это соединение (поток управления) остаётся открытым на время сессии. Второе соединение (поток данных), может быть открыт как сервером из порта 20 к порту соответствующего клиента (активный режим), или же клиентом из любого порта к порту соответствующего сервера (пассивный режим), что необходимо для передачи файла данных. Поток управления используется для работы с сессией — например, обмен между клиентом и сервером командами и паролями с помощью telnet-подобного протокола. Например, «RETR имя файла» передаст указанный файл от сервера клиенту. Вследствие этой двухпортовой структуры FTP считается внешнеполосным протоколом, в отличие от внутриполосного HTTP. Соединение и передача данных Протокол определён в RFC 959. Сервер отвечает по потоку управления трёхзначными ASCII-кодами состояния с необязательным текстовым сообщением. Например, «200» (или «200 ОК») означает, что последняя команда была успешно выполнена. Цифры представляют код ответа, а текст — разъяснение или запрос. Текущая передача по потоку данных может быть прервана с помощью прерывающего сообщения, посылаемого по потоку управления. FTP может работать в активном или пассивном режиме, от выбора которого зависит способ установки соединения. В активном режиме клиент создаёт управляющее TCP-соединение с сервером и отправляет серверу свой IP-адрес и произвольный номер клиентского порта, после чего ждёт, пока сервер запустит TCP-соединение с этим адресом и номером порта. В случае, если клиент находится за брандмауэром и не может принять входящее TCP-соединение, может быть использован пассивный режим. В этом режиме клиент использует поток управления, чтобы послать серверу команду PASV, и затем получает от сервера его IP-адрес и номер порта, которые затем используются клиентом для открытия потока данных с произвольного клиентского порта к полученному адресу и порту. Оба режима были обновлены в сентябре 1998 года для поддержки IPv6. В это время были проведены дальнейшие изменения пассивного режима, обновившие его до расширенного пассивного режима. При передаче данных по сети могут быть использованы четыре представления данных: ASCII — используется для текста. Данные, если необходимо, до передачи конвертируются из символьного представления на хосте-отправителе в «восьмибитный ASCII», и (опять же, если необходимо) в символьное представление принимающего хоста. В частности, изменяются символы перевода строки (CR /chr(13)/, LF /chr(10)/ в Windows на LF /chr(10)/ в Unix/Linux. Как следствие, этот режим не подходит для файлов, содержащих не только обычный текст. Режим изображения (обычно именуемый бинарным) — устройство-отправитель посылает каждый файл байт за байтом, а получатель сохраняет поток байтов при получении. Поддержка данного режима была рекомендована для всех реализаций FTP. EBCDIC — используется для передачи обычного текста между хостами в кодировке EBCDIC. В остальном этот режим аналогичен ASCII-режиму. Локальный режим — позволяет двум компьютерам с идентичными установками посылать данные в собственном формате без конвертации в ASCII. Для текстовых файлов предоставлены различные форматы управления и настройки структуры записи. Эти особенности были разработаны для работы с файлами, содержащими Telnet или ASA-форматирование. Передача данных может осуществляться в любом из трёх режимов: Поточный режим — данные посылаются в виде непрерывного потока, освобождая FTP от выполнения какой бы то ни было обработки. Вместо этого вся обработка выполняется TCP. Индикатор конца файла не нужен, за исключением разделения данных на записи. Блочный режим — FTP разбивает данные на несколько блоков (блок заголовка, количество байт, поле данных) и затем передаёт их TCP. Режим сжатия — данные сжимаются единым алгоритмом (обычно кодированием длин серий). Аутентификация FTP-аутентификация использует схему имя пользователя/пароль для предоставления доступа. Имя пользователя посылается серверу командой USER, а пароль — командой PASS. Если предоставленная клиентом информация принята сервером, то сервер отправит клиенту приглашение и начинается сессия. Пользователи могут, если сервер поддерживает эту особенность, войти в систему без предоставления учётных данных, но сервер может предоставить только ограниченный доступ для таких сессий. Хост, обеспечивающий FTP-сервис, может предоставить анонимный доступ к FTP. Пользователи обычно входят в систему как «anonymous» (может быть регистрозависимым на некоторых FTP-серверах) в качестве имени пользователя. Хотя обычно пользователей просят прислать адрес их электронной почты вместо пароля, никакой проверки фактически не производится. Многие FTP-хосты, предоставляющие обновления программного обеспечения, поддерживают анонимный доступ. FTP-ALG Специально для работы FTP-протокола через межсетевые экраны было сделано расширение NAT, называемое FTP-ALG, позволяющее транслировать входящие соединения от сервера к клиенту через NAT. В процессе такого соединения FTP-ALG подменяет передаваемые данные от клиента, указывая серверу истинный адрес и порт, с которым сможет соединиться сервер, а потом транслирует соединение от сервера от этого адреса клиенту на его адрес. Несмотря на все меры и нововведения, принятые для поддержки FTP-протокола, на практике функция FTP-ALG обычно отключается во всех роутерах и маршрутизаторах с целью обеспечения дополнительной безопасности от вирусных угроз. NAT и обход брандмауэров FTP обычно передаёт данные при наличии соединения сервера с клиентом, после того как клиент отправил команду PORT. Это создаёт проблему как для NAT, так и для брандмауэров, которые не разрешают соединения из интернета к внутренним хостам. Для NAT дополнительной проблемой является то, что представление IP-адресов и номера порта в команде PORT относится к IP-адресу и порту внутреннего хоста, вместо публичного IP-адреса и NAT-порта. Существует два подхода к этой проблеме. Первый заключается в том, что FTP-клиент и FTP-сервер используют команду PASV, которая вызывает соединение для передачи данных, установленное от клиента к серверу. Второй подход — изменение для NAT значений команды PORT с помощью шлюза на прикладном уровне. История Первая реализация протокола (1971 год) предусматривала обмен между клиентом и сервером сообщениями, состоящими из заголовка (72 бит) и данных переменной длины. Заголовок сообщения включал в себя запрос к FTP-серверу или ответ от него, тип и длину передаваемых данных. В качестве данных передавались параметры запроса (например, путь и имя файла), информация от сервера (например, список файлов в каталоге) и сами файлы. Таким образом, команды и данные передавались по одному и тому же каналу. В 1972 году протокол был полностью изменён и принял вид, близкий к современному. Команды с параметрами от клиента и ответы сервера передаются по TELNET-соединению (канал управления), для передачи данных создаётся отдельное соединение (канал данных). В последующих редакциях была добавлена возможность работы в пассивном режиме, передачи файлов между FTP-серверами, введены команды получения информации, смены текущего каталога, создания и удаления каталогов, сохранения файлов под уникальным именем. Некоторое время существовали команды для передачи электронной почты через FTP, однако впоследствии они были исключены из протокола. В 1980 году FTP-протокол стал использовать TCP. Последняя редакция протокола была выпущена в 1985 году. В 1997 году появилось дополнение к протоколу, позволяющее шифровать и подписывать информацию в канале управления и канале данных. В 1999 году выпущено дополнение, посвящённое интернационализации протокола, которое рекомендует использовать кодировку UTF-8 для команд и ответов сервера и определяет новую команду LANG, устанавливающую язык ответов. Поддержка веб-браузерами Большая часть обычных веб-браузеров может извлекать файлы, расположенные на FTP-серверах, хотя они могут не поддерживать расширения протоколов вроде FTPS. Когда указан FTP-адрес, а не HTTP-адрес, доступный контент на удалённом сервере представляется аналогично остальному веб-контенту. Полностью функциональный FTP-клиент может быть запущен в Firefox как расширение FireFTP. С 2020 года браузер Chrome (как, возможно, и другие) будет полностью лишён поддержки протокола FTP. Синтаксис Синтаксис FTP URI описан в RFC1738, в форме: ftp://[<пользователь>[:<пароль>]@]<хост>[:<порт>]/<путь> (параметры в квадратных скобках необязательны). Например:ftp://public.ftp-servers.example.com/mydirectory/myfile.txt (недоступная ссылка)или:ftp://user001:secretpassword@private.ftp-servers.example.com/mydirectory/myfile.txt (недоступная ссылка)Более детально об указании имени пользователя и пароля написано в документации браузеров. По умолчанию, большинство веб-браузеров используют пассивный (PASV) режим, который лучше обходит брандмауэры конечного пользователя. Безопасность FTP не разрабатывался как защищённый (особенно по нынешним меркам) протокол и имеет многочисленные уязвимости в защите. В мае 1999 авторы RFC 2577 свели уязвимости в следующий список проблем: Скрытые атаки (bounce attacks) Спуф-атаки (spoof attacks) Атаки методом грубой силы (brute force attacks) Перехват пакетов, сниффинг (packet capture, sniffing) Защита имени пользователя Захват портов (port stealing) FTP не может зашифровать свой трафик, все передачи — открытый текст, поэтому имена пользователей, пароли, команды и данные могут быть прочитаны кем угодно, способным перехватить пакет по сети. Эта проблема характерна для многих спецификаций Интернет-протокола (в их числе SMTP, Telnet, POP, IMAP), разработанных до создания таких механизмов шифрования, как Обычное решение этой проблемы — использовать «безопасные», TLS-защищённые версии уязвимых протоколов (FTPS для FTP, TelnetS для Telnet и т. д.) или же другой, более защищённый протокол, вроде SFTP/SCP, предоставляемого с большинством реализаций протокола Secure Shell. Безопасный FTP Существует несколько методов безопасной передачи файлов, которые иногда называются «Безопасным FTP». FTPS Явный FTPS — расширение стандарта FTP, позволяющее клиентам требовать того, чтобы FTP-сессия была зашифрована. Это реализуется отправкой команды «AUTH TLS». Сервер обладает возможностью позволить или отклонить соединения, которые не запрашивают TLS. Это расширение протокола определено в спецификации RFC 4217. Неявный FTPS — устаревший стандарт для FTP, требующий использования SSL- или TLS-соединения. Этот стандарт должен был использовать отличные от обычного FTP порты. SFTP SFTP, или «SSH File Transfer Protocol», не связан с FTP, за исключением того, что он тоже передаёт файлы и имеет аналогичный набор команд для пользователей. SFTP, или безопасный FTP, — это программа, использующая SSH (Secure Shell) для передачи файлов. В отличие от стандартного FTP он шифрует и команды, и данные, предохраняя пароли и конфиденциальную информацию от открытой передачи через сеть. По функциональности SFTP похож на FTP, но так как он использует другой протокол, клиенты стандартного FTP не могут связаться с SFTP-сервером и наоборот. FTP через SSH (не SFTP) FTP через SSH (не SFTP) относится к практике туннелирования обычной FTP-сессии через SSH-соединение. Поскольку FTP использует несколько TCP-соединений, туннелирование через SSH особенно затруднительно. Когда много SSH-клиентов пытаются установить туннель для канала управления (изначальное «клиент-сервер» соединение по порту 21), защищён будет только этот канал; при передаче данных программное обеспечение FTP на любом конце установит новые TCP-соединения (каналы данных), которые обойдут SSH-соединение и, таким образом, лишатся целостной защиты. Иначе, для клиентского программного обеспечения SSH необходимо иметь определённые знания о FTP для отслеживания и перезаписи сообщений потока управления FTP и автономного открытия новых перенаправлений для потока данных FTP. Программные пакеты, поддерживающие этот режим: Tectia ConnectSecure (Win/Linux/Unix) из пакета SSH Communications Security Tectia Server for IBM z/OS из пакета SSH Communications Security FONC (под лицензией GPL) Co:Z FTPSSH Proxy FTP через SSH иногда относят к безопасным FTP, но не стоит путать его с другими методами, такими как SSL/TLS (FTPS). Другие методы передачи файлов с помощью SSH и не связанные с FTP — SFTP и SCP. В каждом из них и учётные, и файловые данные всегда защищены протоколом SSH. Основные команды ABOR — Прервать передачу файла. CDUP — Сменить каталог на вышестоящий. CWD — Сменить каталог. DELE — Удалить файл (DELE filename). EPSV — Войти в расширенный пассивный режим. Применяется вместо PASV. HELP — Выводит список команд, принимаемых сервером. LIST — Возвращает список файлов каталога. Список передаётся через соединение данных. MDTM — Возвращает время модификации файла. MKD — Создать каталог. NLST — Возвращает список файлов каталога в более кратком формате, чем LIST. Список передаётся через соединение данных. NOOP — Пустая операция. PASS — Пароль. PASV — Войти в пассивный режим. Сервер вернёт адрес и порт, к которому нужно подключиться, чтобы забрать данные. Передача начнётся при введении следующих команд: RETR, LIST и т. д. PORT — Войти в активный режим. Например PORT 12,34,45,56,78,89. В отличие от пассивного режима для передачи данных сервер сам подключается к клиенту. PWD — Возвращает текущий каталог. QUIT — Отключиться. REIN — Реинициализировать подключение. RETR — Скачать файл. Перед RETR должна быть команда PASV или PORT. RMD — Удалить каталог. RNFR и RNTO — Переименовать файл. RNFR — что переименовывать, RNTO — во что. SIZE — Возвращает размер файла. STOR — Закачать файл. Перед STOR должна быть команда PASV или PORT. SYST — Возвращает тип системы (UNIX, WIN, ...). TYPE — Установить тип передачи файла (бинарный, текстовый). USER — Имя пользователя для входа на сервер. Коды ответов FTP Ниже представлено краткое описание кодов ответа, которые могут быть возвращены FTP-сервером. Эти коды были стандартизированы IETF в RFC 959. Как было сказано ранее, код ответа — трёхзначное число. Первая цифра отвечает за один из трёх исходов: успех, отказ или указание на ошибку либо неполный ответ. 2xx — Успешный ответ 4xx/5xx — Команда не может быть выполнена 1xx/3xx — Ошибка или неполный ответ Вторая цифра определяет тип ошибки: x0z — Синтаксическая. x1z — Информация. Соответствует информационному сообщению. x2z — Соединения. Сообщение относится к управляющему соединению либо к соединению данных. x3z — Соответствует сообщениям об аутентификации пользователя и его правах. x4z — Не определено. x5z — Файловая система. Соответствует сообщению о состоянии файловой системы. Третья цифра окончательно специфицирует ошибку. Пример В примере жирным шрифтом выделены команды, которые подаёт клиент; обычным шрифтом — сообщения сервера. Примечания отделены двумя слэшами: 220 FTP server ready. 220 Hello World! USER anonymous 331 Anonymous login ok, send your complete email address as your password PASS ************ 230 Logged in anonymously. PASV 227 Entering Passive Mode (192,168,254,253,233,92) //Клиент должен открыть соединение на переданный IP LIST 150 Here comes the directory listing. // Сервер передаёт список файлов в каталог 226 Directory send OK. CWD incoming 250 Directory successfully changed. PASV 227 Entering Passive Mode (192,168,254,253,207,56) STOR example.avi 150 Ok to send data. // Клиент передаёт содержимое файла 226 File receive OK. QUIT 221 Goodbye. Аргумент 192,168,254,253,207,56 означает, что соединение к серверу ожидается на узле с IP-адресом 192.168.254.253 на порту 207 << 8 + 56 = 53048 (где << — операция побитового сдвига, 207 записывается в младший разряд, а потом сдвигается в старший, чтобы в младший записать На многих FTP-серверах существует каталог (под названием incoming, upload и т. п.), открытый на запись и предназначенный для закачки файлов на сервер. Это позволяет пользователям наполнять сервера свежими данными. FXP FXP ( — протокол обмена файлами) — способ передачи файлов между двумя FTP-серверами напрямую, без закачки файлов на компьютер пользователя. При FXP-сессии клиент открывает два FTP-соединения к двум разным серверам, запрашивая файл на первом сервере, указывая в команде PORT IP-адрес второго сервера. Несомненным преимуществом поддержки стандарта FXP является то, что на конечных пользователей, желающих скопировать файлы с одного FTP-сервера на другой, уже не действует ограничение пропускной способности их собственного интернет-соединения. Нет необходимости скачивать себе файл, чтобы потом загрузить его на другой FTP-сервер. Таким образом, время передачи файлов будет зависеть только от скорости соединения между двумя удаленными FTP-серверами, которая в большинстве случаев заведомо больше «пользовательской». FXP стал использоваться злоумышленниками для атак на другие серверы: в команде PORT указывается IP-адрес и порт атакуемого сервиса на компьютере жертвы, и командами RETR/STOR производится обращение на этот порт от лица FTP-сервера, а не атакующей машины, что позволяло устраивать масштабные DDoS-атаки с использованием сразу многих FTP-серверов, либо обходить систему безопасности компьютера жертвы, если он полагается только на проверку IP клиента и используемый для атаки FTP-сервер находится в доверенной сети или на шлюзе. В результате сейчас практически все серверы проверяют соответствие IP-адреса, указанного в команде PORT, IP-адресу FTP-клиента и по умолчанию запрещают использование там IP-адресов третьих сторон. Таким образом, использование FXP невозможно при работе с публичными FTP-серверами. См. также FTP-клиент Сравнение FTP-серверов Сравнение FTP-клиентов SFTP TFTP FTPS MFTP Hammering Команды и коды ответов FTP-сервера Список UNIX-демонов Open Object REXX: Библиотека классов RxFtp Серверы FileZilla Server (Windows) Pure-FTPd (Unix) VsFTPd (Unix) ProFTPd (Unix) Документы Первоначальная спецификация FTP RFC 959 Расширения безопасности RFC 2228 Интернационализация FTP RFC 2640 Расширение NAT-PT для поддержки FTP RFC 2766 Шифрование KEA и SKIPJACK RFC 2773 Расширение команд FTP RFC 3659 Реестр команд и расширений FTP RFC 5797 (есть перевод на русский) Примечания Ссылки Интернет-протоколы


text: Gnutella — полностью децентрализованная файлообменная сеть в рамках Интернета, потомок Napster, отличается принципиальным отсутствием центрального сервера. Сеть формируется, когда один пользователь Gnutella соединяется с другим пользователем, после чего они могут обмениваться доступной информацией. Обмениваться можно файлами любых форматов, есть множество удобных функций. В результате полной децентрализации сеть практически невозможно уничтожить, так как для этого потребуется вывести из строя каждый узел сети. История появления сети Gnutella Первый клиент сети Gnutella был разработан Джастином Франкелем и Томом Пеппером из Nullsoft в начале 2000 года, вскоре после приобретения их компанией AOL. 14 марта программа была доступна для скачивания на серверах в Nullsoft. Первая версия программы давала возможность пользователю искать и обмениваться всеми видами файлов с другими владельцами Gnutella без участия каких-либо серверов. Это событие было заранее анонсировано на Slashdot и в этот день программу скачали тысячи людей. Исходный код должен был быть выпущен позже, в соответствии с GNU General Public License (GPL). На следующий день AOL остановила распространение программы по правовым вопросам и отстранила Nullsoft от выполнения любой дальнейшей работы над проектом (официально AOL назвала Gnutella как «unauthorized freelance project» и открестились от него), после чего разработчики Gnutella, во главе с Джастином Френкелем, уволились. Но это не помешало распространению Gnutella, через несколько дней протокол был подвергнут реверс-инжинирингу и начали появляться свободные и открытые клоны. Этот изначальный процесс параллельного развития различных клиентов различными группами продолжается и сегодня. Механизм работы При подключении клиент получает от узла, с которым ему удалось соединиться, список из пяти активных узлов; им отсылается запрос на поиск ресурса по ключевому слову. Узлы ищут у себя соответствующие запросу ресурсы и, если не находят их, пересылают запрос активным узлам вверх по «дереву» (топология сети имеет структуру графа типа «дерево»), пока не найдётся ресурс или не будет превышено максимальное число шагов. Такой поиск называется размножением запросов (query flooding). Понятно, что подобная реализация ведёт к экспоненциальному росту числа запросов и соответственно на верхних уровнях «дерева» может привести к отказу в обслуживании, что и наблюдалось неоднократно на практике. Разработчики усовершенствовали алгоритм, ввели правила, в соответствии с которыми запросы могут пересылать вверх по «дереву» только определённые узлы — так называемые выделенные (ultrapeers), остальные узлы (leaves) могут лишь запрашивать последние. Введена также система кеширующих узлов. В таком виде сеть функционирует и сейчас, хотя недостатки алгоритма и слабые возможности расширяемости ведут к уменьшению её популярности. Клиенты На 2007 год Gnutella являлась одной из наиболее популярных файлообменных сетей. Работа сети Gnutella непрерывно совершенствуется благодаря усилиям разработчиков множества клиентов сети: Специализированные LimeWire Cabos FrostWire gtk-gnutella Phex BearShare (только до версии 5!) Qtella Мультисетевые Shareaza mlDonkey giFT KCeasy Реакция со стороны FSF Название Gnutella первоначально было игрой слов GNU, так как разработчики планировали выпустить исходный код под лицензией GNU GPL, и Nutella — марки любимой ореховой пасты этих разработчиков. Однако, ни самая первая программа, ни соответствующие современные проекты не являются официальным проектом GNU, включая использующие протокол Gnutella gtk-gnutella, mutella и gnucleus. В рамках проекта GNU развивается собственная программа для одноранговых сетей - GNUnet. Кроме того, Фонд свободного программного обеспечения сосредоточен на свободе копирования и изменения программного обеспечения, в то время как Gnutella — это, прежде всего, сеть обмена музыкальными файлами. И хотя существует некоторое сходство в вопросах этики копирования программного обеспечения и музыкальных записей, FSF попросила разработчиков Gnutella изменить название программы для избежания путаницы. См. также Анонимные сети Одноранговые сети Gnutella2 Примечания Ссылки Сайт Gnutella Protocol Development — описание спецификаций протокола Gnutella. Gnutelliums — Список клиентов Gnutella для Windows, Linux/Unix, и Macintosh Большое интервью с Джастином Франкелем — создателем Gnutella (PDF) Gnutella Анонимные файлообменные сети


text: HTTP ( — «протокол передачи гипертекста») — сетевой протокол прикладного уровня, который изначально предназначался для получения с серверов гипертекстовых документов в формате HTML, а с течением времени стал универсальным средством взаимодействия между узлами как Всемирной паутины, так и изолированных веб-инфраструктур. Определение по основным документациям: HTTP — протокол уровня приложений для распределённых, объединённых, гипермедийный информационных систем, используемый в глобальной информационной инициативе Всемирной паутины с 1990-го года. Основные свойства Основой HTTP является технология «клиент-сервер», то есть предполагается существование: Потребителей (клиентов), которые инициируют соединение и посылают запрос; Поставщиков (серверов), которые ожидают соединения для получения запроса, производят необходимые действия и возвращают обратно сообщение с результатом. HTTP в настоящее время повсеместно используется во Всемирной паутине для получения информации с веб-сайтов. В 2006 году в Северной Америке доля HTTP-трафика превысила долю P2P-сетей и составила 46 %, из которых почти половина — это передача потокового видео и звука. HTTP используется также в качестве «транспорта» для других протоколов прикладного уровня, таких как SOAP, XML-RPC, WebDAV. Основным объектом манипуляции в HTTP является ресурс, на который указывает URI (Uniform Resource Identifier) в запросе клиента. Обычно такими ресурсами являются хранящиеся на сервере файлы, но ими могут быть логические объекты или что-то абстрактное. Особенностью протокола HTTP является возможность указать в запросе и ответе способ представления одного и того же ресурса по различным параметрам: формату, кодировке, языку и т. д. (в частности, для этого используется HTTP-заголовок). Именно благодаря возможности указания способа кодирования сообщения клиент и сервер могут обмениваться двоичными данными, хотя данный протокол является текстовым. HTTP — протокол прикладного уровня; аналогичными ему являются FTP и SMTP. Обмен сообщениями идёт по обыкновенной схеме «запрос-ответ». Для идентификации ресурсов HTTP использует глобальные URI. В отличие от многих других протоколов, HTTP не сохраняет своего состояния. Это означает отсутствие сохранения промежуточного состояния между парами «запрос-ответ». Компоненты, использующие HTTP, могут самостоятельно осуществлять сохранение информации о состоянии, связанной с последними запросами и ответами (например, «куки» на стороне клиента, «сессии» на стороне сервера). Браузер, посылающий запросы, может отслеживать задержки ответов. Сервер может хранить IP-адреса и заголовки запросов последних клиентов. Однако сам протокол не осведомлён о предыдущих запросах и ответах, в нём не предусмотрена внутренняя поддержка состояния, к нему не предъявляются такие требования. Большинство протоколов предусматривает установление TCP-сессии, в ходе которой один раз происходит авторизация, и дальнейшие действия выполняются в контексте этой авторизации. HTTP же устанавливает отдельную TCP-сессию на каждый запрос; в более поздних версиях HTTP было разрешено делать несколько запросов в ходе одной TCP-сессии, но браузеры обычно запрашивают только страницу и включённые в неё объекты (картинки, каскадные стили и т. п.), а затем сразу разрывают TCP-сессию. Для поддержки авторизованного (неанонимного) доступа в HTTP используются cookies; причём такой способ авторизации позволяет сохранить сессию даже после перезагрузки клиента и сервера. При доступе к данным по FTP или по файловым протоколам тип файла (точнее, тип содержащихся в нём данных) определяется по расширению имени файла, что не всегда удобно. HTTP перед тем, как передать сами данные, передаёт заголовок «Content-Type: тип/подтип», позволяющий клиенту однозначно определить, каким образом обрабатывать присланные данные. Это особенно важно при работе с CGI-скриптами, когда расширение имени файла указывает не на тип присылаемых клиенту данных, а на необходимость запуска данного файла на сервере и отправки клиенту результатов работы программы, записанной в этом файле (при этом один и тот же файл в зависимости от аргументов запроса и своих собственных соображений может порождать ответы разных типов — в простейшем случае картинки в разных форматах). Кроме того, HTTP позволяет клиенту прислать на сервер параметры, которые будут переданы запускаемому CGI-скрипту. Для этого же в HTML были введены формы. Перечисленные особенности HTTP позволили создавать поисковые машины (первой из которых стала AltaVista, созданная фирмой DEC), форумы и Internet-магазины. Это коммерциализировало Интернет, появились компании, основным полем деятельности которых стало предоставление доступа в Интернет (провайдеры) и создание сайтов. Программное обеспечение Всё программное обеспечение для работы с протоколом HTTP разделяется на три большие категории: Серверы как основные поставщики услуг хранения и обработки информации (обработка запросов); Клиенты — конечные потребители услуг сервера (отправка запроса); Прокси (посредники) для выполнения транспортных служб. Для отличия конечных серверов от прокси в официальной документации используется термин «исходный сервер» (). Один и тот же программный продукт может одновременно выполнять функции клиента, сервера или посредника в зависимости от поставленных задач. В спецификациях протокола HTTP подробно описывается поведение для каждой из этих ролей. Клиенты Первоначально протокол HTTP разрабатывался для доступа к гипертекстовым документам Всемирной паутины. Поэтому основными реализациями клиентов являются браузеры (агенты пользователя). Для просмотра сохранённого содержимого сайтов на компьютере без соединения с Интернетом были придуманы офлайн-браузеры. При нестабильном соединении для загрузки больших файлов используются менеджеры закачек; они позволяют в любое время докачать указанные файлы после потери соединения с веб-сервером. Некоторые виртуальные атласы (такие как Google Планета Земля и NASA World Wind) тоже используют HTTP. Нередко протокол HTTP используется программами для скачивания обновлений. Целый комплекс программ-роботов используется в поисковых системах Интернета. Среди них веб-пауки (краулеры), которые производят проход по гиперссылкам, составляют базу данных ресурсов серверов и сохраняют их содержимое для дальнейшего анализа. Исходные серверы Основные реализации: Apache, Internet Information Services (IIS), nginx, (LSWS), Google Web Server, lighttpd. Прокси-серверы Основные реализации: Squid, UserGate, Multiproxy, Naviscope, nginx. Структура HTTP-сообщения Каждое HTTP-сообщение состоит из трёх частей, которые передаются в указанном порядке: Стартовая строка () — определяет тип сообщения; Заголовки () — характеризуют тело сообщения, параметры передачи и прочие сведения; Тело сообщения () — непосредственно данные сообщения. Обязательно должно отделяться от заголовков пустой строкой. Тело сообщения может отсутствовать, но стартовая строка и заголовок являются обязательными элементами. Исключением является версия 0.9 протокола, у которой сообщение запроса содержит только стартовую строку, а сообщения ответа — только тело сообщения. Для версии протокола 1.1 сообщение запроса обязательно должно содержать заголовок Host. Стартовая строка Стартовые строки различаются для запроса и ответа. Строка запроса выглядит так: GET URI — для версии протокола 0.9; Метод URI HTTP/Версия — для остальных версий. Здесь: Метод () — тип запроса, одно слово заглавными буквами. В версии HTTP 0.9 использовался только метод GET, список методов для версии 1.1 представлен ниже. URI определяет путь к запрашиваемому документу. Версия () — пара разделённых точкой цифр. Например: 1.0. Чтобы запросить страницу данной статьи, клиент должен передать строку (задан всего один заголовок): GET /wiki/HTTP HTTP/1.0 Host: ru.wikipedia.org Стартовая строка ответа сервера имеет следующий формат: HTTP/Версия КодСостояния Пояснение, где: Версия — пара разделённых точкой цифр, как в запросе; Код состояния () — три цифры. По коду состояния определяется дальнейшее содержимое сообщения и поведение клиента; Пояснение () — текстовое короткое пояснение к коду ответа для пользователя. Никак не влияет на сообщение и является необязательным. Например, стартовая строка ответа сервера на предыдущий запрос может выглядеть так: HTTP/1.0 200 OK Методы Метод HTTP () — последовательность из любых символов, кроме управляющих и разделителей, указывающая на основную операцию над ресурсом. Обычно метод представляет собой короткое английское слово, записанное заглавными буквами. Обратите внимание, что название метода чувствительно к регистру. Сервер может использовать любые методы, не существует обязательных методов для сервера или клиента. Если сервер не распознал указанный клиентом метод, то он должен вернуть статус 501 (Not Implemented). Если серверу метод известен, но он неприменим к конкретному ресурсу, то возвращается сообщение с кодом 405 (Method Not Allowed). В обоих случаях серверу следует включить в сообщение ответа заголовок Allow со списком поддерживаемых методов. Кроме методов GET и HEAD, часто применяется метод POST. OPTIONS Используется для определения возможностей веб-сервера или параметров соединения для конкретного ресурса. В ответ серверу следует включить заголовок Allow со списком поддерживаемых методов. Также в заголовке ответа может включаться информация о поддерживаемых расширениях. Предполагается, что запрос клиента может содержать тело сообщения для указания интересующих его сведений. Формат тела и порядок работы с ним в настоящий момент не определён; сервер пока должен его игнорировать. Аналогичная ситуация и с телом в ответе сервера. Для того, чтобы узнать возможности всего сервера, клиент должен указать в URI звёздочку — «*». Запросы «OPTIONS * HTTP/1.1» могут также применяться для проверки работоспособности сервера (аналогично «пингованию») и тестирования на предмет поддержки сервером протокола HTTP версии 1.1. Результат выполнения этого метода не кэшируется. GET Используется для запроса содержимого указанного ресурса. С помощью метода GET можно также начать какой-либо процесс. В этом случае в тело ответного сообщения следует включить информацию о ходе выполнения процесса. Клиент может передавать параметры выполнения запроса в URI целевого ресурса после символа «?»:GET /path/resource?param1=value1&param2=value2 HTTP/1.1 Согласно стандарту HTTP, запросы типа GET считаются идемпотентными Кроме обычного метода GET, различают ещё Условный GET — содержит заголовки If-Modified-Since, If-Match, If-Range и подобные; Частичный GET — содержит в запросе Range. Порядок выполнения подобных запросов определён стандартами отдельно. HEAD Аналогичен методу GET, за исключением того, что в ответе сервера отсутствует тело. Запрос HEAD обычно применяется для извлечения метаданных, проверки наличия ресурса (валидация URL) и чтобы узнать, не изменился ли он с момента последнего обращения. Заголовки ответа могут кэшироваться. При несовпадении метаданных ресурса с соответствующей информацией в кэше — копия ресурса помечается как устаревшая. POST Применяется для передачи пользовательских данных заданному ресурсу. Например, в блогах посетители обычно могут вводить свои комментарии к записям в HTML-форму, после чего они передаются серверу методом POST и он помещает их на страницу. При этом передаваемые данные (в примере с блогами — текст комментария) включаются в тело запроса. Аналогично с помощью метода POST обычно загружаются файлы на сервер. В отличие от метода GET, метод POST не считается идемпотентным, то есть многократное повторение одних и тех же запросов POST может возвращать разные результаты (например, после каждой отправки комментария будет появляться очередная копия этого комментария). При результате выполнения 200 (Ok) в тело ответа следует включить сообщение об итоге выполнения запроса. Если был создан ресурс, то серверу следует вернуть ответ 201 (Created) с указанием URI нового ресурса в заголовке Location. Сообщение ответа сервера на выполнение метода POST не кэшируется. PUT Применяется для загрузки содержимого запроса на указанный в запросе URI. Если по заданному URI не существует ресурса, то сервер создаёт его и возвращает статус 201 (Created). Если же ресурс был изменён, то сервер возвращает 200 (Ok) или 204 (No Content). Сервер не должен игнорировать некорректные заголовки Content-*, передаваемые клиентом вместе с сообщением. Если какой-то из этих заголовков не может быть распознан или недопустим при текущих условиях, то необходимо вернуть код ошибки 501 (Not Implemented). Фундаментальное различие методов POST и PUT заключается в понимании предназначений URI ресурсов. Метод POST предполагает, что по указанному URI будет производиться обработка передаваемого клиентом содержимого. Используя PUT, клиент предполагает, что загружаемое содержимое соответствует находящемуся по данному URI ресурсу. Сообщения ответов сервера на метод PUT не кэшируются. PATCH Аналогично PUT, но применяется только к фрагменту ресурса. DELETE Удаляет указанный ресурс. TRACE Возвращает полученный запрос так, что клиент может увидеть, какую информацию промежуточные серверы добавляют или изменяют в запросе. CONNECT Преобразует соединение запроса в прозрачный TCP/IP-туннель, обычно чтобы содействовать установлению защищённого SSL-соединения через нешифрованный прокси. Коды состояния Код состояния является частью первой строки ответа сервера. Он представляет собой целое число из трёх цифр. Первая цифра указывает на класс состояния. За кодом ответа обычно следует отделённая пробелом поясняющая фраза на английском языке, которая разъясняет человеку причину именно такого ответа. Примеры: 201 Webpage Created 403 Access allowed only for registered users 507 Insufficient Storage Клиент узнаёт по коду ответа о результатах его запроса и определяет, какие действия ему предпринимать дальше. Набор кодов состояния является стандартом, и они описаны в соответствующих документах RFC. Введение новых кодов должно производиться только после согласования с IETF. Клиент может не знать все коды состояния, но он обязан отреагировать в соответствии с классом кода. В настоящее время выделено пять классов кодов состояния Заголовки Заголовки HTTP () — это строки в HTTP-сообщении, содержащие разделённую двоеточием пару параметр-значение. Формат заголовков соответствует общему формату заголовков текстовых сетевых сообщений ARPA (см. RFC 822). Заголовки должны отделяться от тела сообщения хотя бы одной пустой строкой. Примеры заголовков: Server: Apache/2.2.11 (Win32) PHP/5.3.0 Last-Modified: Sat, 16 Jan 2010 21:16:42 GMT Content-Type: text/plain; charset=windows-1251 Content-Language: ru В примере выше каждая строка представляет собой один заголовок. При этом то, что находится до двоеточия, называется именем (), а что после него — значением (). Все заголовки разделяются на четыре основных группы: General Headers («Основные заголовки») — могут включаться в любое сообщение клиента и сервера; Request Headers («Заголовки запроса») — используются только в запросах клиента; Response Headers («Заголовки ответа») — только для ответов от сервера; Entity Headers («Заголовки сущности») — сопровождают каждую сущность сообщения. Именно в таком порядке рекомендуется посылать заголовки получателю. Все необходимые для функционирования HTTP заголовки описаны в основных RFC. Если не хватает существующих, то можно вводить свои. Традиционно к именам таких дополнительных заголовков добавляют префикс «X-» для избежания конфликта имён с возможно существующими. Например, как в заголовках X-Powered-By или X-Cache. Некоторые разработчики используют свои индивидуальные префиксы. Примерами таких заголовков могут служить Ms-Echo-Request и Ms-Echo-Reply, введённые корпорацией Microsoft для расширения WebDAV. Тело сообщения Тело HTTP-сообщения (message-body), если оно присутствует, используется для передачи тела объекта, связанного с запросом или ответом. Тело сообщения отличается от тела объекта (entity-body) только в том случае, когда применяется кодирование передачи, что указывается полем заголовка Transfer-Encoding. message-body = entity-body | <entity-body закодировано согласно Transfer-Encoding> Поле Transfer-Encoding должно использоваться для указания любого кодирования передачи, применённого приложением в целях гарантирования безопасной и правильной передачи сообщения. Поле Transfer-Encoding — это свойство сообщения, а не объекта, и, таким образом, может быть добавлено или удалено любым приложением в цепочке запросов/ответов. Правила, устанавливающие допустимость тела сообщения в сообщении, отличны для запросов и ответов. Присутствие тела сообщения в запросе отмечается добавлением к заголовкам запроса поля заголовка Content-Length или Transfer-Encoding. Тело сообщения может быть добавлено в запрос, только когда метод запроса допускает тело объекта. Включается или не включается тело сообщения в сообщение ответа — зависит как от метода запроса, так и от кода состояния ответа. Все ответы на запрос с методом HEAD не должны включать тело сообщения, даже если присутствуют поля заголовка объекта (entity-header), заставляющие поверить в присутствие объекта. Никакие ответы с кодами состояния 1xx (Информационные), 204 (Нет содержимого, No Content), и 304 (Не модифицирован, Not Modified) не должны содержать тела сообщения. Все другие ответы содержат тело сообщения, даже если оно имеет нулевую длину. Примеры диалогов HTTP См. также частичные GET, байтовые диапазоны, ответ 206, ответ 416. Основные механизмы протокола Частичные GET HTTP позволяет запросить не сразу всё содержимое ресурса, а только указанный фрагмент. Такие запросы называются частичные GET; возможность их выполнения необязательна (но желательна) для серверов. Частичные GET в основном используются для докачки файлов и быстрого параллельного скачивания в нескольких потоках. Некоторые программы скачивают заголовок архива, выводят пользователю внутреннюю структуру, а потом уже запрашивают фрагменты с указанными элементами архива. Для получения фрагмента клиент посылает серверу запрос с заголовком Range, указывая в нём необходимые байтовые диапазоны. Если сервер не понимает частичные запросы (игнорирует заголовок Range), то он вернёт всё содержимое со статусом 200, как и при обычном GET. В случае успешного выполнения сервер возвращает вместо кода 200 ответ со статусом 206 (Partial Content), включая в ответ заголовок Content-Range. Сами фрагменты могут быть переданы двумя способами: В ответе помещается заголовок Content-Range с указанием байтовых диапазонов. В соответствии с ними фрагменты последовательно помещаются в основное тело. При этом Content-Length должен соответствовать суммарному объёму всего тела; Сервер указывает медиатип multipart/byteranges для основного содержимого и передаёт фрагменты, указывая соответствующий Content-Range для каждого элемента (см. также «Множественное содержимое»). Условные GET Метод GET изменяется на «условный GET», если сообщение запроса включает в себя поле заголовка If-Modified-Since. В ответ на «условный GET» тело запрашиваемого ресурса передаётся, только если он изменялся после даты, указанной в заголовке If-Modified-Since. Алгоритм определения этого включает в себя следующие случаи: Если статус ответа на запрос будет отличаться от «200 OK» или дата, указанная в поле заголовка «If-Modified-Since», некорректна, ответ будет идентичен ответу на обычный запрос GET. Если после указанной даты ресурс изменялся, ответ будет также идентичен ответу на обычный запрос GET. Если ресурс не изменялся после указанной даты, сервер вернет статус «304 Not Modified». Использование метода «условный GET» направлено на разгрузку сети, так как он позволяет не передавать по сети избыточную информацию. Согласование содержимого Согласование содержимого () — механизм автоматического определения необходимого ресурса при наличии нескольких разнотипных версий документа. Субъектами согласования могут быть не только ресурсы сервера, но и возвращаемые страницы с сообщениями об ошибках (403, 404 и т. п.). Различают два основных типа согласований: Управляемое сервером (). Управляемое клиентом (). Одновременно могут быть использованы оба типа или каждый из них по отдельности. В основной спецификации по протоколу (RFC 2616) также выделяется так называемое прозрачное согласование () как предпочтительный вариант комбинирования обоих типов. Последний механизм не следует путать с независимой технологией Transparent Content Negotiation (TCN, «Прозрачное согласование содержимого», см. RFC 2295), которая не является частью протокола HTTP, но может использоваться с ним. У обоих существенное различие в принципе работы и самом значении слова «прозрачное» (transparent). В спецификации по HTTP под прозрачностью подразумевается, что процесс не заметен для клиента и сервера, а в технологии TCN прозрачность означает доступность полного списка вариантов ресурса для всех участников процесса доставки данных. Управляемое сервером При наличии нескольких версий ресурса сервер может анализировать заголовки запроса клиента, чтобы выдать, по его мнению, наиболее подходящую. В основном анализируются заголовки Accept, Accept-Charset, Accept-Encoding, Accept-Languages и User-Agent. Серверу желательно включать в ответ заголовок Vary с указанием параметров, по которым различается содержимое по запрашиваемому URI. Географическое положение клиента можно определить по удалённому IP-адресу. Это возможно за счёт того что IP-адреса, как и доменные имена, регистрируются на конкретного человека или организацию. При регистрации указывается регион, в котором будет использоваться желаемое адресное пространство. Эти данные общедоступны, и в Интернете можно найти соответствующие свободно распространяемые базы данных и готовые программные модули для работы с ними (следует ориентироваться на ключевые слова «Geo IP»). Следует помнить что такой метод способен определить местоположение максимум с точностью до города (отсюда определяется и страна). При этом информация актуальна только на момент регистрации адресного пространства. Например, если московский провайдер зарегистрирует диапазон адресов с указанием Москвы и начнёт предоставлять доступ клиентам из ближайшего Подмосковья, то его абоненты могут на некоторых сайтах наблюдать, что они из Москвы, а не из Красногорска или Дзержинского. Управляемое сервером согласование имеет несколько недостатков: Сервер только предполагает, какой вариант наиболее предпочтителен для конечного пользователя, но не может знать точно, что именно нужно в данный момент (например, версия на русском языке или английском). Заголовков группы Accept передаётся много, а ресурсов с несколькими вариантами — мало. Из-за этого оборудование испытывает избыточную нагрузку. Общему кэшу создаётся ограничение возможности выдавать один и тот же ответ на идентичные запросы от разных пользователей. Передача заголовков Accept также может раскрывать некоторые сведения о его предпочтениях, таких как используемые языки, браузер, кодировка. Управляемое клиентом В данном случае тип содержимого определяется только на стороне клиента. Для этого сервер возвращает в ответе с кодом состояния 300 (Multiple Choices) или 406 (Not Acceptable) список вариантов, среди которых пользователь выбирает подходящий. Управляемое клиентом согласование хорошо, когда содержимое различается по самым частым параметрам (например, по языку и кодировке) и используется публичный кэш. Основной недостаток — лишняя нагрузка, так как приходится делать дополнительный запрос, чтобы получить нужное содержимое. Прозрачное согласование Данное согласование полностью прозрачно для клиента и сервера. В данном случае используется общий кэш, в котором содержится список вариантов, как для управляемого клиентом согласования. Если кэш понимает все эти варианты, то он сам делает выбор, как при управляемом сервером согласовании. Это снижает нагрузки с исходного сервера и исключает дополнительный запрос со стороны клиента. В основной спецификации по протоколу HTTP механизм прозрачного согласования подробно не описан. Множественное содержимое Протокол HTTP поддерживает передачу нескольких сущностей в пределах одного сообщения. Причём сущности могут передаваться не только в виде одноуровневой последовательности, но и в виде иерархии с вложением элементов друг в друга. Для обозначения множественного содержимого используются медиатипы multipart/*. Работа с такими типами осуществляется по общим правилам, описанным в RFC 2046 (если иное не определено конкретным медиатипом). Если получателю не известно как работать с типом, то он обрабатывает его так же, как multipart/mixed. Параметр boundary означает разделитель между различными типами передаваемых сообщений. Например, передаваемый из формы параметр DestAddress передаёт значение адреса e-mail, а следующий за ним элемент AttachedFile1 отправляет двоичное содержимое изображения формата .jpg Со стороны сервера сообщения со множественным содержимым могут посылаться в ответ на частичные GET при запросе нескольких фрагментов ресурса. В этом случае используется медиатип multipart/byteranges. Со стороны клиента при отправке HTML-формы чаще всего пользуются методом POST. Типичный пример: страницы отправки электронных писем со вложенными файлами. При отправке такого письма браузер формирует сообщение типа multipart/form-data, интегрируя в него как отдельные части, введённые пользователем, тему письма, адрес получателя, сам текст и вложенные файлы: POST /send-message.html HTTP/1.1 Host: mail.example.com Referer: http://mail.example.com/send-message.html User-Agent: BrowserForDummies/4.67b Content-Type: multipart/form-data; boundary="Asrf456BGe4h" Content-Length: (суммарный объём, включая дочерние заголовки) Connection: keep-alive Keep-Alive: 300 (пустая строка) (отсутствующая преамбула) --Asrf456BGe4h Content-Disposition: form-data; name="DestAddress" (пустая строка) brutal-vasya@example.com --Asrf456BGe4h Content-Disposition: form-data; name="MessageTitle" (пустая строка) Я негодую --Asrf456BGe4h Content-Disposition: form-data; name="MessageText" (пустая строка) Привет, Василий! Твой ручной лев, которого ты оставил у меня на прошлой неделе, разодрал весь мой диван. Пожалуйста, забери его скорее! Во вложении две фотки с последствиями. --Asrf456BGe4h Content-Disposition: form-data; name="AttachedFile1"; filename="horror-photo-1.jpg" Content-Type: image/jpeg (пустая строка) (двоичное содержимое первой фотографии) --Asrf456BGe4h Content-Disposition: form-data; name="AttachedFile2"; filename="horror-photo-2.jpg" Content-Type: image/jpeg (пустая строка) (двоичное содержимое второй фотографии) --Asrf456BGe4h-- (отсутствующий эпилог) В примере в заголовках Content-Disposition параметр name соответствует атрибуту name в HTML-тегах <INPUT> и <TEXTAREA>. Параметр filename равен исходному имени файла на компьютере пользователя. Более подробная информация о формировании HTML-форм и вложении файлов в RFC 1867. История развития HTTP/0.9 HTTP был предложен в марте 1991 года Тимом Бернерсом-Ли, работавшим тогда в CERN, как механизм для доступа к документам в Интернете и облегчения навигации посредством использования гипертекста. Самая ранняя версия протокола HTTP/0.9 была впервые опубликована в январе 1992 года (хотя реализация датируется 1990 годом). Спецификация протокола привела к упорядочению правил взаимодействия между клиентами и серверами HTTP, а также чёткому разделению функций между этими двумя компонентами. Были задокументированы основные синтаксические и семантические положения. HTTP/1.0 В мае 1996 года для практической реализации HTTP был выпущен информационный документ RFC 1945, что послужило основой для реализации большинства компонентов HTTP/1.0. HTTP/1.1 Современная версия протокола; принята в июне 1999 года. Новым в этой версии был режим «постоянного соединения»: TCP-соединение может оставаться открытым после отправки ответа на запрос, что позволяет посылать несколько запросов за одно соединение. Клиент теперь обязан посылать информацию об имени хоста, к которому он обращается, что сделало возможной более простую организацию виртуального хостинга. HTTP/2 11 февраля 2015 года опубликованы финальные версии черновика следующей версии протокола. В отличие от предыдущих версий, протокол HTTP/2 является бинарным. Среди ключевых особенностей: мультиплексирование запросов, расстановка приоритетов для запросов, сжатие заголовков, загрузка нескольких элементов параллельно посредством одного TCP-соединения, поддержка проактивных push-уведомлений со стороны сервера. HTTP/3 HTTP/3 — предлагаемый последователь HTTP/2, который уже используется в Веб на основе UDP вместо TCP в качестве транспортного протокола. Как и HTTP/2, он не объявляет устаревшими предыдущие основные версии протокола. Поддержка HTTP/3 была добавлена в Cloudflare и Google Chrome в сентябре 2019 года и может быть включена в стабильных версиях Chrome и Firefox. См. также Список кодов состояния HTTP Заголовки HTTP (список): Referer User-Agent Cookie Дайджест-аутентификация HTTP/2 HTTPS Примечания Ссылки RFC 1945 — HTTP/1.0 (Май 1996), включает версию 0.9 RFC 2616 — HTTP/1.1 (Июнь 1999); см. также в виде PostScript и PDF; httpbis-http2-17 — HTTP/2 (11 февраля 2015) Окончательная спецификация «Разъяснение http/2» Даниэль Штенберг Найденные опечатки в спецификации HTTP/1.1 [www.lib.ru/WEBMASTER/rfc2068/ Перевод спецификации HTTP/1.1] Первоначальный HTTP 0.9 Тима Бернерса-Ли (написан и издан в 1991 году) Ранняя версия исходного черновика версии 1.0 1992 года Тима Бернерса-Ли Пример последовательности HTTP-обмена между браузером и сервером Функционирование HTTP-сервера Открытые форматы Интернет-протоколы Стандарты W3C Протоколы прикладного уровня


text: OSCAR ( — открытая система для общения в реальном времени) — открытый (с 5 марта 2008 года), но не свободный сетевой протокол, обеспечивающий обмен мгновенными и офлайновыми текстовыми сообщениями. Особенности протокола Каждому пользователю выдаётся UIN () — уникальный идентификационный номер, по которому пользователь однозначно определяется системой и другими пользователями. В настоящее время (январь 2010 г.) для совместимости с AIM вместо UIN используется понятие ScreenName. Пользователь имеет возможность выбрать себе ник, который играет роль личного имени в его сообщениях. В отличие от UIN, ники не уникальны для каждого пользователя. В AOL Instant Messenger функцию UIN играют SN () — так называемые экранные имена, уникальные для каждого пользователя. Протокол поддерживает несколько состояний, в которых может находиться пользователь. Состояния устанавливаются пользователем. Состояния Online — доступен Free for chat (F4C) — свободен Away — вдали от компьютера (долго не работал) Not available (N/A) — недоступен Occupied — занят Do not disturb (DND) — не беспокоить Invisible — невидим Offline — отключён В программах-клиентах сторонних разработчиков некоторые состояния могут отсутствовать или иметь место дополнительные. Реализации протокола Существует большое количество альтернативных клиентов ICQ для разных операционных систем, например: Miranda IM (Windows), QIP 2012 (Windows), &RQ (Windows), Pidgin (Windows, GNU/Linux), Licq (GNU/Linux), Kopete (GNU/Linux), qutIM (Windows, GNU/Linux, Mac OS X), Adium (Mac OS X) и пр. 5 марта 2008 года AOL открыла спецификации протокола (как впоследствии оказалось — не полностью: с помощью изменения закрытых деталей спецификации впоследствии 3 раза блокировались все неофициальные клиенты) и разрешила создание альтернативных клиентов, но с некоторыми ограничениями, установленными лицензией — например, клиент, используемый более чем 100 000 пользователями, должен показывать рекламу. Ссылки Документация на OSCAR, в том числе недокументированные возможности Терминология протокола OSCAR Неофициальная спецификация протокола AIM/OSCAR Документация на OSCAR (ICQ v7/v8/v9) Документация на OSCAR (Wiki) Архив официальной документации Протоколы обмена мгновенными сообщениями AOL Протоколы прикладного уровня


text: IMAP () — протокол прикладного уровня для доступа к электронной почте. Базируется на транспортном протоколе TCP и использует порт 143, а IMAPS (IMAP поверх SSL) — порт 993. IMAP работает только с сообщениями и не требует каких-либо пакетов со специальными заголовками. IMAP предоставляет пользователю широкие возможности для работы с почтовыми ящиками, находящимися на почтовом сервере. Почтовая программа, использующая этот протокол, получает доступ к хранилищу корреспонденции на сервере так, как будто эта корреспонденция расположена на компьютере получателя. Электронными письмами можно манипулировать с компьютера пользователя (клиента) без постоянной пересылки с сервера и обратно полного содержания писем. Для отправки писем используется обычно протокол SMTP, так как собственная команда отправки протокола IMAP, называемая APPEND, не содержит в себе механизма передачи служебной информации. Для имён почтовых ящиков (папок) с символами вне диапазона ASCII используется модифицированная версия кодировки UTF-7. Цель разработки протокола IMAP Протокол IMAP представляет собой альтернативу POP с зачаточными способностями по отправке. Первая версия протокола POP имела ряд недостатков, и наиболее серьёзный из них — отсутствие возможностей по управлению перемещением и хранением сообщений на сервере. В POP сообщения загружаются с почтового сервера все сразу, после чего они с сервера удаляются, то есть отсутствует возможность выбирать сообщения для получения. Для решения проблем, связанных с этой особенностью POP, в 1986 году , работавший тогда в Стэнфордском университете, создал новый протокол получения почты с сервера. Новый протокол предоставил пользователям возможность получения электронной почты в различных местах из одного почтового ящика. Пользователю предоставляется возможность управлять сообщениями в своём почтовом ящике и дополнительные функции по обслуживанию почтовых ящиков на сервере. В дальнейшем протокол POP был доработан, в POP3 (POP версии 3) есть возможность получать с сервера избранные сообщения и оставлять избранные сообщения на сервере. В последних версиях между IMAP и POP основное различие для пользователя — IMAP4 может обращаться к письмам в разных почтовых папках на сервере и перемещать письма между ними, а POP3 обращается к письмам на сервере по номерам в линейном списке (то есть работает только с одной почтовой папкой). Версии протокола IMAP IMAP: в 1986 реализован на DEC, спецификация отсутствует IMAP2: реализован в 1987, описан в 1988 в RFC 1064, доработан в 1990 (RFC 1176) IMAP3: 1991 RFC 1203 IMAP2bis, спецификация существует только в черновом варианте 1993 года, плюс в RFC 2061 (1996) описаны различия между IMAP4 и IMAP2bis IMAP4: 1994 RFC 1730 IMAP4rev1: 1996 RFC 2060, 2003 RFC 3501 Преимущества по сравнению с POP3 При использовании POP3 клиент подключается к серверу только на промежуток времени, необходимый для загрузки новых сообщений. При использовании IMAP соединение не разрывается, пока пользовательский интерфейс активен, а сообщения загружаются только по требованию клиента. Это позволяет уменьшить время отклика для пользователей, в чьих ящиках имеется много сообщений большого объёма. Протокол POP требует, чтобы текущий клиент был единственным подключённым к ящику. IMAP допускает одновременный доступ нескольких клиентов к ящику и предоставляет клиенту возможность отслеживать изменения, вносимые другими клиентами, подключёнными одновременно с ним. Благодаря системе флагов, определённой в IMAP4, клиент может отслеживать состояние сообщения (прочитано, отправлен ответ, удалено и т. д.); данные о флагах хранятся на сервере. Клиенты IMAP4 могут создавать, переименовывать и удалять ящики и перемещать сообщения между ящиками. Кроме того, можно использовать расширение «IMAP4 Access Control List (ACL) Extension» (RFC 4314) для управления правами доступа к ящикам. Поиск сообщений происходит на стороне сервера. IMAP4 имеет явный механизм расширения. Сообщения и их атрибуты IMAP работает только с сообщениями и не требует каких-либо пакетов со специальными заголовками. Каждое сообщение имеет несколько связанных с ним атрибутов. Эти атрибуты могут быть определены индивидуально или совместно с другими атрибутами. UID Каждому сообщению ставится в соответствие 32-битный код, который при использовании совместно с уникальным идентификатором образует 64-битовую последовательность, гарантирующую однозначную идентификацию сообщения в почтовом ящике. Чем позже сообщение пришло, тем больше его UID. UID ассоциируется с почтовым ящиком и посылается в виде кода uidvalidity отклика (ok) на фазе выбора почтового ящика. Если UID из предыдущей сессии по какой-то причине не может быть использован, UID должен быть инкрементирован. UID сообщения не должно изменяться в пределах сессии, его не следует изменять и от сессии к сессии. Однако если невозможно сохранить UID сообщения в последующей сессии, каждая следующая сессия должна иметь новый уникальный код идентификатора, который должен быть больше, чем любой UID, использованный ранее. Порядковый номер сообщения Порядковый номер сообщения в почтовом ящике начинается с 1. Каждое сообщение, начиная со второго, имеет порядковый номер ровно на 1 больше, чем предшествующее ему. В течение сессии допустимо изменение порядкового номера сообщения. Например, когда сообщение удаляется из почтового ящика, номера всех последующих сообщений изменяются. Флаги сообщения Этот атрибут представляет собой список из нуля или более именованных лексем, соотнесённых с данным сообщением. Флаг устанавливается путём его добавления к этому списку и обнуляется путём его удаления. В IMAP 4.1 существует два типа флагов. Флаг может быть постоянным или действующим только на время данной сессии. Системным флагом является флаг, имя которого определено в спецификации протокола. Все системные флаги начинаются с символа \. В настоящее время определены следующие системные флаги: \seen — сообщение прочитано \answered — на сообщение отправлен ответ \flagged — сообщение отмечено как «важное» \deleted — сообщение отмечено как удалённое \draft — сообщение отмечено как черновик \recent — недавнее сообщение (впервые появилось в ящике в ходе текущей сессии) Внутренние дата и время сообщения на сервере Время и дата получения сообщения. В случае доставки сообщения посредством протокола SMTP — дата и время доставки конечному адресату. Для сообщений, доставленных командой копирования — внутренняя дата и время отправителя сообщения. При использовании команды append — дата и время, заданные параметрами команды. Прочие атрибуты размер сообщения — число октетов в сообщении. структура конверта сообщения. структура тела сообщения Взаимодействие клиента и сервера Соединение IMAP 4.1 подразумевает установление связи между клиентом и сервером. Клиент посылает серверу команды, сервер клиенту — данные и уведомления о статусе выполнения запроса. Все сообщения, как клиента, так и сервера, имеют форму строк, завершающихся специальной последовательностью. Любая процедура начинается с команды клиента. Любая команда клиента начинается с префикса-идентификатора (обычно короткая буквенно-цифровая строка, например, A0001, A0002 и т. д.), называемого меткой (tag). Для каждой команды клиент генерирует свою метку. Возможны два случая, когда строка, отправленная клиентом, не представляет собой законченную команду. В первом — аргумент команды снабжается кодом, определяющим число октетов в строке. Во втором — аргументы команды требуют отклика со стороны сервера. В обоих случаях сервер посылает запрос продолжения команды, начинающийся с символа +. Клиент должен завершить отправку одной команды, прежде чем отправить другую. Протокольный приемник сервера читает строку команды, пришедшей от клиента, осуществляет её разбор, выделяет параметры и передаёт серверу данные. По завершении команды сервер посылает отклик. Данные, передаваемые сервером клиенту, а также статусные отклики, которые не указывают на завершение выполнения команды, имеют префикс * и называются непомеченными откликами. Данные могут быть отправлены сервером в ответ на команду клиента или по собственной инициативе. Формат данных не зависит от причины отправки. Отклик указывает на удачное/неудачное выполнение операции. Он использует ту же метку, что и команда клиента, запустившая процедуру. Таким образом, если осуществляется более, чем одна команда, метка сервера указывает на команду, вызвавшую данный отклик. Имеется три вида отклика завершения сервера: ok (успешное выполнение), no (неудача), bad (протокольная ошибка, например, не узнана команда или зафиксирована синтаксическая ошибка). Протокольный приемник клиента IMAP 4.1 читает строку отклика от сервера и предпринимает действия в соответствии с первым символом * или +. Клиент должен быть готов принять любой отклик сервера в любое время. Данные сервера должны быть записаны так, чтобы клиент мог их непосредственно использовать, не посылая серверу уточняющих запросов. Состояния сервера IMAP Сервер IMAP 4.1 находится в одном из четырёх состояний. Большинство команд можно использовать только в определённых состояниях. В состоянии без аутентификации клиент должен предоставить имя и пароль, прежде чем ему станет доступно большинство команд. Переход в это состояние производится при установлении соединения без предварительной аутентификации. В состоянии аутентификации клиент идентифицирован и должен выбрать почтовый ящик, после чего ему станут доступны команды для работы с сообщениями. Переход в это состояние происходит при установлении соединения с предварительной аутентификацией, когда выданы все необходимые идентификационные данные или при ошибочном выборе почтового ящика. В состояние выбора система попадает, когда успешно осуществлен выбор почтового ящика. В состояние выхода система попадает при прерывании соединения в результате запроса клиента или вследствие независимого решения сервера. Соединение без предварительной аутентификации Соединение с предварительной аутентификацией Соединение отвергнуто Успешное завершение команды LOGIN или AUTHENTICATE Успешное завершение команды SELECT или EXAMINE Выполнение команды CLOSE или неудачная команда SELECT или EXAMINE Выполнение команды LOGOUT, закрытие сервера или прерывание соединения Команды протокола IMAP LOGIN Позволяет клиенту при регистрации на сервере IMAP использовать идентификатор пользователя и пароль в обычном текстовом виде. Это не самый лучший метод, но иногда это единственная возможность подключиться к серверу. AUTHENTICATE Позволяет клиенту использовать при регистрации на сервере IMAP альтернативные методы проверки подлинности. Индивидуальная проверка подлинности пользователей не является обязательной и поддерживается не всеми серверами IMAP. К тому же реализации такой проверки могут различаться в зависимости от сервера. Когда клиент выдает команду AUTHENTICATE, сервер отвечает на неё строкой вызова в кодировке base64. Далее клиент должен отправить ответ на вызов сервера о проверке подлинности, также закодированный base64. Если на сервере не поддерживается метод проверки подлинности, предложенный клиентом, он включает в свой ответ слово NO. После этого клиент должен продолжить переговоры по согласованию метода проверки подлинности. Если все попытки определить метод проверки подлинности потерпели неудачу, то клиент предпринимает попытку зарегистрироваться на сервере посредством команды LOGIN. CLOSE Закрывает почтовый ящик. Когда почтовый ящик закрыт с помощью этой команды, то сообщения, помеченные флагом \DELETED, удаляются из него. Не имеет параметров. LOGOUT Завершает сеанс для текущего идентификатора пользователя. CREATE Создаёт новый почтовый ящик. Имя и местоположение новых почтовых ящиков определяются в соответствии с общими спецификациями сервера. DELETE Применяется к почтовым ящикам. Сервер IMAP при получении этой команды попытается удалить почтовый ящик с именем, указанным в качестве аргумента команды. Сообщения удаляются вместе с ящиками и восстановлению не подлежат. RENAME Изменяет имя почтового ящика. Эта команда имеет два параметра — имя почтового ящика, который требуется переименовать, и новое имя почтового ящика. SUBSCRIBE Добавляет почтовый ящик в список активных ящиков клиента. В этой команде используется только один параметр — имя почтового ящика, который нужно внести в список. Почтовый ящик не обязательно должен существовать, чтобы его можно было добавить в список активных ящиков — это позволяет добавлять в список активных ящиков ящики, которые ещё не созданы, или удалять их, если они пусты. UNSUBSCRIBE Удаляет почтовые ящики из списка активных. В ней так же используется один параметр — имя почтового ящика, который удаляется из списка активных ящиков клиента. При этом сам по себе почтовый ящик не удаляется. LIST Получить список всех почтовых ящиков клиента; имеет два параметра. LSUB В отличие от команды LIST используется для получения списка ящиков, активизированных командой SUBSCRIBE. Параметры — такие же, как у LIST. STATUS Формирует запрос о текущем состоянии почтового ящика. Первым параметром для этой команды является имя почтового ящика, к которому она применяется. Второй параметр — это список критериев, по которым клиент хочет получить информацию. Команда STATUS может использоваться для получения информации о состоянии почтового ящика без его открытия с помощью команд SELECT или EXAMINE. Пользователь может получить информацию по критериям: MESSAGES — общее число сообщений в почтовом ящике RECENT — число сообщений с флагом \recent UIDNEXT — идентификатор UID, который будет назначен новому сообщению UIDVALIDITY — уникальный идентификатор почтового ящика UNSEEN — число сообщений без флага \seen APPEND Добавляет сообщение в конец указанного почтового ящика. В качестве аргументов указываются имя ящика, флаги сообщения (не обязательно), метка времени (не обязательно) и само сообщение — заголовок и тело. Имеются следующие флаги сообщений: \Seen — прочитано \Answered — написан ответ \Flagged — срочное \Deleted — помечено для удаления \Draft — черновик \Recent — новое сообщение, оно поступило в почтовый ящик после окончания прошлого сеанса Если в команде указаны флаги, то они устанавливаются для добавляемого сообщения. В любом случае для сообщения устанавливается флаг \Recent. Если в команде задана метка времени, то это время будет установлено в качестве времени создания сообщения, в противном случае за время создания принимается текущее время. Поскольку сообщение состоит не из одной строки, используются литералы. Пример: C A003 APPEND saved-messages (\Seen) {247} S + Ready for literal data C Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST) C From: Fred Foobar <foobar@Blurdybloop.COM> C Subject: afternoon meeting C To: mooch@owatagu.siam.edu C Message-Id: <B27397-0100000@Blurdybloop.COM> C C Hello Joe, do you think we can meet at 3:30 tomorrow? S A003 OK APPEND completed Расширение MULTIAPPEND, описанное в RFC 3502, позволяет одной командой добавлять в почтовый ящик несколько сообщений. CHECK Устанавливает контрольную точку в почтовом ящике. Любые операции, такие, например, как запись данных из памяти сервера на его жёсткий диск, должны выполняться при соответствующем состоянии почтового ящика. Именно для проверки целостности почтового ящика после дисковых и других подобных им операций и применяется команда CHECK. Эта команда используется без параметров. EXPUNGE Удаляет из почтового ящика все сообщения, помеченные флагом \DELETED, при этом почтовый ящик не закрывается. Ответ сервера на команду EXPUNGE представляет собой отчёт о новом состоянии почтового ящика. SEARCH Поиск сообщений по критериям в активном почтовом ящике с последующим отображением результатов в виде номера сообщения. Возможен поиск сообщений, в теле которых имеется определённая текстовая строка, или имеющих определённый флаг, или полученных до определённой даты и т. д. FETCH Получить текст почтового сообщения. Команда применяется только для отображения сообщений. В отличие от POP3, клиент IMAP не сохраняет копию сообщения на клиентском ПК. STORE Изменяет информацию о сообщении. COPY Копирует сообщения из одного почтового ящика в другой. UID Используется в связке с командами FETCH, COPY, STORE или SEARCH. С её помощью в этих командах можно использовать реальные идентификационные номера UID вместо последовательности чисел из диапазона номеров сообщений. CAPABILITY Запрос у сервера IMAP информации о его возможностях. NOOP Команда ничего не делает. Она может применяться для поддержки активности во время сеанса для того, чтобы сеанс не прекратился по таймеру интервала ожидания. Ответ сервера на команду NOOP всегда должен быть положительным. Так как сервер часто в ответе возвращает состояние выполнения той или иной команды, то NOOP вполне можно использовать как триггер для периодического запроса о состоянии сервера. Литература Ссылки RFC 3501 — Internet Message Access Protocol v4rev1 Howto: Configuring KMail with Gmail — IMAP and Disconnected IMAP Примечания Протоколы прикладного уровня Электронная почта 1986 год в науке