Summary

  • Экспериментальная RFC 1845 1995 года добавляла к SMTP объявление CHECKPOINT, идентификатор одной передачи TRANSID и сохранение состояния сервером в энергонезависимом хранилище.
  • Ответ 355 6135 в демонстрационном диалоге означал 6135 сохранённых октетов данных сообщения. Команды конверта и октеты, добавленные при SMTP dot-stuffing, в счёт не входили.

Плохая связь превращала большое письмо в многократную перевозку одного и того же груза. Первоначальный SMTP не позволял после разрыва TCP вернуться к середине незавершённой передачи. В сентябре 1995 года D. Crocker, N. Freed и A. Cargille предложили экспериментальное расширение: сервер будет хранить достигнутое, а отправитель спросит, какая часть действительно осталась на диске. Число 6135 дано авторами в образце протокольного диалога, а не в отчёте об аварии.

Сначала отправитель проверял право на такую сделку. На EHLO сервер должен был ответить с ключевым словом CHECKPOINT. Тогда к MAIL FROM добавлялся TRANSID, чувствительный к регистру идентификатор одной SMTP-транзакции. Он не совпадал по назначению с обычным Message-ID внутри письма. Одна и та же почта может разойтись несколькими копиями по разным путям; заголовок у них общий, а объём сохранённого на каждом сервере разный. Принимать общий номер письма за номер конкретной передачи было бы плохой бухгалтерией.

Серверу приходилось записывать не только номер, но и последнее состояние транзакции в энергонезависимую память. RFC рекомендовала держать прерванное состояние не менее 48 часов, оставляя точный срок местной политике. Клиент после обрыва выжидал, пока освободится прежнее соединение, и заново проверял DNS. Старый адрес пробовался первым, если он ещё оставался допустимым; затем приходила очередь других. Если на другом сервере продолжение не удавалось, требовалось послать всю транзакцию заново. Ожидание возвращения старой машины не должно было задерживать письмо без конца.

Повторный MAIL FROM приносил точно тот же TRANSID. Сервер мог ответить 355 6135 is the transaction offset. Смещение указывало на следующий октет данных сообщения, считая от нуля, и одновременно на число октетов, успешно сохранённых до него. MAIL FROM и RCPT TO не прибавлялись. Не прибавлялись и дополнительные байты, которыми SMTP защищает строки, начинающиеся с точки. При передаче через DATA возобновление должно было приходиться на начало строки. Просто открыть локальный файл на позиции 6135 значило бы считать по другой шкале; нужен канонический поток SMTP.

Далее в примере следуют DATA, остаток сообщения и 250 OK. RFC допускала даже грубоватый, но точный приём: заново сформировать весь поток на стороне отправителя и не выводить первые 6135 октетов. Канал связи избавлялся от повторной пересылки, а правила счёта сохранялись.

Квитанция сервера говорила о сохранённом префиксе одной передачи. Она не сообщала, открыл ли письмо адресат, и не была общим именем всех копий сообщения. Ограниченность этой записи делала её пригодной для решения, на котором легко ошибиться: с какого байта продолжать после потери соединения.