Кратко

  • RFC 1090 в феврале 1989 года предложил открывать двусторонний виртуальный канал X.25 для каждой SMTP-сессии, вести по нему диалог и освобождать после завершения.
  • При освобождении X.25 пакеты в пути могли пропасть. Вызывающая сторона поэтому ждала SMTP-ответа о закрытии службы, обычно после QUIT, и только затем сбрасывала канал.

Последний конверт остался между столами

В RFC 821 1982 года уже обсуждались публичные сети X.25 как транспорт для SMTP. Приложение D советовало добавить поверх такого соединения надёжный протокол от конца до конца, например TCP. Семь лет спустя R. Ullmann описал в RFC 1090 прямую работу на виртуальном канале. По сообщению самого документа, процедура применялась в 24 публичных сетях пакетной передачи данных в 22 странах. Короткий текст опирался на заявленный опыт эксплуатации, поэтому его особенно интересовали не лозунги, а секунды ожидания и порядок выключения.

План легко нарисовать на листке. Для одной сессии SMTP открывают один канал X.25, используют двусторонний поток для команд, ответов и данных письма, затем освобождают канал. Обычно это делает сторона, инициировавшая вызов. Язык SMTP остаётся прежним. Но у несущей его линии собственная механика прощания, и именно она способна испортить конец письма.

RFC 1090 предупреждал: когда начинается сброс канала X.25, ещё движущиеся данные не доставляются синхронно. Пакеты в пути отбрасываются. Отправитель мог закончить передачу у себя и тут же убрать линию из-под байтов, которые ещё не дошли. Поэтому вызывающая сторона сначала получала SMTP-сообщение Service Closing, обычно ответ на QUIT, а затем освобождала виртуальный канал. В почтовом отделении никто не запирает дверь, пока коллега несёт к ней последний конверт.

У разных ответов разные значения. Ответ после данных письма относится к текущей SMTP-транзакции. Service Closing означает конец сессии. Сброс X.25 завершает сам путь передачи. Дальнейшая судьба письма в системе получателя относится к последующей работе. Правило RFC 1090 касалось границы между последней репликой сервиса и разборкой транспорта. Сторона с выключателем ждала знак от противоположного конца.

При открытии линии требовалось представиться. Четыре первых октета поля Call User Data рекомендовалось заполнять идентификатором протокола C0F70000 в шестнадцатеричной записи. Реализациям при этом предлагалось разрешить настройку этих данных, включая идентификатор, для каждого адреса вызова. Общий знак для SMTP сочетался с местными правилами разных сетей.

Внутри канала отправитель делил поток SMTP на пакеты как хотел. Документ поощрял последовательности с битом M — «будут ещё данные» — общей длиной до 2048 байт. Для удобства отладки каждую команду или ответ рекомендовали помещать в один пакет либо одну такую последовательность. Это облегчало чтение записи обмена. Пакеты квалифицированных данных с битом Q и пакеты прерывания здесь не использовались; при получении их следовало игнорировать. Передавался восьмибитный ASCII, строки оканчивались CRLF, а распознавание одиночного LF считалось желательным, если возможно.

Сброс канала на третьем уровне запускал другую последовательность: освободить виртуальный канал и ещё раз попытаться установить SMTP-соединение, возможно позднее или с другими параметрами вызова. Настройка этих параметров по адресу назначения имела практическое значение. Новая линия означала новую попытку и новое приветствие, а не продолжение прерванной фразы.

Ожидание также имело пределы. На принятие вызова RFC выделял 100 секунд, на следующее приветствие Service Ready — ещё 120. В установленной сессии десять минут без ответа могли привести к сбросу. После QUIT таймер сокращался до двадцати секунд. Конец мог получиться неловким, но документ утверждал, что уже завершённые SMTP-транзакции сохраняют свой результат. Эти значения были представлены как проверенная на практике дисциплина: дать соседу время ответить и вернуть линию в работу.

Историю RFC 1090 можно изобразить одним пальцем над выключателем. Вызывающая сторона могла открыть и закрыть канал; удалённая сторона подавала знак, когда закрытие переставало глотать последние слова. Почта двигалась по линии, пока обе стороны одинаково понимали конец разговора.