Библиотека сайта rus-linux.net
Sendmail - Архитектура и принципы разработки
Глава 17 из 1 тома книги "Архитектура приложений с открытым исходным кодом".
Оригинал: "Sendmail"
Автор: Eric Allman
Дата публикации: 2012 г.
Перевод: Vlad http://vlad8.com/
Дата перевода: 2013 г.
Creative Commons. Перевод был сделан в соответствие с лицензией Creative Commons. С русским вариантом лицензии можно ознакомиться здесь.
Под электронной почтой большинство людей подразумевает ту программу, которой они пользуются, то есть свой e-mail клиент. На техническом языке он называется «почтовым агентом пользователя». Но есть и другая важная часть электронной почты — программное обеспечение, которое в действительности осуществляет пересылку сообщений от отправителя к получателю – агент передачи почты (Mail Transfer Agent – MTA). Первой, и до сих пор наиболее используемой из подобных программ, стала программа sendmail.
Sendmail был создан еще до того, как Интернет официально начал свое существование. Программа стала феноменально успешной. Ее история ведет отсчет с 1981 года, когда еще совсем не было ясно, что Интернет станет чем-то большим, чем академический эксперимент с сотней хостов, и продолжается до сегодняшнего дня, когда число пользователей Сети перевалило за 800 миллионов (по состоянию на январь 2011). Sendmail остается одной из наиболее используемых реализаций протокола SMTP в Интернете.
17.1. Как все начиналось…
Первые версии программы, которая будет позже известна как sendmail, были написаны в 1980 году. Программа началась как быстрый хак для передачи сообщений между различными сетями (Интернет в то время разрабатывался, но еще не был полнофункциональным). Предполагалось наличие множества различных сетей, и не было единого консенсуса на тему, какая из сетей будет главной. В США использовалась Арпанет, а Интернет конструировался как ее апгрейд, однако Европа решительно настаивала на OSI (Open Systems Interconnect), и какое-то время казалось, что OSI может взять верх. Обе сети использовали выделенные линии телефонных компаний; в США скорость таких линий составляла 56 kbps.
Вероятно, наиболее успешной сетью на то время, с точки зрения числа подключенных компьютеров и людей, была сеть UUCP, которая отличалась тем, что у нее абсолютно отсутствовал центральный орган управления. В каком-то смысле это была самая первая пиринговая сеть, работавшая через коммутируемые телефонные линии: 9600 bps была какое-то время максимальной скоростью. Самой быстрой сетью (3 Mbps) была сеть, основанная на Ethernet от Xerox и работавшая посредством протокола, названного XNS (Xerox Network Systems). Но она не работала вне локального окружения.
Обстановка того времени довольно сильно отличалась от того, что мы имеем сегодня. Компьютеры были разнотипны до такой степени, что не было даже полного согласия об использовании 8-битных байтов. Например, были компьютеры PDP-10 (36-битные слова, 9-битные байты), PDP-11 (16-битные слова, 8-битные байты), серия CDC 6000 (60-битные слова, 6-битные символы), IBM 360 (32-битные слова, 8-битные байты), XDS 940, ICL 470 и Sigma 7. На подходе была платформа Unix из Bell Laboratories. Большинство Unix-машин использовали 16-битное адресное пространство: в то время PDP-11 была главной машиной на Unix, Data General 8/32 и VAX-11/780 только появлялись. Потоки не существовали – вообще концепция динамических процессов была довольно новой (в Unix они были, но «серьезные» системы вроде IBM OS/360 их не имели). Блокировка файлов не поддерживалась ядром Unix (хотя сделать это было возможно используя ссылки файловой системы).
Те сети, которые существовали, были довольно низкоскоростными (многие использовали 9600-бодовые линии TTY; у самых богатых был Ethernet, но только локально). Почтенный интерфейс сокетов еще не будет изобретен в течение многих лет. Шифрование публичными ключами тоже еще не было изобретено, так что большая часть сетевой безопасности, такой как мы ее знаем сегодня, не была возможна.
Сетевая почта уже существовала в Unix, но она была создана через хаки. Основным пользовательским агентом в то время была команда /bin/mail (сегодня иногда называемая как binmail или v7mail), но у некоторых узлов сети были другие агенты, такие как Mail из Беркли, который действительно умел работать с отдельными сообщениями, а не просто был приукрашенной командой cat. Каждый пользовательский агент читал (а обычно и писал!) в /usr/spool/mail напрямую; не было абстракций для настоящего хранения сообщений.
Логика принятия решения о том, направлять ли сообщение в сеть или локально, определялась просто за счет проверки содержания в адресе восклицательного знака (для UUCP) или запятой (для BerkNET). Люди с доступом к Арпанет должны были использовать абсолютно отдельную почтовую программу, которая не работала с другими сетями, и которая даже хранила локальную почту в другом месте и другом формате.
Чтобы еще более все запутать, фактически тогда не было никакой стандартизации формата сообщений. Существовало общее соглашение о том, что в начале сообщения должен было быть блок полей заголовка, каждое поле заголовка должно было начинаться с новой строки, имена и значения полей должны были быть разделены запятой. Кроме этого не существовало никакой стандартазиации в выборе имен полей заголовка или синтаксисе индивидуальных полей. Например, некоторые системы использовали Subj: вместо Subject:, поля Date: использовали различный синтаксис, некоторые системы не понимали полные имена в поле From:
Кроме всего вышеперечисленного, то, что все-таки было задокументировано, зачастую было двусмысленным или не совсем использовалось. В частности, RFC 733 (который должен был описывать формат сообщений Арпанет) отличался от реально используемого формата в небольших, но значимых деталях, а метод непосредственной передачи сообщений вообще не был официально документирован (хотя несколько RFC ссылались на механизм, но не описывали его). Результатом было то, что система передачи сообщений напоминала колдовство.
В 1979 году проект управления реляционными базами данных INGRES (также известные в то время как “моя работа”) получили грант DARPA и вместе с ним 9600 bps подключение нашего PDP-11 к Арпанет. В то время это было единественное доступное соединение к Арпанет в отделе Computer Science, поэтому все хотели получить к нему доступ. Однако наша машина уже была забита и мы могли сделать доступными для всех только два порта. Это приводило к существенным разногласиям и частым конфликтам. Однако, я заметил, что люди обращались больше всего не к удаленному управлению или передаче файлов, а к электронной почте.
Среди всего этого sendmail (изначально названный delivermail) появился как попытка унифицировать хаос в одном месте. Каждый почтовый агент пользователя (или почтовый клиент) просто вызывал delivermail для доставки почты вместо того, чтобы определять как ее доставить самостоятельно, зачастую, произвольным (и непостоянным) образом. Delivermail/sendmail не предпринимали попыток диктовать, как локальная почта должна храниться или доставляться; программа не делала абсолютно ничего, кроме передачи почты между другими программами. (как мы скоро узнаем, эта ситуация изменилась, когда был добавлен SMTP). В каком-то смысле это был просто «клей» для совместной работы различных почтовых систем, вместо того чтобы являться самостоятельной почтовой системой.
Во время разработки sendmail Арпанет была преобразована в Интернет. Изменения не появлялись мгновенно и они были существенными: начиная от низкоуровневых пакетов при подключении до протоколов приложений.
Sendmail был буквально разработан одновременно со стандартами, а в некоторых случаях повлиял на них. Также примечательно то, что sendmail выжил и даже преуспел, несмотря на то, что Сеть (такая, какой мы знаем ее сегодня) выросла с нескольких сотен до миллионов хостов.
Другая сеть
Стоит упомянуть, что в то время был предложен еще один, абсолютно отдельный, почтовый стандарт, названный X.400, бывший частью ISO/OSI (International Standards Organization/Open Systems Interconnect). X.400 был бинарным протоколом, сообщения кодировались при помощи ASN.1 (Abstract Syntax Notation 1), который до сих пор используется некоторыми протоколами, например, LDAP. LDAP был свою очередь упрощением X.500, а тот – службой директорий, используемой X.400. Sendmail вообще никак не проектировался для прямой совместимости с X.400, хотя в то время существовали некоторые шлюзовые сервисы. Хотя X.400 был первоначально принят многими коммерческими компаниями того времени, Интернет-почта и SMTP стали стандартом де-факто.
Продолжение статьи: Принципы разработки