RFC 5357 A Two-Way Active Measurement Protocol (TWAMP)

Network Working Group                                         K. Hedayat
Request for Comments: 5357                                 Brix Networks
Category: Standards Track                                  R. Krzanowski
                                                                 Verizon
                                                               A. Morton
                                                               AT&T Labs
                                                                  K. Yum
                                                        Juniper Networks
                                                              J. Babiarz
                                                         Nortel Networks
                                                            October 2008

A Two-Way Active Measurement Protocol (TWAMP)

Протокол активных двухсторонних измерений (TWAMP)

PDF

Статус документа

Это документ содержит проект стандарта протокола Internet для сообщества Internet и служит приглашением к дискуссии в целях развития и совершенствования протокола. Текущее состояние стандартизации и статус протокола можно узнать из текущей версии документа Internet Official Protocol Standards (STD 1). Допускается свободное распространение документа.

Аннотация

Протокол односторонних активных измерений (One-way Active Measurement Protocol или OWAMP), описанный в RFC 4656, обеспечивает основу для измерения параметров пути между сетевыми устройствами в одном направлении. OWAMP можно использовать для измерений в обоих, запуская встречные односторонние измерения между двумя элементами сети. Однако протокол не поддерживает круговых (round-trip) или двухсторонних измерений. Этот документ задает протокол двухсторонних активных измерений (Two-Way Active Measurement Protocol или TWAMP) на основе OWAMP, который добавляет возможности круговых или двухсторонних измерений. Архитектура измерений TWAMP обычно включает два хоста с конкретными ролями и это обеспечивает некоторое упрощение протокола, делающее его привлекательным во многих ситуациях.

1. Введение

В IETF1 завершена разработка предлагаемого стандарта (Proposed Standard) для метрики задержек кругового обхода [RFC2681]. Также завершен протокол для управления и сбора односторонних измерений OWAMP [RFC4656]. Однако OWAMP не может выполнять круговых или двухсторонних измерений.

Двухсторонние измерения часто возникают в сетях IP в основном по причине того, что синхронизация между локальными и удаленными часами не требуется для задержки при круговом обходе (round-trip), а поддержка измерений на удаленной стороне может ограничиваться простой эхо-функцией (отражение). Однако наиболее распространенным средством круговых измерений остается ICMP Echo Request/Reply (применяется в ping) и проблемы этого метода рассмотрены в параграфе 2.6 [RFC2681]. Этот документ задает протокол активных двухсторонних измерений TWAMP. Этот протокол использует методологию и архитектуру OWAMP [RFC4656] для определения открытого протокола измерений двухсторонних или круговых параметров (далее в документе термин двухсторонний указывает также и круговой) в дополнение к односторонним измерениям OWAMP. В TWAMP используются временные метки, применяемые на отражающем хосте (рефлектор) для повышения точности (позволяет учесть задержки при обработке). Архитектура измерений TWAMP обычно включает лишь два хоста с конкретными ролями и это позволяет упростить протокол, делая его в некоторых случаях привлекательным дополнением к OWAMP.

Ключевые слова необходимо (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не нужно (SHALL NOT), следует (SHOULD), не следует (SHOULD NOT), рекомендуется (RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе интерпретируются в соответствии с RFC 2119 [RFC2119].

1.1. Связь между протоколами тестирования и управления

Подобно OWAMP [RFC4656], протокол TWAMP фактически состоит из двух связанных между собой протоколов — TWAMP-Control и TWAMP-Test. Связь между этими протоколами определена в параграфе 1.1 спецификации OWAMP [RFC4656]. TWAMP-Control служит для организации, запуска и остановки тестовых сеансов, а TWAMP-Test — для обмена тестовыми пакетами между элементами TWAMP.

1.2. Логическая модель

Роли и определения логических элементов заданы в параграфе 1.2 спецификации OWAMP [RFC4656], а ниже приведен ряд исключений.

  • Session-Receiver называется Session-Reflector в архитектуре TWAMP. Рефлектор может создавать и передавать тестовые пакеты при получении другого тестового пакета. В отличие от Session-Receiver, рефлектор не собирает информацию из пакетов.

  • Сервер является конечной системой, которая управляет одной или множеством сессий TWAMP и позволяет настраивать состояние конечных точек на уровне сессии. Однако сервер, связанный с Session-Reflector, не сможет возвращать результаты сеанса тестирования и в этом состоит отличие от OWAMP.

  • Элемента Fetch-Client нет в архитектуре TWAMP, поскольку Session-Reflector не собирает данных из пакетов.

Пример возможных связей между элементами в разных ролях показан на рисунке. В этом примере роли распределены между разными хостами. Каналы без меток не задаются этой спецификацией и могут использовать фирменные (proprietary) протоколы.

+----------------+               +-------------------+
| Session-Sender |<-TWAMP-Test-->| Session-Reflector |
+----------------+               +-------------------+
  ^                                     ^
  |                                     |
  |                                     |
  |                                     |
  |  +----------------+<----------------+
  |  |     Server     |
  |  +----------------+
  |    ^
  |    |
  | TWAMP-Control
  |    |
  v    v
+----------------+
| Control-Client |
+----------------+

Как и в OWAMP [RFC4656], разные логические роли могут быть связаны с одним хостом. В примере на приведенном выше рисунке можно обойтись двумя хостами, на одном из которых будут работать Control-Client и Session-Sender, на другом — Server и Session-Reflector, как показано ниже.

+-----------------+                   +-------------------+
| Control-Client  |<--TWAMP-Control-->|      Server       |
|                 |                   |                   |
| Session-Sender  |<--TWAMP-Test----->| Session-Reflector |
+-----------------+                   +-------------------+

1.3. Произношение

Акроним OWAMP обычно произносится в два слога как Oh-wamp.

Акроним TWAMP обычно произносится в два слога как Tee-wamp.

2. Обзор протокола

TWAMP является открытым протоколом для двухсторонних измерений. Он основан на OWAMP [RFC4656] и придерживается общих принципов архитектуры и устройства. Протоколы TWAMP-Control и TWAMP-Test выполняют свои задачи, как описано ниже.

  • Control-Client инициирует соединение TCP через общеизвестный порт TWAMP и сервер (его роль установлена) отвечает сообщением Greeting, включающим желаемый режим защиты и контроля целостности.

  • Control-Client отвечает выбранным режимом связи и информацией для поддержки защиты целостности и шифрования, если этого требует режим. Server отвечает восприятием режима и сообщает свое время старта. На этом организация управляющего соединения завершается.

  • Control-Client запрашивает (и описывает) сессию тестирования уникальным сообщением TWAMP-Control. Сервер отвечает восприятием и поддерживающей информацией. Можно запросить дополнительные сессии, передав другие такие же сообщения.

  • Control-Client инициирует все запросы тестирования в сообщении Start-Sessions, Server подтверждает их.

  • Session-Sender и Session-Reflector обмениваются тестовыми пакетами в соответствии с протоколом TWAMP-Test в каждой сессии.

  • При необходимости Control-Client передает сообщение для остановки всех тестовых сессий.

В протоколе TWAMP имеется два расширения.

  1. Поле Modes служит для организации коммуникационных опций при создании соединения TWAMP-Control.

  2. TWAMP-Control Command Number является другим механизмом расширения, позволяющим в будущем определить дополнительные команды.

TWAMP-Control позволяет распределять возможности между Control-Client и Server.

Многооктетные значения, определенные в этом документе, представляются целыми числами без знака с сетевым порядком байтов, если явно не указано иное.

Биты, помеченные символами MBZ (должен быть 0) в этом документе, отправитель должны устанавливать в 0, а получатели должны игнорировать.

3. TWAMP-Control

TWAMP-Control является адаптацией протокола OWAMP-Control для двухсторонних измерений. Все сообщения TWAMP-Control похожи по формату и следуют рекомендациям, похожим на заданные в разделе 3 спецификации OWAMP [RFC4656], за исключением отмеченных в последующих параграфах отличий. Одним из таких отличий является отсутствие в TWAMP команды Fetch-Session.

3.1. Организация соединения

Организация соединения TWAMP следует процедуре, определенной в параграфе 3.1 спецификации OWAMP [RFC4656]. Поле Modes является признанным механизмом расширения в TWAMP и текущие значения режимов идентичны принятым в OWAMP. Единственным исключением является номер общеизвестного порта для TWAMP-Control. Клиент открывает соединение TCP с сервером через порт 862. Хост, инициирующий соединение TCP, принимает роли Control-Client и (при работе на двух хостах) Session-Sender. Хост, подтверждающий соединение TCP принимает роли Server и (при работе на двух хостах) Session-Reflector.

Control-Client может установить желаемый код Diffserv (DSCP) в поле заголовка IP для всех пакетов в текущем управляющем соединении. Серверу следует использовать значение DSCP из пакета TCP SYN от Control-Client во всех последующих пакетах данного соединения (избегая двусмысленности в случае перемаркировки).

Существует возможность отказа Control-Client после организации соединения TWAMP-Control или на пути между Control-Client и Server может возникнуть сбой при работе соединения. Сервер может прервать любое организованное управляющее соединение при отсутствии связанных с ним принятых пакетов в течение SERVWAIT секунд. Серверу нужно приостановить мониторинг управляющего соединения после получения команды Start-Sessions и нужно возобновить его после получения команды Stop-Sessions (если поддерживается опция SERVWAIT). Отметим, что тайм-аут REFWAIT (описан ниже) охватывает отказы в тестовых сессиях и при завершении REFWAIT во всех сеансах тестирования, инициированных соединением TWAMP-Control, мониторинг SERVWAIT нужно восстановить (как по команде Stop-Sessions). Реализации, поддерживающей тайм-аут SERVWAIT, следует также реализовать тайм-аут REFWAIT. В качестве принятого по умолчанию значения SERVWAIT нужно установить 900 секунд и это время может быть настраиваемым. Этот тайм-аут позволяет серверу освободить ресурсы в случае отказа.

Клиент и сервер используют одно отображение KeyID на общие секреты. Сервер, готовящийся к сессиям с несколькими клиентами, использует KeyID для выбора подходящего секрета, а клиент обычно имеет разные секретные ключи для разных серверов. Общий секрет является парольной фразой (passphrase). Для максимальной совместимости парольных фраз символы в них должны кодироваться в соответствии с Приложением B из [RFC5198] (ASCII Network Virtual Terminal Definition). В них должны отсутствовать символы новой строки (любая комбинация CR и/или LF) и следует избегать символов управления.

3.2. Защита целостности

Защита целостности TWAMP использует процедуру, определенную в параграфе 3.2 спецификации OWAMP [RFC4656]. Как и в OWAMP, каждый код HMAC (Hashed Message Authentication Code) учитывает все, передаваемое в данном направлении между предыдущим HMAC (не включая его) и началом нового HMAC. Таким образом, после организации шифрования каждый бит соединения TWAMP-Control аутентифицируется HMAC ровно 1 раз.

Отметим, что сообщение Server-Start (сервер передает его в начальном обмене управляющего соединения) не завершается полем HMAC. Поэтому HMAC в первом сообщении Accept-Session учитывает также сообщение Server-Start и включает поле Start-Time в расчет HMAC.

В режиме с аутентификацией и шифрованием HMAC в пакетах TWAMP-Control шифруется.

3.3. Значения поля Accept

Значения Accept в TWAMP используются в соответствии с параграфом 3.3 спецификации OWAMP [RFC4656].

3.4. Команды TWAMP-Control

Команды TWAMP-Control соответствуют правилам параграфа 3.4 в спецификации OWAMP [RFC4656]. Для Control-Client доступны команды Request-TW-Session, Start-Sessions, Stop-Sessions. Сервер может передавать конкретные сообщения в ответ на полученные команды (описаны ниже).

Команда OWAMP Request-Session заменена TWAMP Request-TW-Session, а команды Fetch-Session нет в TWAMP.

3.5. Организация тестовых сессий

Создание тестовой сессии следует процедуре параграфа 3.5 в спецификации OWAMP [RFC4656]. Команда Request-TW-Session основана на команде OWAMP Request-Session и использует формат, описанный в параграфе 3.5 спецификации OWAMP, но без полей Schedule Slot Descriptions и использует лишь один код HMAC. Описание формата Request-TW-Session приведено ниже.

В TWAMP первый октет называется номером команды и Command Number является признанным механизмом расширения. Читателям рекомендуется обратиться к реестру TWAMP-Control Command Number при возникновении потребности в дополнительных значениях.

Command Number = 5 указывает команду Request-TW-Session и сервер должен интерпретировать ее как запрос двухсторонней тестовой сессии с использованием протокола TWAMP-Test.

Если сервер TWAMP получает неожиданное значение Command Number, он должен ответить сообщением Accept-Session с полем Accept = 3 (некоторые аспекты запроса не поддерживаются). Неожиданными являются запрещенные (Forbidden) номера команд и возможно некоторые из числа резервных (Reserved).

В OWAMP для поля Conf-Sender устанавливается значение 1, когда сообщение Request-Session описывает задачу, где сервер будет настраивать отправителя односторонних тестовых пакетов. Аналогичным образом устанавливается Conf-Receiver = 1, когда сообщение описывает конфигурацию Session-Receiver. В TWAMP обе стороны передают и принимают пакеты, причем Session-Sender сначала передает, затем принимает тестовые пакеты, а Session-Reflector сначала принимает, потом передает.

В полях Conf-Sender и Conf-Receiver должно быть указано значение 0, поскольку Session-Reflector будет принимать и передавать пакеты, а роли устанавливаются в соответствии с тем, какой из хостов инициирует соединение TCP для управления. Сервер должен интерпретировать ненулевое значение как команду с некорректным форматом и должен отвечать сообщением Accept-Session с полем Accept = 3 (некоторые аспекты запроса не поддерживаются).

Session-Reflector в TWAMP не обрабатывает входящие тестовые пакеты для определения параметров производительности, поэтому ему не нужно знать номера пакетов или тактирование их передачи. Поэтому поля Number of Scheduled Slots и Number of Packets должны устанавливаться в 0.

Sender Port указывает порт UDP, из которого будет переданы пакеты TWAMP-Test и в который Session-Reflector будет отправлять пакеты TWAMP-Test (Session-Sender использует один порт UDP для передачи и приема). Receiver Port указывает желаемый порт UDP, в который Session-Sender будет направлять пакеты TWAMP-Test (порт, запрошенный у Session-Reflector для приема пакетов). Receiver Port также является портом UDP, из которого Session-Reflector будет передавать пакеты TWAMP-Test (Session-Reflector использует один порт UDP для передачи и приема).

Поля Sender Address и Receiver Address содержат адреса отправителя и получателя в конечных точках пути Internet, через который запрошена сессия TWAMP-Test. В них можно указать 0 и в таком случае для тестовых пакетов должны использоваться адреса IP из обмена сообщениями TWAMP-Control между Control-Client и Server.

Идентификатор сессии (Session Identifier или SID) соответствует определению в OWAMP [RFC4656]. Поскольку SID всегда генерируется принимающей стороной, сервер определяет SID и поле SID в сообщении Request-TW-Session должно иметь значение 0.

Поле Start Time соответствует определению в OWAMP [RFC4656].

Поле Timeout интерпретируется не так как в OWAMP [RFC4656]. В TWAMP это поле указывает интервал, в течение которого Session-Reflector должен ждать перед отправкой сообщения Stop-Sessions. Когда тестовые пакеты продолжают поступать, Session-Reflector должен отражать их, если пакеты поступают в интервале Timeout с момента получения Stop-Sessions. Рефлектору недопустимо отражать пакеты по достижении тайм-аута.

Дескриптор Type-P соответствует определению в OWAMP [RFC4656]. Единственным назначением этого поля является установка кода дифференцированного обслуживания (DSCP) [RFC2474]. Это же значение DSCP должно указываться в отраженных пакетах от Session-Reflector.

Поскольку в протоколе не применяются Schedule Slot Description, сообщение Request-TW-Session завершается полями MBZ (0) и HMAC. Это завершает логическое сообщение, называемое командой Request-TW-Session.

Рефлектор должен отвечать на каждую команду Request-TW-Session сообщением Accept-Session, как указано в спецификации OWAMP [RFC4656]. При Accept = 0 поле Port подтверждает (повторяет) номер порта, в который Session-Sender передает пакеты TWAMP-Test для Session-Reflector. Иными словами, поле Port указывает номер порта, на котором ожидается прием рефлектором пакетов от Session-Sender.

Когда запрошенный Receiver Port недоступен (например, уже занят),

Server на стороне Session-Reflector может предложить для этой сессии доступный порт в поле Port. Control-Client воспринимает этот порт и создаёт сообщение Session-Request с подходящими параметрами или не принимает его и использует поле Accept для информирования Control-Client об отказе или ошибке (в этом случае серверу недопустимо2 предлагать другой порт и поле Port должно иметь значение 0).

3.6. Планирование передачи

Планирование передачи тестовых пакетов, заданное в параграфе 3.6 спецификации OWAMP [RFC4656], не применяется в TWAMP. Control-Client и Session-Sender могут самостоятельно планировать передачу. Рефлектору следует возвращать каждый тестовый пакет его Session-Sender как можно скорее.

3.7. Запуск сеанса тестирования

Процедуры и рекомендации для запуска тестовых сессий соответствуют параграфу 3.7 в OWAMP [RFC4656].

3.8. Команда Stop-Sessions

Процедуры и рекомендации для остановки сеансов тестирования отличаются от заданных в параграфе 3.8 спецификации OWAMP [RFC4656]. Команду Stop-Sessions может подавать лишь Control-Client. В сообщение недопустимо включать какие-либо описания сессии или диапазоны пропуска. Сообщение завершается одним блоком HMAC (завершение команды Stop-Sessions). Команда TWAMP Stop-Sessions не включает SID и применяется ко всем сессиям запрошенным и созданным командами Start-Sessions. Формат Stop-Sessions показан на рисунке.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      3        |    Accept     |              MBZ              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Number of Sessions                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        MBZ (8 октетов)                        |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                       HMAC (16 октетов)                       |
|                                                               |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Command Number = 3 в первом октете указывает команду Stop-Sessions.

Ненулевое значение Accept указывает причину отказа, а 0 говорит о нормальном (возможно преждевременном) выполнении. Список возможных значений Accept приведен в параграфе 3.3 [RFC4656]. Если поле Accept отлично от 0, все сессии TWAMP-Test, созданные этим сеансом TWAMP-Control, следует считать недействительными. Если сообщение Accept-Session не было передано (по любой причине, включая сбой соединения TCP для TWAMP-Control), результаты всех сессий TWAMP-Test, созданных этой сессией TWAMP-Control можно считать недействительными.

Number of Sessions указывает число сессий, которые Control-Client должен остановить. Это поле должно указывать число сеансов передачи, запущенных Control-Client и не прерванных ранее командой Stop-Sessions (т. е. Control-Client должен учитывать каждое воспринятое сообщение Request-Session). Если сообщение Stop-Sessions не указывает точного числа действующих сессий, оно будет считаться недействительным, а соединение TWAMP-Control следует закрывать, считая все полученные результаты недействительными.

После получения команды TWAMP-Control Stop-Sessions рефлектор должен отбрасывать все пакеты TWAMP-Test, принятые по истечении интервала Timeout (из команды Request-TW-Session) с момента получения команды.

3.9. Команда Fetch-Session

Одной из целей TWAMP является двухстороннее измерение. Методы такого измерения не требуют сборки рефлектором данных на уровне пакетов (таких как порядковые номера, временные мети, TTL), поскольку они передаются в «отраженных» тестовых пакетах. Поэтому протокол не требует от сервера извлечения данных из пакетов и команда OWAMP Fetch-Session не применяется в TWAMP.

4. Протокол TWAMP-Test

Протокол TWAMP-Test похож на OWAMP-test [RFC4656] за исключением того, что рефлектор передает тестовые пакеты отправителю в ответ на каждый пакет от Session-Sender. TWAMP определяет 2 формата пакетов, один из которых передает Session-Sender, другой — Session-Reflector. Как и в OWAMP-test [RFC4656], применяется 3 режима: без аутентификации, с аутентификацией, с шифрованием.

4.1. Поведение отправителя

Поведение отправителя определяется конфигурацией Session-Sender и не задается этим стандартом. Кроме того, рефлектору не нужно знать поведение Session-Sender так детально, как требуется в OWAMP [RFC4656]. Session-Sender собирает и записывает всю требуемую для двухсторонних измерений информацию, получая ее из пакетов от Session-Reflector. Записываемая информация зависит от реализации.

4.1.1. Тактирование пакетов

Поскольку информация о планировании пакетов не передается рефлектору, не возникает необходимости в стандартизованном тактировании пакетов. Независимо от задержек планирования, каждый переданный пакет должен включать в свою временную метку как можно более точное значение реального времени отправки.

4.1.2. Формат и содержимое пакетов

Формат и содержимое пакетов Session-Sender следуют процедурам и рекомендациям параграфа 4.1.2 с спецификации OWAMP [RFC4656] (за исключением планирования передачи).

Отметим, что тестовые пакеты от рефлектора по размеру превышают пакеты от Sender. Session-Sender может добавлять в конец пакета заполнение (Packet Padding) для выравнивания размера данных в пакетах IP (payload) для обоих направления (обычно это желательно). Для компенсации большего размера тестовых пакетов от рефлектора Sender добавляет по меньшей мере 27 октетов заполнения в режиме без аутентификации и 64 октета в режимах с аутентификацией и шифрованием.

4.2. Поведение рефлектора

TWAMP требует от Session-Reflector передачи пакета отправителю в ответ на каждый пакет от Session-Sender.

Ниже указаны действия Session-Reflector при получении пакета.

  • Для пакета создается временная метка. Каждый принятый пакет должен иметь как можно более точное время реального прибытия в его Received Timestamp (в пакете).

  • В режимах с аутентификацией и шифрованием расшифровываются соответствующие части тела пакета (первый блок из 16 октетов октетов для режима с аутентификацией и 96 для режима с шифрованием), затем проверяется целостность разделов, учитываемых в HMAC.

  • Копируется порядковый номер пакета в соответствующий отраженный пакет для Session-Sender.

  • Извлекается значение Sender TTL из поля TTL/Hop Limit в принятом пакете. Реализациям Session-Reflector следует брать TTL/Hop Limit из заголовка IP, заменяя им значение 255, установленное Session-Sender. Если реализация не извлекает реальное значение TTL (единственной разумной причиной является невозможность доступа в полю TTL в принятых пакетах), она должна установить Sender TTL = 255.

  • В режимах с аутентификацией и шифрованием сначала должно рассчитываться значение HMAC, затем нужные части тела пакета шифруются.

  • Тестовый пакет передается Session-Sender в ответ на каждый принятый пакет. Отклик должен создаваться незамедлительно. Формат и содержимое пакета заданы в параграфе 4.2.1. Перед отправкой тестового пакета рефлектор должен указать максимально точно время реальной отправки в поле Timestamp (в пакете). Это позволяет определить время между приемом и передачей пакета.

  • Пакеты, не принятые в интервале Timeout (после команды Stop-Sessions), рефлектор должен игнорировать. Рефлектору недопустимо генерировать тестовые пакеты для игнорируемых пакетов от Session-Sender.

Существует вероятность отказа Session-Sender или сбоя на пути между Session-Sender и Session-Reflector во время сессии. Рефлектор может прекратить любую начатую сессию, если в течение REFWAIT секунд не было получено связанных с ней пакетов. По умолчанию для REFWAIT нужно устанавливать значение 900 секунд и это значение можно делать настраиваемым. Этот тайм-аут позволяет рефлектору освободить ресурсы при возникновении отказа.

4.2.1. Формат и содержимое пакетов TWAMP-Test

Session-Reflector должен передавать свой пакет в ответ на каждый принятый от Session-Sender пакет. Рефлектору следует передавать пакеты как можно скорее. Рефлектору следует устанавливать в поле TTL для IPv4 (или Hop Limit для IPv6) пакета UDP значение 255.

Тестовые пакеты включают информацию, требуемую для расчета двухсторонних параметров на стороне Session-Sender. Формат тестовых пакетов зависит от режима. На рисунке показан формат пакетов в режиме без аутентификации.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Timestamp                            |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Error Estimate        |           MBZ                 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Receive Timestamp                    |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sender Sequence Number                 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Sender Timestamp                         |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      Sender Error Estimate    |           MBZ                 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Sender TTL   |                                               |
+-+-+-+-+-+-+-+-+                                               +
|                                                               |
.                         Packet Padding                        .
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

На следующем рисунке приведен формат пакетов в режимах с аутентификацией и шифрованием.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        MBZ (12 октетов)                       |
|                                                               |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Timestamp                            |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Error Estimate        |                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
|                        MBZ (6 октетов)                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Receive Timestamp                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        MBZ (8 октетов)                        |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sender Sequence Number                 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        MBZ (12 октетов)                       |
|                                                               |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Sender Timestamp                         |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      Sender Error Estimate    |                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
|                        MBZ (6 октетов)                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Sender TTL   |                                               |
+-+-+-+-+-+-+-+-+                                               +
|                                                               |
|                                                               |
|                        MBZ (15 октетов)                       |
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|                        HMAC (16 октетов)                      |
|                                                               |
|                                                               |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|
|                                                               |
.                         Packet Padding                        .
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Отметим, что временные метки имеют такой же формат как в OWAMP [RFC4656], показанный на рисунке.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Целые секунды                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Доли секунды                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Sequence Number указывает номер тестового пакета в соответствии с порядком передачи в сессии TWAMP. Номера начинаются с 0 и значение инкрементируется при отправке каждого пакета в этой сессии3. Номера, создаваемые рефлектором, не зависят от номеров в прибывающих пакетах.

Поля Timestamp и Error Estimate содержат временную метку передачи и оценку ошибок на стороне Session-Reflector для отраженных пакетов. Формат полей соответствует определению OWAMP, параграф 4.1.2 в [RFC4656].

Sender Timestamp и Sender Error Estimate являются точными копиями одноименных полей из тестового пакета от Session-Sender, соответствующего данному пакету.

Sender TTL имеет значение 255 при передаче от Session-Sender. В этом поле Session-Reflector устанавливает значение TTL (Hop Count) из заголовка IP полученного пакета.

Receive Timestamp указывает время приема тестового пакета рефлектором. Разница между Timestamp и Receive Timestamp составляет время пребывания пакета в Session-Reflector. Значение Error Estimate, связанное с полем Timestamp, применяется и к Receive Timestamp.

Sender Sequence Number содержит копию поля Sequence Number из пакета, переданного Session-Sender, который вызвал генерацию и отправку рефлектором данного пакета.

Поле HMAC в пакетах TWAMP-Test учитывает те же поля, что и шифрование AES (Advanced Encryption Standard). Таким образом, в режиме с аутентификацией HMAC охватывает первый блок (16 октетов), а в режиме с шифрованием — первые 6 блоков (96 октетов). В пакетах TWAMP-Test недопустимо шифровать поле HMAC.

В поле заполнения (Packet Padding) пакетов TWAMP-Test следует помещать псевдослучайные значения (они должны генерироваться независимо от других псевдослучайных чисел, упоминаемых в этом документе). Однако реализация должна обеспечивать параметр конфигурации, опцию или иной способ выбора для поля Packet Padding заполнения нулями. Поле Packet Padding недопустимо учитывать в HMAC и недопустимо шифровать.

Минимальный размер сегмента данных в пакетах TWAMP-Test составляет 41 октет в режиме без аутентификации и 1124 октетов в режимах с аутентификацией и шифрованием.

Отметим, что тестовые пакеты от Session-Reflector превышают по размеру пакеты от Session-Sender. Рефлектору следует снижать размер поля заполнения Packet Padding для выравнивания размера пакетов IP в обоих направлениях при наличии достаточного объема заполнения. Session-Reflector может повторно использовать содержимое Packet Padding (те же требования к заполнению) и в этом случае рефлектору следует просто отсечь ненужное заполнение.

В режиме без аутентификации недопустимо применять аутентификацию и шифрование.

Схемы пакетов TWAMP-Test в режимах с аутентификацией и шифрованием идентичны. Операция шифрования для пакетов Session-Sender следует правилам из параграфа 4.1.2 спецификации OWAMP [RFC4656].

Основное различие между режимами с аутентификацией и шифрованием заключается в охватываемых HMAC и шифрованием частях пакета. Режим с аутентификацией позволяет получать временную метку после шифрования части пакета, а в режиме с шифрованием порядковые номера и временные метки извлекаются перед шифрованием для обеспечения максимальной защиты целостности данных.

В режиме с аутентификацией шифруется лишь порядковый номер в первом блоке, а последующие временные метки и номера передаются в открытом виде. Передача временных меток без шифрования позволяет сократить время между получением рефлектором временной метки и отправкой пакета. Это может повышать точность временных меток, поскольку шифрование можно выполнить до получения метки.

В режиме с шифрованием рефлектор должен извлечь временные метки, рассчитать HMAC и зашифровать пакет до его отправки.

Получение ключей и методы шифрования следуют таким же процедурам OWAMP, как описано ниже. Каждая сессия TWAMP-Test имеет 2 сеансовых ключа — AES и HMAC, которые выводятся из ключей TWAMP-Control и SID.

TWAMP-Test AES Session-key получается путем шифрования ключа TWAMP-Control AES Session-key (тот же AES Session-key, что и для соответствующей сессии TWAMP-Control) с 16-октетным (SID) в качестве ключа с помощью одного блока AES-ECB. Полученный в результате TWAMP-Test AES Session-key служит для шифрования и расшифровки пакетов в конкретной сессии TWAMP-Test. Отметим, что TWAMP-Test AES Session-key, TWAMP-Control AES Session-key и SID имеют размер 16 октетов.

TWAMP-Test HMAC Session-key получается путем шифрования TWAMP-Control HMAC Session-key (тот же HMAC Session-key, что применяется в сессии TWAMP-Control) с использованием AES-CBC (Cipher Block Chaining) с 16-октетным SID в качестве ключа. Это 2-блочное шифрование CBC, всегда выполняемое с IV=0. Отметим, что TWAMP-Test HMAC Session-key и TWAMP-Control HMAC Session-key имеют размер 32 октета, а SID — 16 октетов.

В режиме с аутентификацией первый блок (16 октетов) каждого пакета TWAMP-Test шифруется в режиме AES ECB (Electronic Codebook). Этот режим не использует цепочек, а потеря, дублирование и нарушение порядка пакетов не создает проблем при расшифровке в сессии TWAMP-Test.

В режиме с шифрованием первые 6 блоков (96 октетов) шифруются в режиме AES-CBC. Сеансовый ключ AES получается так же как в режиме с аутентификацией. Каждый пакет TWAMP-Test шифруется как отдельный поток без включения в цепочку нескольких пакетов, что позволяет предотвратить проблемы с расшифровкой при потере, дублировании или нарушении порядка пакетов. Вектор инициализации для шифрования CBC содержит значение 0.

Следует отметить, что планирование ключей в каждой сессии TWAMP-Test должно выполняться один раз в течение сессии, а не для каждого пакета.

5. Рекомендации для разработчиков

В этом разделе приведены рекомендации для разработчиков TWAMP. Представленный пример не является требованием. Подобно OWAMP [RFC4656], протокол TWAMP обеспечивает достаточную гибкость для поддержки разной архитектуры и системных требований.

В примере роли Control-Client и Session-Sender реализованы на одном хосте, названном контроллером, а роли Server и Session-Reflector — на другом хосте, названном ответчиком.

    Контроллер                              Ответчик
+-----------------+                   +-------------------+
| Control-Client  |<--TWAMP-Control-->| Server            |
|                 |                   |                   |
| Session-Sender  |<--TWAMP-Test----->| Session-Reflector |
+-----------------+                   +-------------------+

Пример представляет архитектуру, полностью поддерживающую стандарт TWAMP. Контроллер организует сеанс тестирования по протоколу TWAMP-Control. После организации сессии контроллер передает ответчику тестовые пакеты, а ответчик работает в соответствии с поведением Session-Reflector, описанным в параграфе 4.2.

В Приложении I с информационными целями представлен другой пример, предлагающий постепенное внедрение TWAMP путем реализации сначала протокола TWAMP-Test.

6. Вопросы безопасности

По сути в TWAMP и OWAMP используется один протокол для организации управления и тестирования. Основное различие между TWAMP и OWAMP заключается в поведении Session-Reflector для TWAMP и Session-Receiver для OWAMP. Это различие не создает известных уязвимостей, которые уже не решены защитными средствами OWAMP. Все рассмотрение вопросов безопасности OWAMP [RFC4656] применимо к протоколу TWAMP.

Сообщение Server-Greeting (параграф 3.1 в [RFC4656]) включает поле Count для задания счетчика итераций, используемого в PKCS #5 при создании ключей из общих секретов. OWAMP рекомендует нижний предел в 1024 итерации, но не задает верхний предел. Поле Count создает уязвимость к DoS-атакам5, поскольку имеет размер 32 бита. Если атакующий установит для Count максимальное значение 232, атакованная система «остановится» на продолжительное время для генерации ключей. Поэтому совместимым с TWAMP системам следует включать конфигурационное ограничение для поля Count. По умолчанию следует устанавливать максимальное значение 32768. Как предлагается в OWAMP, это значение можно будет увеличить по мере роста вычислительной мощности. Если Control-Client получит сообщение Server-Greeting с Count больше максимального значения, ему следует закрыть управляющее соединение.

7. Благодарности

Спасибо Nagarjuna Venna, Sharee McNab, Nick Kinraid, Stanislav Shalunov, Matt Zekauskas, Walt Steverson, Jeff Boote, Murtaza Chiba и Kevin Earnst за их комментарии, предложения, рецензии, полезное обсуждение и вычитывание документа. Lars Eggert, Sam Hartman и Tim Polk предоставили полезные обзоры на уровне AD и авторы признательны им за вклад в документ.

8. Взаимодействие с IANA

Агентство IANA выделило номер порта TCP 861 для протокола OWAMP-Control в составе OWAMP [RFC4656].

   ...
   owamp-control   861/tcp    OWAMP-Control
   owamp-control   861/udp    OWAMP-Control
   #                          [RFC4656]

В IANA также выделены порты TCP и UDP для протокола TWAMP-Control.

   ...
   twamp-control   862/tcp    Two-way Active Measurement Protocol
                              (TWAMP) Control
   twamp-control   862/udp    Two-way Active Measurement Protocol
                              (TWAMP) Control
   #                          [RFC5357]

Поскольку в TWAMP добавлена дополнительная команда управления, отсутствующая в спецификации OWAMP-Control, и описано поведение при использовании этой команды, в IANA создан реестр значений TWAMP Command Number. Поле не названо явно в [RFC4656], но используется для каждой команды. Это поле признано механизмом расширения для TWAMP.

8.1. Спецификация реестра

Агентство IANA создало реестр TWAMP-Control Command Number. Команды TWAMP-Control указываются первым октетом в сообщении OWAMP-Control, как показано в параграфе 3.5 [RFC4656] и обновлено в данном документе. В результате реестр может включать 256 различных значений.

8.2. Управление реестром

Поскольку реестр может включать лишь 16 значений, а OWAMP и TWAMP являются протоколами IETF, реестр должен обновляться лишь по процедуре IETF Consensus, описанной в [RFC5226], с выпуском RFC, документирующего использованием значения и одобренного IESG. Предполагается, что новые значения будут выделяться по возрастанию из диапазона [0-255], если не будет предложено иного разумного решения.

8.3. Экспериментальные значения

[RFC3692] рекомендует выделять некоторое количество значений для экспериментов и тестирования. Авторам неясно, сколько значений можно с пользой выделить для этих целей или разумно просто предоставить для экспериментов «верхний» край диапазона. Могут быть полезны 2 значения — одно для управления, другое для тестовой сессии. С другой стороны, один номер можно расширять неограниченно, используя для этого формат остальной части сообщения, а другие номера выделять по мере осознания их полезности. Поэтому в документе для экспериментов и тестирования выделен один номер (6).

8.4. Начальное содержимое реестра

Реестр TWAMP-Control Command Number.

Значение

Описание

Определение семантики

0

Резерв

1

Forbidden

2

Start-Sessions

RFC 4656, параграф 3.7

3

Stop-Sessions

RFC 4656, параграф 3.8

4

Резерв

5

Request-TW-Session

Данный документ, параграф 3.5

6

Experimentation

Не определено, см. параграф 8.3.

9. Использование других языков

Протокол не передает какой-либо информации на естественных языках, за исключением разве что KeyID в TWAMP-Control, где применяется кодировка UTF-8 [RFC3629, RFC5198].

Приложение I — TWAMP Light (информационное)

В этом примере роли Control-Client, Server и Session-Sender реализованы на одном хосте (контроллер), а роль Session-Reflector — на другом (ответчик).

    Контроллер                              Ответчик
+-----------------+                   +-------------------+
|     Server      |                   |                   |
| Control-Client  |                   | Session-Reflector |
| Session-Sender  |<--TWAMP-Test----->|                   |
+-----------------+                   +-------------------+


Пример представляет простую архитектуру для ответчиков, где их роль заключается лишь в создании тестовых точек в сети. Контроллер организует тестовую сессию с сервером нестандартным путем. После организации сессии контроллер передает тестовые пакеты ответчику, а тот следует поведению Session-Reflector, описанному в параграфе 4.2, с указанными ниже исключениями.

В случае TWAMP Light рефлектор не обязательно знает состояние сессии. Если это состояние неизвестно, Session-Reflector должен копировать Sequence Number из принятого пакета в одноименное поле отраженного пакета. Контроллер получает отраженные пакеты и собирает результаты двухсторонних измерений.

Пример исключает необходимость протокола TWAMP-Control и предполагает, что Session-Reflector настраивается и сообщает свою конфигурацию серверу нестандартным путем. Session-Reflector просто отражает входящие пакеты контроллеру, копируя нужную информацию и генерируя порядковые номера и временные метки в соответствии с параграфом 4.2.1. TWAMP Light порождает некоторые дополнительные вопросы безопасности. Нестандартным путям управления ответчиком и организации тестовых сессий следует поддерживать указанные ниже свойства.

Протоколу управления ответчиком следует поддерживать режим работы с аутентификацией. Ответчику следует поддерживать настройку на восприятие лишь сеансов управления с аутентификацией.

Протоколу управления ответчиком следует поддерживать способы активации режимов с аутентификацией и шифрованием для протокола TWAMP-Test.

При работе тестовой сессии TWAMP Light в режиме с аутентификацией и шифрованием Session-Reflector должен поддерживать тот или иной механизм генерации ключей (поскольку обычно применяемый для этого протокол TWAMP-Control здесь отсутствует). Спецификация механизма генерации ключей выходит за рамки документа.

Нормативные документы

[RFC4656] Shalunov, S., Teitelbaum, B., Karp, A., Boote, J., and M. Zekauskas, «A One-way Active Measurement Protocol (OWAMP)», RFC 4656, September 2006.

[RFC2681] Almes, G., Kalidindi, S., and M. Zekauskas, «A Round-trip Delay Metric for IPPM», RFC 2681, September 1999.

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, March 1997.

[RFC2474] Nichols, K., Blake, S., Baker, F., and D. Black, «Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers», RFC 2474, December 1998.

[RFC5226] Narten, T. and H. Alvestrand, «Guidelines for Writing an IANA Considerations Section in RFCs», BCP 26, RFC 5226, May 2008.

[RFC3629] Yergeau, F., «UTF-8, a transformation format of ISO 10646», STD 63, RFC 3629, November 2003.

[RFC5198] Klensin, J. and M. Padlipsky, «Unicode Format for Network Interchange», RFC 5198, March 2008.

Дополнительная литература

[RFC3692] Narten, T., «Assigning Experimental and Testing Numbers Considered Useful», BCP 82, RFC 3692, January 2004.

Адреса авторов

Kaynam Hedayat

Brix Networks

285 Mill Road

Chelmsford, MA 01824

USA

EMail: khedayat@brixnet.com

URI: http://www.brixnet.com/

Roman M. Krzanowski, Ph.D.

Verizon

500 Westchester Ave.

White Plains, NY

USA

EMail: roman.krzanowski@verizon.com

URI: http://www.verizon.com/

Al Morton

AT&T Labs

Room D3 — 3C06

200 Laurel Ave. South

Middletown, NJ 07748

USA

Phone +1 732 420 1571

EMail: acmorton@att.com

URI: http://home.comcast.net/~acmacm/

Kiho Yum

Juniper Networks

1194 Mathilda Ave.

Sunnyvale, CA

USA

EMail: kyum@juniper.net

URI: http://www.juniper.com/

Jozef Z. Babiarz

Nortel Networks

3500 Carling Avenue

Ottawa, Ont K2H 8E9

Canada

Email: babiarz@nortel.com

URI: http://www.nortel.com/


Полное заявление авторских прав

Copyright (C) The IETF Trust (2008).

К этому документу применимы права, лицензии и ограничения, указанные в BCP 78, и, за исключением указанного там, авторы сохраняют свои права.

Этот документ и содержащаяся в нем информация представлены «как есть» и автор, организация, которую он/она представляет или которая выступает спонсором (если таковой имеется), Internet Society и IETF отказываются от каких-либо гарантий (явных или подразумеваемых), включая (но не ограничиваясь) любые гарантии того, что использование представленной здесь информации не будет нарушать чьих-либо прав, и любые предполагаемые гарантии коммерческого использования или применимости для тех или иных задач.

Интеллектуальная собственность

IETF не принимает какой-либо позиции в отношении действительности или объема каких-либо прав интеллектуальной собственности (Intellectual Property Rights или IPR) или иных прав, которые, как может быть заявлено, относятся к реализации или использованию описанной в этом документе технологии, или степени, в которой любая лицензия, по которой права могут или не могут быть доступны, не заявляется также применение каких-либо усилий для определения таких прав. Сведения о процедурах IETF в отношении прав в документах RFC можно найти в BCP 78 и BCP 79.

Копии раскрытия IPR, предоставленные секретариату IETF, и любые гарантии доступности лицензий, а также результаты попыток получить общую лицензию или право на использование таких прав собственности разработчиками или пользователями этой спецификации, можно получить из сетевого репозитория IETF IPR по ссылке http://www.ietf.org/ipr.

IETF предлагает любой заинтересованной стороне обратить внимание на авторские права, патенты или использование патентов, а также иные права собственности, которые могут потребоваться для реализации этого стандарта. Информацию следует направлять в IETF по адресу ietf-ipr@ietf.org.

 

Перевод на русский язык

Николай Малых

nmalykh@protokols.ru


1Internet Engineering Task Force.

2В исходном документе это предложение содержит ошибку. См. https://www.rfc-editor.org/errata/eid1587. Прим. перев.

3В оригинале это предложение содержит неточности. См. https://www.rfc-editor.org/errata/eid1590. Прим. перев.

4В оригинале ошибочно указано 104. См. https://www.rfc-editor.org/errata/eid5045. Прим. перев.

5Denial-of-service — отказ в обслуживании.

Рубрика: RFC, Измерения и тестирование | Комментарии к записи RFC 5357 A Two-Way Active Measurement Protocol (TWAMP) отключены

RFC 5322 Internet Message Format

Network Working Group                                P. Resnick, Ed.
Request for Comments: 5322                     Qualcomm Incorporated
Obsoletes: 2822                                         October 2008
Updates: 4021
Category: Standards Track

Формат сообщений Internet

Internet Message Format

PDF

Статус документа

Это документ содержит проект стандарта протокола Internet для сообщества Internet и служит приглашением к дискуссии в целях развития и совершенствования протокола. Текущее состояние стандартизации и статус протокола можно узнать из текущей версии документа Internet Official Protocol Standards (STD 1). Допускается свободное распространение документа.

Аннотация

Этот документ задает формат сообщений Internet (IMF1) — синтаксис текстовых сообщений, передаваемых между пользователями компьютеров через систему электронной почты. Данная спецификация является пересмотром RFC 2822, который, в свою очередь, пересматривает RFC 822, Standard for the Format of ARPA Internet Text Messages2, с учетом опыта использования и накопленных изменений, отраженных в других RFC.

1. Введение

1.1. Рамки документа

Этот документ задает формат сообщений Internet (IMF) — синтаксис текстовых сообщений, передаваемых между пользователями компьютеров через систему электронной почты. Данная спецификация является пересмотром RFC 2822 [RFC2822], который, в свою очередь, пересматривает RFC 822, Standard for the Format of ARPA Internet Text Messages [RFC0822], с учетом опыта использования и накопленных изменений, отраженных в других RFC (таких, как [RFC1123]).

В этом документе задан синтаксис только для текстовых сообщений. В частности, не рассматриваются вопросы передачи изображений, звука и иной структурированной информации в сообщениях электронной почты. Опубликовано несколько расширений (таких, как серия документов MIME — RFC2045], [RFC2046], [RFC2049]), описывающих механизмы передачи таких данных в сообщениях электронной почты за счет расширения описанного здесь синтаксиса или за счет структурирования сообщений в соответствии с описанным синтаксисом. Такие механизмы выходят за пределы настоящей спецификации.

В контексте электронной почты сообщения представляются состоящими из конверта и тела (содержимого) письма. Конверт содержит информацию, требуемую для передачи и доставки сообщения (см. [RFC5321]). Тело письма является объектом, который доставляется адресату. Данная спецификация применима только к формату и части семантики содержимого писем. Документ не включает спецификации данных, включаемых в конверт сообщения.

Однако некоторые системы обработки сообщений могут использовать информацию из тела письма для создания конверта. Одной из задач настоящей спецификации является упрощение извлечения такой информации программными средствами.

Назначением этой спецификации является задание формата содержимого писем, передаваемых между системами. Хотя некоторые системы локально хранят сообщения в описанном здесь формате (это избавляет от необходимости преобразования форматов), а другие используют свои форматы хранения, вопросы локального хранения сообщений выходят за пределы данной спецификации.

Примечание. В задачи этой спецификации не входит задание внутренних форматов, используемых сайтами, конкретных характеристик систем обработки сообщений или пользовательского интерфейса программ для создания и просмотра сообщений. Кроме того, данный документ не задает кодирования символов для транспортировки или хранения почты и не задает число и битов в представлении символов и способы передачи или хранения этих битов.

1.2. Система обозначений

1.2.1. Обозначение уровня требований

В этом документе используются термины, выделенные полужирным шрифтом. Ключевые слова необходимо (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не нужно (SHALL NOT), следует (SHOULD), не следует (SHOULD NOT), рекомендуется (RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе используются для обозначения уровня требований и интерпретируются в соответствии с [RFC2119].

1.2.2. Синтаксические обозначения

В этой спецификации используется нотация ABNF3 [RFC5234] для формального определения синтаксиса сообщений. Символы задаются десятичным кодом (например, значение %d65 представляет латинский символ A, %d97 — a) или регистронезависимыми литералами, заключенными в кавычки (например, «A» для представления A или a).

1.2.3. Структура документа

Документ делится на несколько частей.

В первом разделе содержится вводная часть документа.

В разделе 2 приведено общее описание сообщения и его компонент. Этот обзор поможет понять некоторые общие принципы, используемые в оставшейся части документа. Приведенные в этом разделе примеры недопустимо трактовать, как формальный синтаксис каких-либо компонент сообщения.

В разделе 3 даны формальные правила ABNF для структуры каждой части сообщения (синтаксис) и описаны связи между этими частями, а также их трактовка в контексте сообщения (семантика). Т. е., в этом разделе дается структурная схема каждой части сообщения (синтаксис), а также описание компонент и инструкции по их интерпретации (семантика). Раздел включает анализ семантики и синтаксиса субкомпонент сообщения, имеющих свою структуру. Рассмотренный в разделе 3 синтаксис представляет сообщения в том виде, в котором они должны создаваться. В этом разделе также указано, какие опции синтаксиса следует использовать.

Разделы 2 и 3 описывают сообщения, соответствующие данной спецификации.

В разделе 4 рассматривается «устаревший» синтаксис, на элементы которого приведены ссылки в разделе 3. Правила устаревшего синтаксиса являются элементами, которые были включены в ранние версии этой спецификации или широко использовались в почте Internet. Поэтому такие элементы должны интерпретироваться средствами разбора сообщений (parser) для обеспечения соответствия настоящей спецификации. Однако, поскольку элементы такого синтаксиса были сочтены неинтероперабельными или вызывающими проблемы у получателей сообщений, использование таких элементов при создании сообщений недопустимо.

В разделе 5 рассматриваются вопросы безопасности, которые следует принимать во внимание при реализации данной спецификации.

Приложение A содержит примеры сообщения. Приведенный набор примеров не является исчерпывающим списком всех появляющихся в Internet типов сообщений, но может служить иллюстрацией к некоторым синтаксическим формам.

В Приложении B перечислены отличия данной спецификации от более ранних версий спецификации формата сообщений Internet.

В Приложении C содержатся благодарности.

2. Лексический анализ сообщений

2.1. Общее описание

На базовом уровне сообщение представляет собой последовательность символов. Сообщения, соответствующие данной спецификации, включают символы с десятичными кодами от 1 до 127, интерпретируемые в соответствии с кодировкой US-ASCII4 [ANSI.X3-4.1986]. Для краткости в этом документе такие символы будут называться просто «символами US-ASCII».

Символы сообщения делятся на строки. Строка представляет собой последовательность символов, завершающуюся кодами возврата каретки и перевода строки — в конце строки помещается символ возврата каретки (CR, десятичный код ASCII — 13), непосредственно за которым следует символ перевода строки (LF, десятичный код ASCII — 10). В данном документе такая последовательность обозначается «CRLF».

Сообщение состоит из полей заголовков5 (совокупность этих полей называют разделом заголовков сообщения), за которыми может следовать тело сообщения. Раздел заголовков представляет собой последовательность символьных строк, синтаксис которых описан в данной спецификации. Тело сообщения представляет собой последовательность символов, которая следует после раздела заголовков и отделена от него пустой строкой (строкой, содержащей только CRLF).

2.1.1. Предельные размеры строк

Данная спецификация вносит два ограничения на число символов в строке. Строка должна содержать не более 988 символов; следует использовать строки размером не более 78, без учета CRLF.

Ограничение в 998 обусловлено возможностями множества реализаций в части передачи, приема и хранения, которые не позволяют работать с сообщениями IMF, содержащими строки размером более 998 символов. Системы приема могут из соображений отказоустойчивости отказываться от ограничесния на размер строк. Однако существует множество реализаций, которые (в соответствии с транспортными требованиями [RFC5321]) не принимают сообщения со строками размером более 1000 (включая CR и LF в конце строки), — разработчикам важно принимать этот факт во внимание.

Рекомендация использовать строки размером не более 78 обусловлена параметрами пользовательского интерфейса многих реализаций, которые могут отсекать лишние символы или неаккуратно переносить слова при наличии в строке более 78 символов, несмотря на то, что такие реализации не соответствуют требованиям данной спецификации (и [RFC5321], если приводят к потере символов. Однако наличие такого ограничения не запрещает реализациям корректно отображать сообщения со строками произвольной длины (по крайней мере, строками, содержащими не более 998 символов) для повышения уровня отказоустойчивости.

2.2. Поля заголовков

Поля заголовков представляют собой строки, начинающиеся с имени поля, за которым следует двоеточие («:»), содержимое поля и знак завершения строки CRLF. Имя поля должно состоять только из печатаемых символов US-ASCII (т. е., символов с кодами от 33 до 126, включительно), исключая двоеточие. Значение поля может включать печатаемые символы US-ASCII, символы пробела (SP, код ASCII — 32) и горизонтальной табуляции (HTAB, код ASCII — 9), которые вместе называют также пробельными символами6. В значение поля недопустимо включать символы CR и LF, за исключением их использования в «фальцованных» и «нефальцованных» полях, как описано в параграфе 2.2.3. Значения полей должны соответствовать синтаксису, описанному в разделах 3 и 4 настоящей спецификации.

2.2.1. Бесструктурные поля заголовков

Некоторые поля заголовков в этой спецификации определены просто как неструктурированные (в параграфе 3.2.5 указано, что эти поля содержат произвольный набор печатаемых символов US-ASCII и пробельных символов) без дополнительных ограничений. Такие поля будем называть бесструктурными. Семантически бесструктурное поле трактуется просто как строка символов без дополнительной обработки (за исключением фальцовки, описанной в параграфе 2.2.3).

2.2.2. Структурированные поля заголовков

Синтаксис некоторых полей в данной спецификации вносит дополнительные ограничения по сравнению с описанными выше бесструктурными полями. Такие поля называются структурированными. Структурированное поле представляет собой последовательность лексем, описанных в разделах 3 и 4 данной спецификации. Многие из таких лексем (в соответствии с их синтаксисом) допускают включение комментариев в начале или в конце лексемы (см. параграф 3.2.2), а также пробельных символов, которые могут использоваться для фальцовки, как описано в параграфе 2.2.3. Семантический анализ структурированных полей приводится вместе с описанием их синтаксиса.

2.2.3. Длинные поля заголовков

Каждое поле заголовка логически представляет собой строку символов, состоящую из имени поля, двоеточия и тела (значения) поля. Однако для удобства и с учетом ограничения размеров строки (998/78 символов), значение поля может быть разбито на несколько строк; это называется «фальцовкой» (folding). Общим правило заключается в том, что данная спецификация разрешает включение последовательности CRLF (новая строка) перед любыми пробельными символами.

Например, поле заголовка

Subject: This is a test

можно записать в форме

Subject: This
is a test

Note: Хотя структурированные поля определены таким образом, что фальцовка может выполняться между множеством лексем (и даже внутри некоторых лексем), фальцовку следует ограничивать включением CRLF на синтаксических границах верхних уровней. Например, если тело поля определено, как разделенные запятыми значения, рекомендуется выполнять фальцовку после запятой, разделяющей элементы структуры, а не в других местах (даже если это разрешено).

Процесс преобразования фальцованного многострочного представления поля в обычное однострочное называется расфальцовкой (unfolding) и выполняется путем простого удаления всех последовательностей CRLF, непосредственно за которыми следуют пробельные символы (WSP). Каждое поле заголовка для дальнейшего синтаксического и семантического анализа следует трактовать в его нефальцованном представлении. На нефальцованные поля заголовков не накладываются ограничения по размеру и они, следовательно, могут иметь любую длину.

2.3. Тело письма

Тело сообщения представляет собой простые строки символов US-ASCII. Для содержимого сообщения существует только два типа ограничений7:

  • символы CR и LF должны использоваться только совместно, как CRLF; недопустимо использование этих символов в теле сообщения по-отдельности;
  • строки символов должны быть не длиннее 998 символов, следует ограничивать размер строк 78 символами (без учета CRLF).

3. Синтаксис

3.1. Введение

Описанный в этом разделе синтаксис задает корректный формат почтовых сообщений Internet. Сообщения, соответствующие данной спецификации, должны использовать описанный в этом разделе синтаксис. При наличии опций в этом разделе указано (в тексте или примечании), когда следует генерировать одну опцию.

Для определяемых выражений дается краткое описание синтаксиса и применения, после чего приводится синтаксис в формате ABNF и семантический анализ. Часть примитивов, используемых в документе, не определена здесь и заимствована из основных правил, приведенных в Приложении B.1 документа [RFC5234]. К таким примитивам относятся: CR, LF, CRLF, HTAB, SP, WSP, DQUOTE, DIGIT, ALPHA и VCHAR.

В некоторых определениях будут встречаться элементы, имена которых начинаются с префикса «obs-«. Такие элементы обозначают лексемы, относящиеся к устаревшему синтаксису и описанные в разделе 4. Во всех случаях такие конструкции при генерации корректных почтовых сообщений Internet игнорируются и их недопустимо использовать в качестве компонент сообщения. Однако при интерпретации сообщений такие лексемы должны рассматриваться как синтаксически корректные. В этом смысле раздел 3 описывает элементы «obs-«, как игнорируемые, а раздел 4 добавляет описание интерпретации сообщений с такими элементами.

3.2. Лексемы

В этом разделе описаны правила, используемые для определения базового лексического анализатора, который представляет лексемы анализаторам верхнего уровня. Раздел определяет лексемы, используемые в структурированных полях заголовков8.

3.2.1. Квотрирование символов

Некоторые символы имеют специальное значение (например, используются в качестве границ лексем). Для использования таких символов в общепринятом смысле служит механизм квотирования (добавления «кавычек»).

quoted-pair = ("\" (VCHAR / WSP)) / obs-qp

При появлении любой пары с квотированием (quoted-pair) она интерпретируется как отдельный символ. Т. е., символ \9, являющийся частью пары с квотированием, становится семантически «невидимым».

3.2.2. Пробелы для фальцовки и комментарии

Пробельные символы, включая и те, которые служат для фальцовки (см. параграф 2.2.3), могут появляться между разными элементами в теле полей заголовков. Строки символов, трактуемые, как комментарии, также могут включаться в тело структурированных полей заголовков с заключением их в скобки. Ниже определяется конструкция пробелов для фальцовки (FWS10) и комментариев.

Строки символов, заключенные в скобки, рассматриваются, как комментарии, если они не являются частью строки с квотированием, определенной в параграфе 3.2.4. Комментарии могут быть вложенными.

В этой спецификации есть несколько мест, где комментарии и FWS могут вставляться свободно. Для согласования с таким синтаксисом определена дополнительная лексема CFWS, показывающая возможность включения комментариев и/или FWS. Однако в тех случаях, где в данной спецификации разрешается CFWS, недопустимо использовать их так, чтобы фальцованное поле заголовка включало только символы WSP и ничего другого.

   FWS             =   ([*WSP CRLF] 1*WSP) / obs-FWS
                                          ; пробельные символы для фальцовки
   ctext           =   %d33-39 /          ; печатаемые символы US-ASCII,
                       %d42-91 /          ; не включая
                       %d93-126 /         ; "(", ")" и "\"
                       obs-ctext
   ccontent        =   ctext / quoted-pair / comment
   comment         =   "(" *([FWS] ccontent) [FWS] ")"
   CFWS            =   (1*([FWS] comment) [FWS]) / FWS

В этой спецификации появление FWS (пробельные символы для фальцовки) означает указание места, где возможно выполнение фальцовки, как описано в параграфе 2.2.3. Всякий раз при использовании фальцовки (т .е., поля заголовка, содержащего последовательность CRLF, за которой следует любой символ WSP) в сообщении должна выполняться расфальцовка (удаление CRLF) до любого семантического анализа, выполняемого по отношению к заголовку в соответствии с данной спецификацией. Т. е., любые последовательности CRLF, включенные в FWS, являются семантически невидимыми.

Комментарии обычно используются в теле структурированных полей для обеспечения некой дополнительной информации для человека. Поскольку в комментариях могут содержаться символы FWS, это позволяет выполнять фальцовку внутри комментария. Отметим также, что возможность использования в комментариях пар с квотированием, позволяет включать в комментарии скобки и символы обратной дробной черты (\), если они задаются в форме пары с квотированием. Семантически внешние скобки не являются частью комментария — комментарием является то, что заключено в эти скобки. Как было отмечено выше, символы «\» в парах с квотированием и последовательности CRLF внутри FWS внутри комментариев являются семантически невидимыми и, следовательно, не являются частью комментария.

FWS в качестве комментария (CFWS) между лексемами в структурированном поле заголовка семантически интерпретируется как один символ пробела.

3.2.3. Атом

Некоторые конструкции в теле структурированных полей заголовков представляют собой просто строки некоторых базовых символов. Такие конструкции называют атомами.

В некоторых структурированных полях заголовков допускается включение точки («.», код ASCII — 46) в atext. Для таких конструкций определена дополнительная лексема «атом с точкой» (dot-atom).

   atext           =   ALPHA / DIGIT /    ; Печатаемые символы US-ASCII, 
                       "!" / "#" /        ; не включая специальных символов.
                       "$" / "%" /        ; Используются для атомов.
                       "&" / "'" /
                       "*" / "+" /
                       "-" / "/" /
                       "=" / "?" /
                       "^" / "_" /
                       "`" / "{" /
                       "|" / "}" /
                       "~"
   atom            =   [CFWS] 1*atext [CFWS]
   dot-atom-text   =   1*atext *("." 1*atext)
   dot-atom        =   [CFWS] dot-atom-text [CFWS]
   specials        =   "(" / ")" /        ; Специальные символы1, которые не 
                       "<" / ">" /        ; появляются в atext
                       "[" / "]" /
                       ":" / ";" /
                       "@" / "\" /
                       "," / "." /
                       DQUOTE

Лексемы atom и dot-atom интерпретируются, как единый элемент, включающий строку символов. Семантически дополнительные комментарии и FWS, окружающие остальные символы, не являются частью атома — атом представляет собой только символы atext (или atext и «.» для dot-atom).

3.2.4. Строки в кавычках

Строки, включающие символы, недопустимые для использования в атомах, могут быть представлены с использованием двойных кавычек (DQUOTE, код ASCII — 34), окружающих такие символы.

   qtext           =   %d33 /             ; Печатаемые символы US-ASCII, 
                       %d35-91 /          ; не включая "\"
                       %d93-126 /         ; и символа кавычек
                       obs-qtext
   qcontent        =   qtext / quoted-pair
   quoted-string   =   [CFWS]
                       DQUOTE *([FWS] qcontent) [FWS] DQUOTE
                       [CFWS]

Строка в кавычках трактуется как единый элемент. Т. е. семантически строка в кавычках эквивалентна атому. Поскольку строки в кавычках могут содержать FWS, в них возможна фальцовка. Отметим также, что благодаря возможности использования внутри кавычек пар с квотированием, строки в кавычках могут содержать также символы кавычек и обратной дробной черты, если они представлены в форме пар с квотированием.

Семантически ни опциональные CFWS за пределами кавычек, ни сами символы кавычек не являются частью строки в кавычках — к такой строке относятся только символы, расположенные между кавычками. Как было отмечено выше, символ «\» в паре с квотированием или CRLF в FWS/CFWS, включенные в строку в кавычках, семантически невидимы и, следовательно, не являются частью строки в кавычках.

3.2.5. Прочие лексемы

Определены три дополнительных лексемы: слово (word) и фраза (phrase) для комбинаций атомов и/или строк в кавычках и неструктурированный текст (unstructured) для использования в бесструктурных полях заголовков и в некоторых местах структурированных полей.

word = atom / quoted-string
phrase = 1*word / obs-phrase
unstructured = (*([FWS] VCHAR) *WSP) / obs-unstruct

3.3. Задание даты и времен

Значения даты и времени появляются в нескольких полях заголовка. В этом параграфе определяет синтаксис для задания даты и времени. Хотя спецификация даты/времени допускает включение пробельных символов фальцовки, рекомендуется использовать один пробел в каждом случае включения FWS (так, где это требуется или допускается); некоторые старые реализации неспособны корректно интерпретировать пробельные символы фальцовки.

   date-time       =   [ day-of-week "," ] date time [CFWS]
   day-of-week     =   ([FWS] day-name) / obs-day-of-week
   day-name        =   "Mon" / "Tue" / "Wed" / "Thu" / "Fri" / "Sat" / "Sun"
   date            =   day month year    ; число, месяц год
   day             =   ([FWS] 1*2DIGIT FWS) / obs-day
   month           =   "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" / 
                       "Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec"
   year            =   (FWS 4*DIGIT FWS) / obs-year
   time            =   time-of-day zone    ; часовой пояс
   time-of-day     =   hour ":" minute [ ":" second ]
   hour            =   2DIGIT / obs-hour
   minute          =   2DIGIT / obs-minute
   second          =   2DIGIT / obs-second
   zone            =   (FWS ( "+" / "-" ) 4DIGIT) / obs-zone

Дата (day) показывает порядковый номер дня в месяце. Год (year) может принимать любое значение, не ранее 1900.

Время суток (time-of-day) показывает число часов, минут и (опционально) секунд, прошедщих с полуночи указанной даты.

Значения date и time-of-day следует указывать по местному времени.

Часовой пояс (zone) показывает смещение относительно универсального времени (UTC12, ранее использовался термин GMT13) значений местного времени, указанного в date и time-of-day. Знаки «+» и «-» показывают направление смещения — вперед (т. е., к востоку) или назад (к западу) от универсального времени. Первые две цифры показывают разницу с универсальным временем в часах, а две последних — дополнительную разницу в минутах. Следовательно, +hhmm означает смещение на +(hh * 60 + mm) минут от универсального времени, а -hhmm — на -(hh * 60 + mm) минут. Для индикации часового пояса, время которого совпадает с универсальным, следует использовать форму +0000. Хотя вариант -0000 указывает на тот же часовой пояс, этот вариант используется для индикации того, что время было указано системой, которая может находиться в часовом поясе, отличном от UT, а значение date-time не содержит информации о часовом поясе.

Значение date-time должно быть семантически корректным. Т. е., значение day-of-week (при его наличии) должно содержать день недели, числовое значение day-of-month должно находиться в диапазоне от 1 до числа дней в соответствующем месяце (указанного года), значение time-of-day должно находиться в диапазоне от 00:00:00 до 23:59:60 (число секунд, допустимое для смены суток; см. [RFC1305]), а две последних цифры поля zone должны иметь значение от 00 до 59.

3.4. Задание адреса

Адреса появляются в нескольких полях заголовка для индикации отправителей и получателей сообщения. Адрес может задавать персональный почтовый ящик или группу почтовых ящиков.

   address         =   mailbox / group
   mailbox         =   name-addr / addr-spec
   name-addr       =   [display-name] angle-addr
   angle-addr      =   [CFWS] "<" addr-spec ">" [CFWS] / obs-angle-addr
   group           =   display-name ":" [group-list] ";" [CFWS]
   display-name    =   phrase
   mailbox-list    =   (mailbox *("," mailbox)) / obs-mbox-list
   address-list    =   (address *("," address)) / obs-addr-list
   group-list      =   mailbox-list / CFWS / obs-group-list

Почтовый ящик принимает почту. Это концептуальный объект, который не обязательно связан с файловым хранилищем. Например, некоторые сайты могут выводить почтовые сообщения на принтер или передавать их на специальные адресуемые устройства вывода.

Обычно почтовый ящик состоит из двух частей: (1) необязательное отображаемое имя, которое идентифицирует имя получателя (человека или системы) и может выводиться пользователю в почтовых программах и (2) поле addr-spec, заключенное в угловые скобки («<» и «>»). Существует дополнительная форма указания почтового ящика, в которой имя получателя отсутствует, а addr-spec указывается без угловых скобок. Описание addr-spec для адресов Internet приведено в параграфе 3.4.1.

Примечание. Некоторое унаследованные реализации используют простую форму, где addr-spec указывается без угловых скобок, а имя получателя указывается в скобках, как комментарий вслед за addr-spec. Поскольку трактовка комментариев не задается спецификацией, реализациям для задания связанного с почтовым ящиком отображаемого имения следует использовать полную форму name-addr взамен такой унаследованной формы. Кроме того, поскольку некоторые унаследованные реализации интерпретируют комментарии, в общем случае не следует использовать комментарии в поле адреса во избежание возможной путаницы.

Когда желательно трактовать несколько почтовых ящиков, как один объект (например, список рассылки), может использоваться групповая конструкция. Такая конструкция позволяет отправителю указать именованную группу получателей. Это обеспечивается путем создания для группы отображаемого имени, за которым следует список разделенных запятыми почтовых ящиков произвольного (включая 0) размера, завершающийся точкой с запятой (;). Поскольку список почтовых ящиков может быть пустым, использование групповой конструкции также обеспечивает простой способ взаимодействия с адресатами, когда сообщение передается одной или множеству именованных групп адресатов без указания индивидуальных почтовых ящиков этих адресатов.

3.4.1. Задание addr-spec

Поле addr-spec представляет собой специфический для Internet идентификатор, содержащий локально интерпретируемую строку, за которой следует символ @ (код ASCII — 64) и доменное имя Internet. Эта локально интерпретируемая строка представляет собой строку в кавычках или атом с точкой. Если строка может быть представлена атомом с точкой (т. е., не содержит символов, кроме atext и завершающей точки или, за которой следуют символы atext), следует использовать форму dot-atom и не следует применять форму quoted-string. Комментарии и пробельные символы фальцовки не следует помещать рядом с @ в поле addr-spec.

Примечание. Здесь приведен либеральный синтаксис для доменной части addr-spec. Однако доменная часть содержит адресную информацию, задаваемую и используемую другими протоколами (например, [RFC1034], [RFC1035], [RFC1123], [RFC5321]). Следовательно, на реализации возлагается ответственность за соответствие синтаксиса адресов контексту, в котором они используются.

   addr-spec       =   local-part "@" domain
   local-part      =   dot-atom / quoted-string / obs-local-part
   domain          =   dot-atom / domain-literal / obs-domain
   domain-literal  =   [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS]
   dtext           =   %d33-90 /          ; Печатаемые символы US-ASCII,
                       %d94-126 /         ; не включая 
                       obs-dtext          ; "[", "]", "\"

Доменная часть идентифицирует точку, в которую доставляется почта. В форме dot-atom она интерпретируется, как доменное имя Internet (имя хоста или узла MX) в соответствии с описаниями в [RFC1034], [RFC1035] и [RFC1123]. В форме domain-literal доменная часть интерпретируется, как «дословный» Internet-адрес конкретного хоста. В обоих случаях использование адресации и транспортировка почты на конкретный хост определяются отдельными документами (такими, как [RFC5321]). Эти механизмы выходят за пределы настоящей спецификации.

Локальная часть (local-part) зависит от домена. В адресах она просто интерпретируется на конкретном хосте, как имя почтового ящика.

3.5. Общий синтаксис сообщений

Сообщение состоит из полей заголовка, за которыми может следовать тело сообщения. Строки сообщения должны иметь размер не более 998 символов, не считая CRLF, но рекомендуется использовать строки не длиннее 78 без учета CRLF (см. параграф 2.1.1). Хотя в теле сообщения могут появляться любые символы, перечисленные в правиле text, использование управляющих символов US-ASCII (коды 1- 8, 11, 12, 14 — 31) не является хорошим тоном, поскольку их интерпретация при отображении на приемной стороне не гарантируется.

   message         =   (fields / obs-fields)
                       [CRLF body]
   body            =   (*(*998text CRLF) *998text) / obs-body
   text            =   %d1-9 /            ; Символы, за исключением CR и LF
                       %d11 /             
                       %d12 /
                       %d14-127

Поля заголовков, несущие основную семантическую информацию, определены в параграфе 3.6. Тело сообщения представляет собой просто набор строк текста, интерпретируемых в соответствии с настоящей спецификацией.

3.6. Определения полей

В этом параграфе определены поля заголовка сообщения. Все поля заголовка имеют одинаковую синтаксическую структуру: имя поля, за которым следует двоеточие (:) и тело (значение) поля. Конкретный синтаксис каждого поля заголовка определен в соответствующем подпараграфе14.

Важно подчеркнуть, что порядок следования полей заголовка не гарантируется. Поля заголовков могут появляться в произвольном порядке. Более того, известно, что порядок полей заголовков может изменяться при передаче сообщений через Internet. Однако в соответствиии с данной спецификацией порядок полей заголовка не следует менять при передаче или преобразовании сообщений. Более важно отметить, что порядок трассировочных полей и полей resent изменять недопустимо и следует сохранять эти поля в блоках, добавляемых в начало сообщения (prepend). Дополнительная информация об этих полях содержится в параграфах 3.6.6 и 3.6.7.

Обязательными полями заголовка являются только поле даты и поле адреса отправителя сообщения. Все остальные поля являются синтаксически опциональными. Дополнительная информация приведена в таблице вслед за определением.

   fields          =   *(trace
                         *optional-field /
                         *(resent-date /
                          resent-from /
                          resent-sender /
                          resent-to /
                          resent-cc /
                          resent-bcc /
                          resent-msg-id))
                       *(orig-date /
                       from /
                       sender /
                       reply-to /
                       to /
                       cc /
                       bcc /
                       message-id /
                       in-reply-to /
                       references /
                       subject /
                       comments /
                       keywords /
                       optional-field)

 

Приведенная ниже таблица показывает минимальное и максимальное число полей каждого типа в разделе заголовков сообщения, а также ограничения на использование полей. Звездочка (*) после в колонке минимального или максимального числа полей говорит о наличии дополнительных ограничений, указанных в колонке «Примечания».

Поле

Минимум

Максимум

Примечания

trace

0

Не ограничен

Блок добавляется в начало, см. параграф 3.6.7

resent-date

0*

Не ограничен*

Одно на блок; требуется при наличии других полей resent, см. параграф 3.6.6

resent-from

0

Не ограничен*

Одно на блок, см. параграф 3.6.6

resent-sender

0*

Не ограничен*

Одно на блок; должно присутствовать при наличии множества адресов, см. параграф 3.6.6

resent-to

0

Не ограничен*

Одно на блок, см. параграф 3.6.6

resent-cc

0

Не ограничен*

Одно на блок, см. параграф 3.6.6

resent-bcc

0

Не ограничен*

Одно на блок, см. параграф 3.6.6

resent-msg-id

0

Не ограничен*

Одно на блок, см. параграф 3.6.6

orig-date

1

1

from

1

1

См. sender и параграф 3.6.2

sender

0*

1

Должно присутствовать при наличии множества адресов, см. параграф 3.6.2

reply-to

0

1

to

0

1

cc

0

1

bcc

0

1

message-id

0*

1

Следует включать, см. параграф 3.6.4

in-reply-to

0*

1

Следует включать, см. параграф 3.6.4

references

0*

1

Следует включать, см. параграф 3.6.4

subject

0

1

comments

0

Не ограничен

keywords

0

Не ограничен

optional-field

0

Не ограничен

Точная интерпретация каждого поля рассмотрена в последующих параграфах.

3.6.1. Поле даты создания

Поле даты создания состоит из имени поля «Date», за которым следуют значения даты и времени.

orig-date = "Date:" date-time CRLF

Поле указывает дату и время, когда отправитель, указанный в сообщении, завершил подготовку сообщения к передаче системе доставки. Например, это может быть момент нажатия пользователем кнопки «send» или «submit» в почтовой программе. В любом случае, это поле не предназначено для указания времени реальной передачи сообщения, а содержит значение времени, когда человек или другой создатель сообщения завершил подготовку сообщения к передаче (например, пользователь портативного компьютера, не подключенного к сети, мог просто поместить сообщение в очередь для доставки; поле даты создания предназначено для хранения даты и времени в момент постановки письма в очередь, а не момента подключения пользователя к сети).

3.6.2. Поля источника

В число полей источника сообщения входят from и sender (когда применимо), а также опционально — reply-to. Поле from содержит имя «From» и разделенный запятыми список из одного или нескольких имен почтовых ящиков. Эсли это поле содержит более одного адреса почтового ящика в списке, в сообщение должно включаться поле «Sender» с указанием одного почтового ящика. Дополнительно может также включаться поле «Reply-To», содержащее список разделенных запятыми почтовых ящиков (не менее одного).

from = "From:" mailbox-list CRLF
sender = "Sender:" mailbox CRLF
reply-to = "Reply-To:" address-list CRLF

Поле источника показывает почтовый ящик(и) источника сообщения. Поле «From:» задает автора (авторов) сообщения, т. е., почтовый ящик(и) человека или системы, ответственных за создание данного сообщения. Поле «Sender:» указывает почтовый ящик агента, ответственного за реальную передачу сообщения. Например, если секретарь отправил письмо от имени своего руководителя, почтовый ящик секретаря будет указан в поле «Sender:», а адрес действительного автора сообщения — в поле «From:». Если источник сообщения может быть задан единственным почтовым ящиком (автор и отправитель совпадают), поле «Sender:» использовать не следует15. В остальных случаях это поле следует включать в заголовок.

Поля источника также обеспечивают информацию, требуемую для ответа на сообщение. При наличии поля «Reply-To:» оно указывает адрес(а), по которому отправитель сообщения предлагает направлять ответ. В отсутствие поля «Reply-To:» ответ следует по умолчанию отправлять по адресу (адресам), указанному в поле «From:», если автором ответа явно не указан иной адрес.

В любом случае в поле «From:» не следует указывать адрес, не имеющий отношения к автору письма. Формирование адресов для отправки ответов на сообщения дополнительно рассматривается в параграфе 3.6.3.

3.6.3. Поля адресов получателей

К полям получателей относятся три однотипных поля, каждое из которых содержит имя («To», «Cc» или «Bcc») и список из одного или множества разделенных запятыми адресов (почтовых ящиков или групп).

to = "To:" address-list CRLF
cc = "Cc:" address-list CRLF
bcc = "Bcc:" [address-list / CFWS] CRLF

Эти поля задают получателей сообщения. Каждое из полей может содержать один или множество адресов, идентифицирующих получателей сообщения. Различие между полями заключается только в способе их использования.

Поле «To:» содержит адрес(а) основного получателя (получателей) сообщения.

Поле «Cc:» (от «Carbon Copy» — копия по аналогии с печатью под копирку на пишущей машинке) содержит адреса других лиц, которым направляется это сообщение, хотя содержимое сообщения может быть не адресовано им напрямую.

Поле «Bcc:» (от «Blind Carbon Copy» — «слепая копия» по аналогии с последним экземпляром при печати под копирку) содержит адреса получателей, которые не будут показаны другим получателям этого сообщения. Существует три варианта использования поля «Bcc:». В первом случае, когда сообщение с полем «Bcc:» готовится к отправке, строка «Bcc:» удаляется из него, хотя все адресаты (включая указанных в поле «Bcc:») получают копию этого письма. Во втором варианте получатели, указанные в полях «To:» и «Cc:», получат сообщение с удаленной строкой «Bcc:», но адресаты, указанные в поле «Bcc:» получат копию письма с сохраненной строкой «Bcc:» (при указании в поле «Bcc:» множества адресатов некоторые реализации на самом деле шлют каждому адресату из поля «Bcc:» отдельную копию письма, содержащую в этом поле только адрес данного получателя). И, наконец, когда поле «Bcc:» не содержит адресов, это поле может включаться во все копии сообщения для адресатов, заданных другими полями. Выбор конкретного варианта использования поля «Bcc:» определяется реализацией, но при этом следует принимать во внимание информацию, приведенную ниже в разделе «Вопросы безопасности».

Когда сообщение является ответом на другое письмо, почтовые ящики авторов исходного письма (значение поля «From:») или почтовые ящики, указанные в поле «Reply-To:» (если оно есть), могут появляться в поле «To:» ответного письма, поскольку эти адресаты являются явными отправителями исходного письма. Если сообщение передается в ответ на письмо, имеющее поля получателей, зачастую бывает полезно отправить копию ответа всем получателям сообщения в дополнение к отправке письма автору. При создании такого отклика адреса из полей «To:» и «Cc:» исходного сообщения могут появляться в поле «Cc:» ответного письма, поскольку эти адресаты были открытоо указаны в числе получателей копии исходного письма. Если в исходном письме присутствует поле «Bcc:», адреса из этого поля могут появляться в поле «Bcc:» ответа на письмо, но их не следует включать в поле «To:» или «Cc:».

Примечание. Некоторые почтовые программы поддерживают команды автоматического ответа, при котором адреса получателей исходного письма включаются в число адресов получателей ответа. Поведение таких команд зависит от реализации и выходит за пределы настоящего документа. В частности, вопрос включения адресов получателей исходного письма при наличии в нем поля «Reply-To:» здесь не рассматривается.

3.6.4. Поля идентификации

Хотя в таблице параграфа 3.6 поле «Message-ID:» указано, как необязательное, это поле следует включать в каждое сообщение. Более того, в ответные сообщения следует включать поля «In-Reply-To:» и «References:» в соответствии с приведенным ниже описанием.

Поле «Message-ID:» содержит один уникальный идентификатор сообщения. Каждое из полей «References:» и «In-Reply-To:» содержит один или множество уникальных идентификаторов сообщений, опционально разделенных символами CFWS.

Синтаксис идентификатора сообщения (msg-id) является ограниченной версией конструкции addr-spec, заключенной в угловые скобки «<» и «>». В отличие от addr-spec, этот синтаксис разрешает форму dot-atom-text слева от символа @ и не имеет сиволов CFWS где-либо внутри идентификатора.

Примечание. Как и в случае addr-spec, для правой части msg-id (после символа @) дается либеральный синтаксис. Однако ниже в этом параграфе сказано, что рекомендуется использовать справа от знака @ доменное имя. Как и прежде, синтаксис доменного имени задается и используется в других протоколах (например, [RFC1034], [RFC1035], [RFC1123], [RFC5321]). Следовательно, на реализации возлагается вопрос соответствия адресов контексту, в котором они используются.

   message-id      =   "Message-ID:" msg-id CRLF
   in-reply-to     =   "In-Reply-To:" 1*msg-id CRLF
   references      =   "References:" 1*msg-id CRLF
   msg-id          =   [CFWS] "<" id-left "@" id-right ">" [CFWS]
   id-left         =   dot-atom-text / obs-id-left
   id-right        =   dot-atom-text / no-fold-literal / obs-id-right
   no-fold-literal =   "[" *dtext "]"

Поле «Message-ID:» обеспечивает уникальный идентификатор сообщения, который указывает на конкретный вариант конкретного письма. Уникальность идентификатора гарантируется хостом, создающим сообщение (см. ниже). Этот идентификатор предназначен для машинной обработки и не имеет большого смысла для человека. Идентификатор сообщения относится только к одному варианту конкретного письма — для следующего экземпляра сообщения будет создан другой идентификатор.

Примечание. Существует множество ситуаций, когда сообщения «изменяются», но эти изменения не порождают нового экземпляра данного сообщения и, следовательно, сообщение не получает нового идентификатора. Например, когда сообщения вводятся в транспортную систему, в начало сообщения зачастую добавляются дополнительные поля заголовков, такие, как поля трассировки (параграф 3.6.7) и поля пересылки (параграф 3.6.6). Добавление таких полей в заголовки не меняет сообщения, как такового, и, следовательно, значение «Message-ID:» сохраняется. Во всех случаях содержимое, которое желает передать отправитель (то же самое сообщение или другое), а не какое-либо синтаксическое отличие, которое появляется (или не появляется) в сообщении, определяет сохранение или изменение поля «Message-ID:».

Поля «In-Reply-To:» и «References:» используются при создании ответных сообщений. Они содержат идентификатор исходного сообщения и идентификаторы других сообщений (например, в случае ответа на письмо, которое само является ответом на другое письмо). Поле «In-Reply-To:» может использоваться для идентификации сообщения (сообщений), на которое отвечает данное сообщение, тогда как поле «References:» может служить для идентификации «ветви» разговора.

При создании ответа на сообщение поля «In-Reply-To:» и «References:» в ответном письме строятся в соответствии с приведенным ниже описанием.

Поле «In-Reply-To:» ответного письма будет содержать информацию из поля «Message-ID:» исходного («родительского») сообщения. Если ответ дается на несколько писем сразу, поле «In-Reply-To:» будет содержать информацию из полей «Message-ID:» всех родительских сообщений16. Если в родительских сообщениях нет полей «Message-ID:», в ответе не будет содержаться поля «In-Reply-To:».

Поле «References:» будет включать содержимое поля «References:» из родительского письма (если там это поле присутствует), вслед за которым будет включено родительское поле «Message-ID:» (при его наличии). Если в родительском сообщении нет поля «References:», но имеется поле «In-Reply-To:» с единственным идентификатором, в ответе поле «References:» будет включать содержимое родительского поля «In-Reply-To:», за которым будет следовать содержимое родительского поля «Message-ID:» (при его наличии). Если в родительском сообщении нет полей «References:», «In-Reply-To:» и «Message-ID:», в ответе не будет поля «References:».

Идентификатор сообщения (msg-id) должен быть уникальным в глобальном масштабе. Эту уникальность должен обеспечивать генератор идентификаторов сообщений. Существует несколько алгоритмов, обеспечивающих решение этой задачи. Поскольку синтаксис msg-id подобен синтаксису addr-spec (за исключением запрета на включение строк в кавычках, комментариев и фальцовочных пробелов), хорошим методом является включение в идентификатор доменного имени (или полного адреса IP) хоста, на котором создается идентификатор сообщения, справа от знака @ (доменные имена и адреса IP обычно уникальны) и включение текущего абсолютного значения даты и времени в комбинации с неким другим уникальным в данный момент (возможно последовательным) идентификатором, доступным в системе (например, идентификатором процесса), слева от @. Хотя будут работать и другие алгоритмы, рекомендуется использовать в правой части некий идентификатор домена (имя хоста или нечто иное), чтобы генератор идентификатора сообщения мог гарантировать уникальность левой части идентификатора в масштабе данного домена.

Семантически угловые скобки не являются частью msg-id; идентификатором является строка символов между скобками.

3.6.5. Информационные поля

Информационные поля являются необязательными. Поля «Subject:» и «Comments:» являются бесструктурными, как определено в параграфе 2.2.1, и, следовательно, могут содержать текст или пробельные символы для фальцовки. Поле «Keywords:» содержит список из одного или более разделенных запятыми слов или строк в кавычках.

subject = "Subject:" unstructured CRLF
comments = "Comments:" unstructured CRLF
keywords = "Keywords:" phrase *("," phrase) CRLF

Эти три поля предназначены только для включения понятной человеку информации о сообщении. Поле «Subject:» используется наиболее широко и содержит короткую строку, описывающую тему сообщения. При использовании в ответах это поле может начинаться с префикса «Re: » (сокращение от латинского «in re», означающего «по вопросу ..»), за которым следует содержимое поля «Subject:» исходного письма. В таких случаях следует использовать префикс «Re: » только один раз, поскольку использование другого текста или включение нескольких префиксов может приводить к нежелательным последствиям. Поле «Comments:» содержит произвольную информацию, дополняющую текст в теле письма. Поле «Keywords:» содержит список разделенных запятыми слов и фраз » field contains a comma-separated list of important words and phrases that might be useful for the recipient.

3.6.6. Поля пересылки

Поля пересылки следует добавлять во все сообщения, которые повторно вводятся пользователем в транспортную систему. Каждый раз, когда это происходит, следует добавлять отдельный набор полей пересылки. Все поля пересылки, соответствующие отдельному факту пересылки, следует группировать. Каждый набор полей пересылки помещается в начало сообщения; т. е. самый свежий набор таких полей появляется в сообщении первым. При добавлении полей пересылки никакие другие поля сообщения не меняются.

Каждое поле пересылки синтаксически соответствует определенному полю при обычной передаче. Например, поле «Resent-Date:» соответствует полю «Date:», а «Resent-To:» — полю «To:». Во всех таких случаях синтаксис тела полей пересылки идентичен синтаксису соответствующего поля, описанному выше.

При использовании полей пересылки должны передаваться поля «Resent-From:» и «Resent-Date:». Следует передавать также поле «Resent-Message-ID:». Поле «Resent-Sender:» не следует использовать, если это поле будет идентично полю «Resent-From:».

   resent-date     =   "Resent-Date:" date-time CRLF
   resent-from     =   "Resent-From:" mailbox-list CRLF
   resent-sender   =   "Resent-Sender:" mailbox CRLF
   resent-to       =   "Resent-To:" address-list CRLF
   resent-cc       =   "Resent-Cc:" address-list CRLF
   resent-bcc      =   "Resent-Bcc:" [address-list / CFWS] CRLF
   resent-msg-id   =   "Resent-Message-ID:" msg-id CRLF

Поля пересылки17 служат для идентификации сообщений, как повторно вводимых пользователем в транспортную систему. Цель использования этих полей заключается в предоставлении конечному адресату сообщения в таком виде, как будто оно было получено непосредственно от исходного отправителя с сохранением всех исходных полей. Каждый набор полей пересылки соответствует одному факту пересылки. Т. е., при многократной пересылке сообщения каждый из таких наборов описывает отдельный факт пересылки. Поля пересылки являются информационными. Эти поля недопустимо использовать в процессах автоматической генерации ответов и других операциях автоматизированной обработки сообщений.

Поля инициатора пересылки указывают почтовый ящик лиц(а) или систем(ы), переславших это сообщение. Как и для обычных полей инициатора существует две формы — простой вариант «Resent-From:», содержащий почтовый ящик выполняющего пересылку лица, и более сложный вариант, когда одно лицо (идентифицируется полем «Resent-Sender:») пересылает сообщение от имени одного или множества других лиц (идентифицируются полем «Resent-From:»).

Примечание. При ответе на пересланное сообщение исходные поля «From:», «Reply-To:», «Message-ID:» и др. используются в обычном порядке. Поля пересылки являются только информационными и недопустимо использовать их при ответе на сообщение.

Поле «Resent-Date:» указывает дату и время диспетчеризации сообщения при его пересылке. Подобно полю «Date:», оно содержит не дату и время реальной отправки сообщения, а дату и время постановки в очередь.

Функционально поля «Resent-To:», «Resent-Cc:» и «Resent-Bcc:» идентичны полям «To:», «Cc:» и «Bcc:», соответственно, за исключением того, что они указывают получателей пересланного сообщения, а не исходного.

Поле «Resent-Message-ID:» содержит уникальный идентификатор пересланного сообщения.

3.6.7. Поля трассировки

Поля трассировки представляют собой группу полей заголовка, включающую опциональное поле «Return-Path:» и одно или множество полей «Received:». Поле заголовка «Return-Path:содержит пару угловых скобок, в которые заключено необязательное значение addr-spec. Поле «Received:» содержит (возможно пустой) список маркеров, за которым следует точка с запятой (;) и значение даты и времени. Каждый маркер должен представлять собой элемент типа word, angle-addr, addr-spec или domain. Спецификации, описывающие использование полей трассировки (такие, как [RFC5321]), могут вносить дополнительные ограничения.

   trace           =   [return]
                       1*received
   return          =   "Return-Path:" path CRLF
   path            =   angle-addr / ([CFWS] "<" [CFWS] ">" [CFWS])
   received        =   "Received:" *received-token ";" date-time CRLF
   received-token  =   word / angle-addr / addr-spec / domain

Полное описание использования полей трассировки в почте Internet содержится в [RFC5321]. В данной спецификации трассировочные поля рассматриваются исключительно в качестве информационных и любая формальная интерпретация этих полей выходит за рамки документа.

3.6.8. Дополнительные поля

В сообщениях могут появляться поля, не рассмотренные в этом документе. Такие поля должны соответствовать синтаксису optional-field. Этот синтаксис включает имя поля, состоящее из печатаемых символов US-ASCII без двоеточий и пробелов (SP), за которым следует двоеточие и произвольный текст, соответствующий синтаксису бесструктурных полей.

Недопустимо совпадение имен дополнительных полей с именами полей, указанными в данном документе.

   optional-field  =   field-name ":" unstructured CRLF
   field-name      =   1*ftext
   ftext           =   %d33-57 /          ; Печатаемые символы US-ASCII, 
                       %d59-126           ; за исключением «:».

В настоящей спецификации дополнительные поля считаются неинтерпретируемыми.

4. Устаревший синтаксис

В ранних версиях спецификации допускался иной (обычно, более либеральный) синтаксис по сравнению с дозволенным в этой версии. Кроме того, некоторые синтаксические элементы, используемые в почтовых сообщениях Internet, никогда не были документированы. Хотя генерация таких синтаксических форм недопустима в соответствии с разделом 3, они должны восприниматься и разбираться соответствующим спецификации получателем. В этом разделе документированы многие элементы такого типа. Использование грамматики раздела 3 с добавлением содержащихся в данном разделе определений, создает грамматику для использования при интерпретации сообщений.

Примечание. В этом разделе рассматриваются лишь те синтаксические формы, которые любая реализация должна подобающим образом интерпретировать. Однако существуют сообщения Internet, которые не соответствуют спецификации даже с учетом приведенного в этом разделе дополнительного синтаксиса. Отсутствие той или иной формы в данном документе отнюдь не означает, что она предназначена для нарушения работы компьютерной программы, а некорректный формат не обязательно ведет к потере данных в любой реализации. Устойчивость реализации к ошибкам обеспечивается самой реализацией.

Важное различие между устаревшим (интерпретация) и современным (генерация) синтаксисом заключается в том, что структурированные поля заголовков (т. е., текст между двоеточием и завершающей строку последовательностью CRLF) могут содержать пробелы (включая фальцовочные) и комментарии между любыми лексемами. Это позволяет создавать множество сложных форм, разбор которых может оказаться затруднительным для некоторых реализаций.

Другим ключевым различием между устаревшим и современным синтаксисом является правило, приведенное в параграфе 3.2.2 и запрещающее включение фальцовочных символов в строки, содержащие только пробелы в комментарии (см. обсуждение фальцовочных пробелов в параграфе 4.2).

В этом разделе также рассматриваются некоторые символы, которые раньше разрешалось использовать в сообщениях. Символ NUL (код ASCII — 0) считался разрешенным, но сейчас к таковым не относится. Аналогично, управляющие символы US-ASCII, отличные от CR, LF, SP и HTAB (коды ASCII от 1 до 8, 11, 12, 14 — 31 и 127) разрешалось использовать в полях заголовков. Символы CR и LF разрешалось использовать в сообщениях не только в форме последовательности CRLF; такое использование также рассматривается здесь.

Остальные различия в синтаксисе и семантике рассматриваются в соответствующих подпараграфах.

4.1. Прочие устаревшие маркеры

Описанные здесь синтаксические элементы используются в устаревшем или основном синтаксисе. Отдельные символы CR, LF и NUL добавлены в obs-qp, obs-body и obs-unstruct. Управляющие символы US-ASCII добавлены в obs-qp, obs-unstruct, obs-ctext и obs-qtext. Символ точки (.) добавлен в obs-phrase18. Поддерживается лексема obs-phrase-list для (возможно пустых) списков разделенных запятыми фраз, которые могут включать «пустые» элементы. Т. е. в таком списке могут быть две и более запятых, между которыми не содержится ничего; возможны также запятые в начале и в конце списка.

   obs-NO-WS-CTL   =   %d1-8 /            ; Управляющие символы US-ASCII, 
                       %d11 /             ; не включая символов
                       %d12 /             ; возврата картеки, 
                       %d14-31 /          ; перевода строки и 
                       %d127              ; пробельных символов
   obs-ctext       =   obs-NO-WS-CTL
   obs-qtext       =   obs-NO-WS-CTL
   obs-utext       =   %d0 / obs-NO-WS-CTL / VCHAR
   obs-qp          =   "\" (%d0 / obs-NO-WS-CTL / LF / CR)
   obs-body        =   *((*LF *CR *((%d0 / text) *LF *CR)) / CRLF)
   obs-unstruct    =   *((*LF *CR *(obs-utext *LF *CR)) / FWS)
   obs-phrase      =   word *(word / "." / CFWS)
   obs-phrase-list =   [phrase / CFWS] *("," [phrase / CFWS])

Отдельные символы CR и LF, появляющиеся в сообщениях, могут иметь двоякий смысл. Во многих случаях одиночные символы CR или LF некорректно используются вместо CRLF для индикации завершения строк. В остальных случаях одиночные символы CR и LF просто используются в качестве управляющих символов US-ASCII в традиционном их смысле.

4.2. Устаревшие пробелы для фальцовки

В устаревшем синтаксисе можно включать любое количество фальцовочных пробелов в тех случаях, когда разрешено правило obs-FWS. Это позволяет включить в строку две фальцовки подряд и, следовательно, делает возможными строки в заголовках полей, содержащие только пробельные символы.

obs-FWS = 1*WSP *(CRLF 1*WSP)

4.3. Устаревшие форматы даты и времени

Устаревший синтаксис для полей даты допускает использование 2 цифр для указания года, а также разрешает буквенные обозначения часовых поясов, которые использовались в ранних версиях спецификации. Этот синтаксис также позволяет включение комментариев и фальцовочных пробелов между большинством лексем.

   obs-day-of-week =   [CFWS] day-name [CFWS]
   obs-day         =   [CFWS] 1*2DIGIT [CFWS]
   obs-year        =   [CFWS] 2*DIGIT [CFWS]
   obs-hour        =   [CFWS] 2DIGIT [CFWS]
   obs-minute      =   [CFWS] 2DIGIT [CFWS]
   obs-second      =   [CFWS] 2DIGIT [CFWS]
   obs-zone        =   "UT" / "GMT" /     ; Смещение от UT для Северной Америки
                       "EST" / "EDT" /    ; восток:  - 5/ - 4
                       "CST" / "CDT" /    ; центр:  - 6/ - 5
                       "MST" / "MDT" /    ; горы: - 7/ - 6
                       "PST" / "PDT" /    ; тихоокеанское побережье:  - 8/ - 7
                                          ;
                       %d65-73 /          ; Военные часовые пояса — от A 
                       %d75-90 /          ; до I и от K
                       %d97-105 /         ; до Z, 
                       %d107-122          ; в верхнем и нижнем регистре

При использовании 2 или трех цифр в поле года интерпретация выполняется следующим образом — если 2-значное обозначение года лежит в диапазоне от 00 до 49, к значению прибавляется 2000, т. е., год принимает значение от 2000 до 2049; если 2-значное обозначение года лежит в диапазоне от 50 до 99, к значению прибавляется 1900.

У устаревших часовых поясах идентификаторы «UT» и «GMT» указывают на «универсальное время» и «время по Гринвичу», соответственно; оба значения семантически эквивалентны «+0000».

Оставшиеся три символа часового пояса являются обозначениями часовых поясов США. Первая буква («E», «C», «M» или «P») означает «Eastern» (восточный), «Central» (центральный), «Mountain» (горный) и «Pacific» (тихоокеанский). Вторая буква может быть «S» (Standard — стандартное время) или «D» (Daylight Savings — летнее время).

Ниже приводится интерпретация используемых значений.

EDT семантически эквивалентно -0400

EST семантически эквивалентно -0500

CDT семантически эквивалентно -0500

CST семантически эквивалентно -0600

MDT семантически эквивалентно -0600

MST семантически эквивалентно -0700

PDT семантически эквивалентно -0700

PST семантически эквивалентно -0800

Один символ военного часового пояса был определен нестандартным способом в [RFC0822] и, следовательно, его значение непредсказуемо. Исходные определения военных часовых поясов от «A» до «I» эквивалентны поясам от «+0100» до «+0900», соответственно; «K», «L» и «M» эквивалентны «+1000», «+1100» и «+1200», соответственно; «N» — «Y» эквивалентны поясам от «-0100» до «-1200», соответственно; «Z» эквивалентно «+0000». Однако в результате ошибки в [RFC0822] все эти обозначения следует трактовать, как эквивалентные «-0000» если явно не задано иное их толкование.

В почтовых сообщениях Internet применяются и другие многосимвольные (обычно от 3 до 5 букв) обозначения часовых поясов. Все обозначения, смысл которых непонятен, следует трактовать, как эквивалент «-0000» если явно не указано иное их толкование.

4.4. Устаревшая адресация

В адресации имеется четыре основных различия. Во-первых, в адресе почтового ящика разрешалось использовать перед addr-spec маршрутную часть, заключенную в угловые скобки. Маршрут является просто списком разделенных запятыми доменных имен, каждое из которых имеет префикс «@»; для завершения списка используется двоеточие (:). Во-вторых, разрешалось включать символы CFWS между разделенными точками элементами локальной части и домена (т. е., лексема dot-atom не использовалась). Кроме того, в local-part можно было в дополнение к атомам включать строки в кавычках. В-третьих, разрешалось включать в списки почтовых ящиков (mailbox-list) и списки адресов (address-list) пустые (null) элементы. Т. е., в списке могли следовать две или более запятых подряд, а также разрешалось присутствие запятых в начале и в конце списков. В-четвертых, разрешалось использовать управляющие символы US-ASCII и пары с квотированием в доменных литералах.

   obs-angle-addr  =   [CFWS] "<" obs-route addr-spec ">" [CFWS]
   obs-route       =   obs-domain-list ":"
   obs-domain-list =   *(CFWS / ",") "@" domain
                       *("," [CFWS] ["@" domain])
   obs-mbox-list   =   *([CFWS] ",") mailbox *("," [mailbox / CFWS])
   obs-addr-list   =   *([CFWS] ",") address *("," [address / CFWS])
   obs-group-list  =   1*([CFWS] ",") [CFWS]
   obs-local-part  =   word *("." word)
   obs-domain      =   atom *("." atom)
   obs-dtext       =   obs-NO-WS-CTL / quoted-pair

При интерпретации адресов маршрутную часть следует игнорировать.

4.5. Устаревшие поля заголовков

Синтаксически, основным различием является то, что устаревший синтаксис полей разрешал многократное включение любых полей в произвольном порядке. Кроме того, устаревший синтаксис разрешает включать любое количество пробелов перед двоеточием в конце имени поля.

   obs-fields      =   *(obs-return /
                       obs-received /
                       obs-orig-date /
                       obs-from /
                       obs-sender /
                       obs-reply-to /
                       obs-to /
                       obs-cc /
                       obs-bcc /
                       obs-message-id /
                       obs-in-reply-to /
                       obs-references /
                       obs-subject /
                       obs-comments /
                       obs-keywords /
                       obs-resent-date /
                       obs-resent-from /
                       obs-resent-send /
                       obs-resent-rply /
                       obs-resent-to /
                       obs-resent-cc /
                       obs-resent-bcc /
                       obs-resent-mid /
                       obs-optional)

За исключением поля адреса получателя (см. параграф 4.5.3) интерпретация множественного вхождения полей не специфицирована. Также нет спецификации для интерпретации полей трассировки и пересылки, которые не располагаются в блоке, предшествующем сообщению. Если в следующих подпараграфах явно не указано иное, интерпретация таких полей происходит идентично интерпретации подобных полей современного синтаксиса, описанных в разделе 3.

4.5.1. Устаревшее поле даты создания

obs-orig-date = "Date" *WSP ":" date-time CRLF

4.5.2. Устаревшие поля отправителя

   obs-from        =   "From" *WSP ":" mailbox-list CRLF
   obs-sender      =   "Sender" *WSP ":" mailbox CRLF
   obs-reply-to    =   "Reply-To" *WSP ":" address-list CRLF

4.5.3. Устаревшие поля адресов получателей

   obs-to          =   "To" *WSP ":" address-list CRLF
   obs-cc          =   "Cc" *WSP ":" address-list CRLF
   obs-bcc         =   "Bcc" *WSP ":"
                       (address-list / (*([CFWS] ",") [CFWS])) CRLF

При наличии в сообщении множества полей с адресом получателя их следует трактовать, как объединение адресного списка из первого поля с адресными списками из последующих полей путем добавления запятых и конкатенации строк.

4.5.4. Устаревшие поля идентификации

Устаревшие поля «In-Reply-To:» и «References:» отличаются от современного синтаксиса тем, что в них допускается включение фраз (слова или строки в кавычках). Устаревшие формы ревой и правой сторон msg-id разрешают промежуточные CFWS, что делает эти части синтаксически эквивалентными local-part и domain, соответственно.

   obs-message-id  =   "Message-ID" *WSP ":" msg-id CRLF
   obs-in-reply-to =   "In-Reply-To" *WSP ":" *(phrase / msg-id) CRLF
   obs-references  =   "References" *WSP ":" *(phrase / msg-id) CRLF
   obs-id-left     =   local-part
   obs-id-right    =   domain

При интерпретации фразы в полях «In-Reply-To:» и «References:» игнорируются.

Семантически, ни один из дополнительных символов CFWS в local-part и domain не является частью obs-id-left и obs-id-right, соответственно.

4.5.5. Устаревшие информационные поля

   obs-subject     =   "Subject" *WSP ":" unstructured CRLF
   obs-comments    =   "Comments" *WSP ":" unstructured CRLF
   obs-keywords    =   "Keywords" *WSP ":" obs-phrase-list CRLF

 

4.5.6. Устаревшие поля пересылки

В устаревшем синтаксисе имеется поле «Resent-Reply-To:», которое состоит из имени поля, необязательных комментариев и фальцовочных пробелов, двоеточия и списка разделенных запятыми адресов.

   obs-resent-from =   "Resent-From" *WSP ":" mailbox-list CRLF
   obs-resent-send =   "Resent-Sender" *WSP ":" mailbox CRLF
   obs-resent-date =   "Resent-Date" *WSP ":" date-time CRLF
   obs-resent-to   =   "Resent-To" *WSP ":" address-list CRLF
   obs-resent-cc   =   "Resent-Cc" *WSP ":" address-list CRLF
   obs-resent-bcc  =   "Resent-Bcc" *WSP ":" (address-list / (*([CFWS] ",") [CFWS])) CRLF
   obs-resent-mid  =   "Resent-Message-ID" *WSP ":" msg-id CRLF
   obs-resent-rply =   "Resent-Reply-To" *WSP ":" address-list CRLF

Как и остальные поля пересылки, поле «Resent-Reply-To:» трактуется исключительно, как информационное.

4.5.7. Устаревшие поля трассировки

Поля obs-return и obs-received приведены здесь, как шаблоны определений, идентичные return и received в разделе 3. Полный синтаксис описан в [RFC5321].

obs-return = "Return-Path" *WSP ":" path CRLF
obs-received = "Received" *WSP ":" *received-token CRLF

4.5.8. Устаревшие дополнительные поля

obs-optional = field-name *WSP ":" unstructured CRLF

5. Вопросы безопасности

Требуются определенные меры предосторожности при отображении сообщений на терминале или в программе эмуляции терминала. Многофункциональные терминалы могут реагировать на escape-последовательности и другие комбинации управляющих символов US-ASCII, что может вызывать неожиданные эффекты. В число таких эффектов может входить изменение клавиатурной раскладки и другие эффекты, способные приводить к нарушению работы и даже к повреждению данных. Управляющие символы могут вызывать (иногда программируемо) генерацию ответов на сообщения, что позволяет вводить команды от имени пользователя. Возможно также воздействие на подключенные к терминалу устройства (например, принтеры). Программы просмотра сообщений могут по своему усмотрению удалить опасные escape-последовательности из сообщения перед его выводом. Однако некоторые escape-последовательности могут быть нужны в сообщениях (см. [ISO.2022.1994], [RFC2045], [RFC2046], [RFC2047], [RFC2049], [RFC4288], [RFC4289]) и поэтому не следует удалять escape-последовательности без разбора.

Передача отличных от текста объектов в сообщениях может приводить к возникновению дополнительных опасностей. Рассмотрению таких вопросов посвящены документы [RFC2045], [RFC2046], [RFC2047], [RFC2049], [RFC4288] и [RFC4289].

Многие реализации используют поле «Bcc:» (последний экземпляр), описанное в параграфе 3.6.3, для доставки сообщений некоторым получателям без ведома других адресатов этого сообщения. Некорректная обработка полей «Bcc:» может привоодить к утечке конфиденциальной информации, что, в свою очередь, может снижать уровень безопасности за счет распространения информации о существовании определенных почтовых адресов. Например, при использовании первого метода, описанного в параграфе 3.6.3, когда строка «Bcc:» удаляется из сообщения, скрытые получатели не имеют явного указания на то, что они были скрыты от других адресатов (за исключением того факта, что их адреса отсутствуют в заголовке сообщения). По этой причине кто-либо из скрытых получателей сообщения может отправить свой ответ всем показанным в заголовке получателям и непреднамеренно показать, что часть адресатов сообщения была скрыта. При использовании второго метода скрытые адресаты указываются в поле «Bcc:» отдельной копии сообщения. Если поле «Bcc:» содержит все скрытые адреса, получатели узнают о других скрытых адресатах. Даже при создании отдельного поля «Bcc:» для каждого скрытого адресата, реализациям следует с осторожностью относиться к обработке ответов на такие сообщения, как указано в параграфе 3.6.3, во избежание непреднамеренного распространения информации о скрытых получателях сообщения другим адресатам.

6. Согласование с IANA

Этот документ обновляет регистрации, перечисленные в [RFC4021], которые относятся к определениям из [RFC2822]. Агентство IANA обновило реестр Permanent Message Header Field Repository, включив в него в соответствии с [RFC3864] перечисленные ниже поля заголовков.

Имя поля: Date
Применимый протокол: Mail
Состояние: стандарт
Автор/контроль изменений: IETF
Спецификация: Данный документ (параграф 3.6.1)

Имя поля: From
Применимый протокол: Mail
Состояние: стандарт
Автор/контроль изменений: IETF
Спецификация: Данный документ (параграф 3.6.2)

Имя поля: Sender
Применимый протокол: Mail
Состояние: стандарт
Автор/контроль изменений: IETF
Спецификация: Данный документ (параграф 3.6.2)

Имя поля: Reply-To
Применимый протокол: Mail
Состояние: стандарт
Автор/контроль изменений: IETF
Спецификация: Данный документ (параграф 3.6.2)

Имя поля: To
Применимый протокол: Mail
Состояние: стандарт
Автор/контроль изменений: IETF
Спецификация: Данный документ (параграф 3.6.3)

Имя поля: Cc
Применимый протокол: Mail
Состояние: стандарт
Автор/контроль изменений: IETF
Спецификация: Данный документ (параграф 3.6.3)

Имя поля: Bcc
Применимый протокол: Mail
Состояние: стандарт
Автор/контроль изменений: IETF
Спецификация: Данный документ (параграф 3.6.3)

Имя поля: Message-ID
Применимый протокол: Mail
Состояние: стандарт
Автор/контроль изменений: IETF
Спецификация: Данный документ (параграф 3.6.4)

Имя поля: In-Reply-To
Применимый протокол: Mail
Состояние: стандарт
Автор/контроль изменений: IETF
Спецификация: Данный документ (параграф 3.6.4)

Имя поля: References
Применимый протокол: Mail
Состояние: стандарт
Автор/контроль изменений: IETF
Спецификация: Данный документ (параграф 3.6.4)

Имя поля: Subject
Применимый протокол: Mail
Состояние: стандарт
Автор/контроль изменений: IETF
Спецификация: Данный документ (параграф 3.6.5)

Имя поля: Comments
Применимый протокол: Mail
Состояние: стандарт
Автор/контроль изменений: IETF
Спецификация: Данный документ (параграф 3.6.5)

Имя поля: Keywords
Применимый протокол: Mail
Состояние: стандарт
Автор/контроль изменений: IETF
Спецификация: Данный документ (параграф 3.6.5)

Имя поля: Resent-Date
Применимый протокол: Mail
Состояние: стандарт
Автор/контроль изменений: IETF
Спецификация: Данный документ (параграф 3.6.6)

Имя поля: Resent-From
Применимый протокол: Mail
Состояние: стандарт
Автор/контроль изменений: IETF
Спецификация: Данный документ (параграф 3.6.6)

Имя поля: Resent-Sender
Применимый протокол: Mail
Состояние: стандарт
Автор/контроль изменений: IETF
Спецификация: Данный документ (параграф 3.6.6)

Имя поля: Resent-To
Применимый протокол: Mail
Состояние: стандарт
Автор/контроль изменений: IETF
Спецификация: Данный документ (параграф 3.6.6)

Имя поля: Resent-Cc
Применимый протокол: Mail
Состояние: стандарт
Автор/контроль изменений: IETF
Спецификация: Данный документ (параграф 3.6.6)

Имя поля: Resent-Bcc
Применимый протокол: Mail
Состояние: стандарт
Автор/контроль изменений: IETF
Спецификация: Данный документ (параграф 3.6.6)

Имя поля: Resent-Reply-To
Применимый протокол: Mail
Состояние: устарел
Автор/контроль изменений: IETF
Спецификация: Данный документ (параграф 4.5.6)

Имя поля: Resent-Message-ID
Применимый протокол: Mail
Состояние: стандарт
Автор/контроль изменений: IETF
Спецификация: Данный документ (параграф 3.6.6)

Имя поля: Return-Path
Применимый протокол: Mail
Состояние: стандарт
Автор/контроль изменений: IETF
Спецификация: Данный документ (параграф 3.6.7)

Имя поля: Received
Применимый протокол: Mail
Состояние: стандарт
Автор/контроль изменений: IETF
Спецификация: Данный документ (параграф 3.6.7)
Дополнительная информация: [RFC5321]

Приложение A. Примеры сообщений

В этом разделе представлены различные примеры сообщений. Примеры предназначены для оказания помощи разработчикам при реализации данной спецификации, но их не следует воспринимать как нормативы. Хотя примеры в этом разделе подобраны аккуратно, при возникновении противоречий между примером и текстом раздела 3 или 4 данного документа, предпочтение должно отдаваться спецификации, а не примеру.

Примеры сообщений отделены от текста строками «—-», которые не являются частью сообщений.

Приложение A.1. Примеры адресации

В этом параграфе приведены примеры сообщений, которыми могут обмениваться два индивидуальных адресата.

Приложение A.1.1. Сообщение от одного лица другому с простой адресацией

Этот пример можно назвать каноническим сообщением. Письмо имеет одного автора (John Doe), одного получателя (Mary Smith), тему, дату, идентификатор сообщения и текст в теле письма.

   ----
   From: John Doe <jdoe@machine.example>
   To: Mary Smith <mary@example.net>
   Subject: Saying Hello
   Date: Fri, 21 Nov 1997 09:55:06 -0600
   Message-ID: <1234@local.machine.example>

   This is a message just to say hello.
   So, "Hello".
   ----

Если у John есть секретарь Michael, который на самом деле отправляет сообщение, автором которого является по-прежнему John и ответы на письмо должны направляться секретарю, следует использовать поле sender:

   ----
   From: John Doe <jdoe@machine.example>
   Sender: Michael Jones <mjones@machine.example>
   To: Mary Smith <mary@example.net>
   Subject: Saying Hello
   Date: Fri, 21 Nov 1997 09:55:06 -0600
   Message-ID: <1234@local.machine.example>

   This is a message just to say hello.
   So, "Hello".
   ----

 

Приложение A.1.2. Различные типы почтовых ящиков

Это сообщение содержит множество адресов в полях получателей и использует иной формат адресов.

   ----
   From: "Joe Q. Public" <john.q.public@example.com>
   To: Mary Smith <mary@x.test>, jdoe@example.org, Who? <one@y.test>
   Cc: <boss@nil.test>, "Giant; \"Big\" Box" <sysservices@example.net>
   Date: Tue, 1 Jul 2003 10:52:37 +0200
   Message-ID: <5678.21-Nov-1997@example.com>

   Hi everyone.
   ----

Отметим, что отображаемые имена Joe Q. Public и Giant; «Big» Box требуется заключать в двойные кавычки, поскольку первое имя включает точку, а во втором содержится точка с запятой и символы двойных кавычек (в форме пар с квотированием). Отображаемое имя Who?, напротив, может использоваться без кавычек, поскольку в атомах допускается использование вопросительного знака. Отметим также, что в адресах jdoe@example.org и boss@nil.test не указаны связанные с ними отображаемые имена, а для адреса jdoe@example.org используется упрощенная форма без угловых скобок.

Приложение A.1.3. Групповые адреса

   ----
   From: Pete <pete@silly.example>
   To: A Group:Ed Jones <c@a.test>,joe@where.test,John <jdoe@one.test>;
   Cc: Undisclosed recipients:;
   Date: Thu, 13 Feb 1969 23:32:54 -0330
   Message-ID: <testabcd.1234@silly.example>

   Testing.
   ----

В этом примере поле «To:» включает группу «A Group», в состав которой входят 3 адреса, а в поле «Cc:» указана пустая группы получателей Undisclosed recipients (нераскрытые получатели).

Приложение A.2. Ответные сообщения

Следующая группа из трех примеров показывает поток обмена сообщениями между John и Mary. Сначала John отправляет сообщение Mary, на которое Mary отвечает и John в ответ отправляет письмо Mary.

Отметим специально поля «Message-ID:», «References:» и «In-Reply-To:» в каждом сообщении.

   ----
   From: John Doe <jdoe@machine.example>
   To: Mary Smith <mary@example.net>
   Subject: Saying Hello
   Date: Fri, 21 Nov 1997 09:55:06 -0600
   Message-ID: <1234@local.machine.example>

   This is a message just to say hello.
   So, "Hello".
   ----

При отправке ответов поле Subject зачастую сохраняется с добавлением префикса «Re: », как описано в параграфе 3.6.5.

   ----
   From: Mary Smith <mary@example.net>
   To: John Doe <jdoe@machine.example>
   Reply-To: "Mary Smith: Personal Account" <smith@home.example>
   Subject: Re: Saying Hello
   Date: Fri, 21 Nov 1997 10:01:10 -0600
   Message-ID: <3456@example.net>
   In-Reply-To: <1234@local.machine.example>
   References: <1234@local.machine.example>

   This is a reply to your hello.
   ----

Отметим поле «Reply-To:» в приведенном выше сообщении. Когда John отвечает на приведенное выше письмо Mary, ответ следует направлять по адресу из поля «Reply-To:», а не по адресу из поля «From:».

   ----
   To: "Mary Smith: Personal Account" <smith@home.example>
   From: John Doe <jdoe@machine.example>
   Subject: Re: Saying Hello
   Date: Fri, 21 Nov 1997 11:00:00 -0600
   Message-ID: <abcd.1234@local.machine.test>
   In-Reply-To: <3456@example.net>
   References: <1234@local.machine.example> <3456@example.net>

   This is a reply to your reply.
   ----

 

Приложение A.3. Пересылка сообщений

Начнем с сообщения, которое будет использоваться в качестве примера несколько раз:

   ----
   From: John Doe <jdoe@machine.example>
   To: Mary Smith <mary@example.net>
   Subject: Saying Hello
   Date: Fri, 21 Nov 1997 09:55:06 -0600
   Message-ID: <1234@local.machine.example>

   This is a message just to say hello.
   So, "Hello".
   ----

Mary, получив это сообщение, хочет отправить копию Jane так, что (a) сообщение выглядит, как отправленное John; (b) если Jane ответит на это сообщение, ответ должен быть отправлен John; (c) вся исходная информация, включая дату письма, изначално посланного Mary, идентификатор сообщения и исходный адрес сохраняется. В этом случае в начало сообщения добавляются поля пересылки:

   ----
   Resent-From: Mary Smith <mary@example.net>
   Resent-To: Jane Brown <j-brown@other.example>
   Resent-Date: Mon, 24 Nov 1997 14:22:01 -0800
   Resent-Message-ID: <78910@example.net>
   From: John Doe <jdoe@machine.example>
   To: Mary Smith <mary@example.net>
   Subject: Saying Hello
   Date: Fri, 21 Nov 1997 09:55:06 -0600
   Message-ID: <1234@local.machine.example>

   This is a message just to say hello.
   So, "Hello".
   ----

 

Если Jane, в свою очередь, решит переслать сообщение еще кому-либо, она будет добавлять свои поля пересылки перед сообщением, показанным выше (для краткости этот вариант примера опущен).

Приложение A.4. Сообщения с полями трассировки

При пересылке сообщения через транспортную систему, как описано в [RFC5321], в начало сообщения добавляются трассировочные поля. Ниже приведен пример, показывающий, как могут выглядеть эти поля. Отметим, что первая строка «Received:» оказалась слишком длинной и в нее включены фальцовочные пробелы.

   ----
   Received: from x.y.test
      by example.net
      via TCP
      with ESMTP
      id ABC12345
      for <mary@example.net>;  21 Nov 1997 10:05:43 -0600
   Received: from node.example by x.y.test; 21 Nov 1997 10:01:22 -0600
   From: John Doe <jdoe@node.example>
   To: Mary Smith <mary@example.net>
   Subject: Saying Hello
   Date: Fri, 21 Nov 1997 09:55:06 -0600
   Message-ID: <1234@local.node.example>

   This is a message just to say hello.
   So, "Hello".
   ----

Приложение A.5. Пробелы, комментарии и другие странности

Пробеля, включая фальцовочные, и комментарии могут вставляться между разными элементами поля. Возьмем пример из параграфа A.1.3 и добавим в него пробелы и комментарии в полях заголовка.

   ----
   From: Pete(A nice \) chap) <pete(his account)@silly.test(his host)>
   To:A Group(Some people)
        :Chris Jones <c@(Chris's host.)public.example>,
            joe@example.org,
     John <jdoe@one.test> (my dear friend); (the end of the group)
   Cc:(Empty list)(start)Hidden recipients  :(nobody(that I know))  ;
   Date: Thu,
         13
           Feb
             1969
         23:32
                  -0330 (Newfoundland Time)
   Message-ID:              <testabcd.1234@silly.test>

   Testing.
   ----

Приведенный пример выглядит странновато, но является совершенно допустимым. Отметим специально (1) комментарий в поле «From:» (включая скобку в паре с квотированием); (2) отсутствие пробела после двоеточия в поле «To:», а также комментарий и фальцовочные пробелы после имени группы, специальный символ (.) в комментарии поля с адресом Chris Jones и фальцовочные пробелы перед и после «joe@example.org,»; (3) множество вложенных комментариев в поле «Cc:», а также комментарий, следующий непосредственно за двоеточием после «Cc»; (4) фальцовочный пробел (но не комментарии, за исключением комментария в конце поля даты), а также отсутствие значения секунд; (5) пробелы после (но не внутри) идентификатора в поле «Message-ID:».

Приложение A.6. Устаревшие формы

Здесь приведены примеры устаревших синтаксических элементов (которые недопустимо создавать), описанных в разделе 4 данного документа.

Приложение A.6.1. Устаревшая адресация

Отметим в приведенном ниже примере отсутствие кавычек вокруг Joe Q. Public, маршрут в адресе Mary Smith, две запятых в поле «To:» и пробелы рябом с точкой в адресе jdoe.

   ----
   From: Joe Q. Public <john.q.public@example.com>
   To: Mary Smith <@node.test:mary@example.net>, , jdoe@test  . example
   Date: Tue, 1 Jul 2003 10:52:37 +0200
   Message-ID: <5678.21-Nov-1997@example.com>

   Hi everyone.
   ----

Приложение A.6.2. Устаревшие даты

В приведенном ниже сообщении используется устаревший формат даты, включая символьное представление часового пояса и 2-значное обозначение года. Отметим, что отсутствие дня недели не является спецификой устаревшего синтаксиса — это поле является опциональным и в современном синтаксисе.

   ----
   From: John Doe <jdoe@machine.example>
   To: Mary Smith <mary@example.net>
   Subject: Saying Hello
   Date: 21 Nov 97 09:55:06 GMT
   Message-ID: <1234@local.machine.example>

   This is a message just to say hello.
   So, "Hello".
   ----

Приложение A.6.3. Устаревшие пробелы и комментарии

Наличие пробелов и комментариев в устаревшем синтаксисе разрешается в большем числе мест, нежели позволяет современный синтаксис. Однако фальцовочные строки, содержащие только пробелы, по прежнему допускаются.

   ----
   From  : John Doe <jdoe@machine(comment).  example>
   To    : Mary Smith
   __
             <mary@example.net>
   Subject     : Saying Hello
   Date  : Fri, 21 Nov 1997 09(comment):   55  :  06 -0600
   Message-ID  : <1234   @   local(blah)  .machine .example>

   This is a message just to say hello.
   So, "Hello".
   ----

Особо отметим вторую строку поля «To:», начинающуюся с двух пробельных символов. (отметим, «__» представляет пробелы). Следовательно, это является рассматриваемой частью фальцовки, как описано в параграфе 4.2. Комментарии и пробелы в адресах, датах и идентификаторах сообщений являются частью устаревшего синтаксиса.

Приложение B. Отличия от ранних спецификаций

В этом приложении приведен список отличий формата сообщений Internet (IMF) от более ранних спецификаций, в частности [RFC0822], [RFC1123] и [RFC2822]. Элементы, отмеченные в списке звездочкой (*), относятся к описанным в разделе 4 данного документа устаревшим элементам, и в настоящее время они не должны создаваться.

Ниже перечислены изменения [RFC0822] и [RFC1123], внесенные в [RFC2822] и сохраненные здесь:

  1. Допускается использование точки в устаревшей форме фраз.
  2. Описание ABNF исключено из документа (в настоящее время оно содержится в [RFC5234]).
  3. В поле года разрешается использовать 4 и более цифр.
  4. Порядок полей заголовка (и отсутствие такового) указан явно.
  5. Удалено шифрованное поле заголовка.
  6. Явно разрешено обозначение часового пояса «-0000» и описано его значение.
  7. Не разрешается использовать фальцовочные пробелы между любыми лексемами.
  8. Снято требование относительно получателей.
  9. Заново определены понятия пересылки (forwarding и resending).
  10. Расширенные поля заголовка больше не вызываются специфически.
  11. Отменено использование символа ASCII 0 (null).*
  12. Строки продолжения фальцовки не могут содержать только пробелы.*
  13. Не разрешается произвольная вставка комментариев в даты.*
  14. Не разрешаются символьные обозначения часовых поясов.*
  15. Не разрешается двухзначное представление года.*
  16. Трехзначное представление года интерпретируется, но не должно использоваться.*
  17. Не разрешается включать маршруты в адреса.*
  18. Не разрешается использовать CFWS в локальной и доменной части адреса.*
  19. Не разрешается использование пустых элементов в списках адресов.*
  20. Не разрешается использование фальцовочных пробелов между именем поля и двоеточием.*
  21. Не разрешается использование комментариев между именем поля и двоеточием.
  22. Более жестко задан синтаксис in-reply-to и references.*
  23. Не разрешается использование CFWS в msg-id.*
  24. Семантика полей resent отнесена исключительно к информационной.
  25. Не разрешается использовать Resent-Reply-To.*
  26. Не разрешается повторение полей (за исключением resent и received).*
  27. Не разрешается использование символов CR и LF по-отдельности.*
  28. Задано ограничение на размер строк.
  29. Разъяснено назначение поля Bcc.

Далее перечислены отличия настоящего документа от [RFC2822].

  1. Исправлены найденные опечатки и приведены разъяснения.
  2. Термин «стандарт» применительно к данному документу заменен на «документ» или «спецификация».
  3. Разделены понятия «поле заголовка» (header field) и «раздел заголовков» (header section).
  4. Удалено NO-WS-CTL из ctext, qtext, dtext и бесструктурных полей.*
  5. Исправлено обсуждение специальных символов (specials) в параграфе «Atom». Текст перенесен в параграф «3.5. Общий синтаксис сообщений».
  6. Упрощен синтаксис CFWS.
  7. Исправлен синтаксис бесструктурных полей.
  8. Изменен синтаксис полей даты и времени в части пробелов в устаревшем синтаксисе дат.
  9. Удалены пары с квотированием из доменных литералов и идентификаторов сообщений.*
  10. Разъяснены ограничения других спецификаций для синтаксиса доменных имен.
  11. Упрощен синтаксис «Bcc:» и «Resent-Bcc:».
  12. Разрешено включение дополнительного поля в трассировачную информацию.
  13. Удалено no-fold-quote из msg-id. Разъяснены синтаксические ограничения.
  14. Обобщен синтаксис «Received:» для исправления ошибок и удаления определения из данного документа.
  15. Упрощено obs-qp. Исправлено и обобщено obs-utext (появляется не только в устаревшем синтаксисе). Удалены obs-text и obs-char, добавлено obs-body.
  16. Исправлен устаревший синтаксис дат, чтобы разрешить больше (или меньше) комментариев и пробелов.
  17. Исправлен синтаксис всех устаревших списков (obs-domain-list, obs-mbox-list, obs-addr-list, obs-phrase-list и вновь добавленный obs-group-list).
  18. Исправлен синтаксис obs-reply-to.
  19. Исправлены obs-bcc и obs-resent-bcc, чтобы разрешить пустые списки.
  20. Удалено obs-path.

Приложение C. Благодарности

В создании этого документа участвовало множество людей. В их число входят участники рабочей группы Detailed Revision and Update of Messaging standards (DRUMS) под эгидой IETF, председатель DRUMS, руководители направления (Area Directors) IETF и все, кто просто присылал свои комментарии по электронной почте. Редактор документа выражает всем этим людям глубокую благодарность и искреннюю признательность. Ниже приведен список всех людей, которые присылали по электронной почте свои комментарии к данному документу и [RFC2822].

Matti Aarnio

Tanaka Akira

Russ Allbery

Eric Allman

Harald Alvestrand

Ran Atkinson

Jos Backus

Bruce Balden

Dave Barr

Alan Barrett

John Beck

J Robert von Behren

Jos den Bekker

D J Bernstein

James Berriman

Oliver Block

Norbert Bollow

Raj Bose

Antony Bowesman

Scott Bradner

Randy Bush

Tom Byrer

Bruce Campbell

Larry Campbell

W J Carpenter

Michael Chapman

Richard Clayton

Maurizio Codogno

Jim Conklin

R Kelley Cook

Nathan Coulter

Steve Coya

Mark Crispin

Dave Crocker

Matt Curtin

Michael D’Errico

Cyrus Daboo

Michael D Dean

Jutta Degener

Mark Delany

Steve Dorner

Harold A Driscoll

Michael Elkins

Frank Ellerman

Robert Elz

Johnny Eriksson

Erik E Fair

Roger Fajman

Patrik Faeltstroem

Claus Andre Faerber

Barry Finkel

Erik Forsberg

Chuck Foster

Paul Fox

Klaus M Frank

Ned Freed

Jochen Friedrich

Randall C Gellens

Sukvinder Singh Gill

Tim Goodwin

Philip Guenther

Arnt Gulbrandsen

Eric A Hall

Tony Hansen

John Hawkinson

Philip Hazel

Kai Henningsen

Robert Herriot

Paul Hethmon

Jim Hill

Alfred Hoenes

Paul E Hoffman

Steve Hole

Kari Hurtta

Marco S Hyman

Ofer Inbar

Olle Jarnefors

Kevin Johnson

Sudish Joseph

Maynard Kang

Prabhat Keni

John C Klensin

Graham Klyne

Brad Knowles

Shuhei Kobayashi

Peter Koch

Dan Kohn

Christian Kuhtz

Anand Kumria

Steen Larsen

Eliot Lear

Barry Leiba

Jay Levitt

Bruce Lilly

Lars-Johan Liman

Charles Lindsey

Pete Loshin

Simon Lyall

Bill Manning

John Martin

Mark Martinec

Larry Masinter

Denis McKeon

William P McQuillan

Alexey Melnikov

Perry E Metzger

Steven Miller

S Moonesamy

Keith Moore

John Gardiner Myers

Chris Newman

John W Noerenberg

Eric Norman

Mike O’Dell

Larry Osterman

Paul Overell

Jacob Palme

Michael A Patton

Uzi Paz

Michael A Quinlan

Robert Rapplean

Eric S Raymond

Sam Roberts

Hugh Sasse

Bart Schaefer

Tom Scola

Wolfgang Segmuller

Nick Shelness

John Stanley

Einar Stefferud

Jeff Stephenson

Bernard Stern

Peter Sylvester

Mark Symons

Eric Thomas

Lee Thompson

Karel De Vriendt

Matthew Wall

Rolf Weber

Brent B Welch

Dan Wing

Jack De Winter

Gregory J Woodhouse

Greg A Woods

Kazu Yamamoto

Alain Zahm

Jamie Zawinski

Timothy S Zurcher

7. Литература

7.1. Нормативные документы

[ANSI.X3-4.1986] American National Standards Institute, «Coded Character Set — 7-bit American Standard Code for Information Interchange», ANSI X3.4, 1986.

[RFC1034] Mockapetris, P., «Domain names — concepts and facilities», STD 13, RFC 1034, November 1987.

[RFC1035] Mockapetris, P., «Domain names — implementation and specification», STD 13, RFC 1035, November 1987.

[RFC1123] Braden, R., «Requirements for Internet Hosts — Application and Support», STD 3, RFC 1123, October 1989.

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, March 1997.

[RFC5234] Crocker, D. and P. Overell, «Augmented BNF for Syntax Specifications: ABNF», STD 68, RFC 5234, January 2008.

7.2. Дополнительные ссылки

[RFC0822] Crocker, D., «Standard for the format of ARPA Internet text messages», STD 11, RFC 822, August 1982.

[RFC1305] Mills, D., «Network Time Protocol (Version 3) Specification, Implementation», RFC 1305, March 1992.

[ISO.2022.1994] International Organization for Standardization, «Information technology — Character code structure and extension techniques», ISO Standard 2022, 1994.

[RFC2045] Freed, N. and N. Borenstein, «Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies», RFC 2045, November 1996.

[RFC2046] Freed, N. and N. Borenstein, «Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types», RFC 2046, November 1996.

[RFC2047] Moore, K., «MIME (Multipurpose Internet Mail Extensions) Part Three: Message Header Extensions for Non-ASCII Text», RFC 2047, November 1996.

[RFC2049] Freed, N. and N. Borenstein, «Multipurpose Internet Mail Extensions (MIME) Part Five: Conformance Criteria and Examples», RFC 2049, November 1996.

[RFC2822] Resnick, P., «Internet Message Format», RFC 2822, April 2001.

[RFC3864] Klyne, G., Nottingham, M., and J. Mogul, «Registration Procedures for Message Header Fields», BCP 90, RFC 3864, September 2004.

[RFC4021] Klyne, G. and J. Palme, «Registration of Mail and MIME Header Fields», RFC 4021, March 2005.

[RFC4288] Freed, N. and J. Klensin, «Media Type Specifications and Registration Procedures», BCP 13, RFC 4288, December 2005.

[RFC4289] Freed, N. and J. Klensin, «Multipurpose Internet Mail Extensions (MIME) Part Four: Registration Procedures», BCP 13, RFC 4289, December 2005.

[RFC5321] Klensin, J., «Simple Mail Transfer Protocol», RFC 5321, October 2008.

Адрес автора

Peter W. Resnick (редактор)

Qualcomm Incorporated

5775 Morehouse Drive

San Diego, CA 92121-1714

US

Phone: +1 858 651 4478

EMail: presnick@qualcomm.com

URI: http://www.qualcomm.com/~presnick/


Перевод на русский язык

Николай Малых

nmalykh@protokols.ru

Полное заявление авторских прав

Copyright (C) The IETF Trust (2008).

К этому документу применимы права, лицензии и ограничения, указанные в BCP 78, и, за исключением указанного там, авторы сохраняют свои права.

Этот документ и содержащаяся в нем информация представлены «как есть» и автор, организация, которую он/она представляет или которая выступает спонсором (если таковой имеется), Internet Society и IETF отказываются от каких-либо гарантий (явных или подразумеваемых), включая (но не ограничиваясь) любые гарантии того, что использование представленной здесь информации не будет нарушать чьих-либо прав, и любые предполагаемые гарантии коммерческого использования или применимости для тех или иных задач.

Интеллектуальная собственность

IETF не принимает какой-либо позиции в отношении действительности или объема каких-либо прав интеллектуальной собственности (Intellectual Property Rights или IPR) или иных прав, которые, как может быть заявлено, относятся к реализации или использованию описанной в этом документе технологии, или степени, в которой любая лицензия, по которой права могут или не могут быть доступны, не заявляется также применение каких-либо усилий для определения таких прав. Сведения о процедурах IETF в отношении прав в документах RFC можно найти в BCP 78 и BCP 79.

Копии раскрытия IPR, предоставленные секретариату IETF, и любые гарантии доступности лицензий, а также результаты попыток получить общую лицензию или право на использование таких прав собственности разработчиками или пользователями этой спецификации, можно получить из сетевого репозитория IETF IPR по ссылке http://www.ietf.org/ipr.

IETF предлагает любой заинтересованной стороне обратить внимание на авторские права, патенты или использование патентов, а также иные права собственности, которые могут потребоваться для реализации этого стандарта. Информацию следует направлять в IETF по адресу ietf-ipr@ietf.org.


1Internet Message Format.

2Стандарт для формата текстовых сообщений ARPA Internet.

3Augmented Backus-Naur Form — расширенная форма Бэкуса-Наура.

4В этом документе сказано, что сообщения создаются с использованием только символов US-ASCII с кодами от 1 до 127. Существуют другие документы (в частности, серия документов MIME [RFC2045], [RFC2046], [RFC2047], [RFC2049], [RFC4288], [RFC4289]), расширяющие данную спецификацию в части диапазона используемых в сообщениях символов. Обсуждение таких механизмов расширения выходит за пределы данной спецификации.

5В разговорной практике и ранних версиях спецификации термин «заголовок» используется для обозначения всего раздела заголовков или отдельных полей заголовков. Во избежание путаницы в этом документе для обозначения отдельных полей используется термин «поле заголовка», а для обозначения заголовка сообщения в целом служит термин «раздел заголовков».

6White space characters — WSP.

7Как указано выше, существует ряд документов (в частности, серия MIME [RFC2045], [RFC2046], [RFC2049], [RFC4288], [RFC4289]), расширяющих (и ограничивающих) данную спецификацию в части содержимого сообщений. Отметим еще раз, что такие механизмы выходят за пределы спецификации.

8Читателям следует обратить особое внимание на способы использования этих лексем в синтаксисе верхнего и нижнего уровня в оставшейся части документа. В частности, лексемы пробельных символов и комментариев, определенные в параграфе 3.2.2, будут использоваться в определенных здесь лексемах нижнего уровня, которые, в свою очередь, используются в определенных ниже лексемах верхнего уровня. Следовательно, пробельные символы и комментарии могут включаться в лексемы верхнего уровня, даже в тех случаях, когда они явно не указаны в конкретном определении.

9Символ \ может появляться в сообщении и как обычный символ (не элемент пары с квотированием). В этом случае символ \ не является семантически невидимым. В данной данной спецификации символ \, как таковой появляется только в описаниях ccontent, qcontent и obs-dtext.

10Folding white space.

11Лексема specials не используется в данной спецификации. Это просто видимые символы (т. е., не управляющие коды и не пробелы), которые не появляются в atext. Появление таких лексем обусловлено их полезностью для реализаций, использующих инструменты лексического анализа сообщений. Каждый символ в specials может использоваться для индикации точки маркировки при лексическом анализе.

12Coordinated Universal Time — скоординированное универсальное время.

13Greenwich Mean Time — время по Гринвичу.

14Синтаксис ABNF для каждого поля в последующих подпараграфах содержит двоеточие после имени поля. Однако для краткости двоеточия могут не упоминаться в текстовом описании синтаксиса. В любом случае двоеточия обязательны.

15Информация о передающем сообщение лице (системе) присутствует всегда. Отсутствие поля «Sender:» иногда ошибочно трактуется, как отсутствие информации об агенте, ответственном за передачу сообщения. Реально отсутствие этого поля означает лишь совпадение отправителя и автора, что позволяет избавиться от ненужного дублирования информации в поле «Sender:».

16Некоторые реализации анализируют поле «References:» для вывода информации о «течении дискуссии». Такие реализации предполагают, что каждое новое сообщение является ответом только на одно родительское письмо и, следовательно, они способны обеспечить обратную трассировку поля «References:» для нахождения «родителя» каждого перечисленного здесь сообщения. Следовательно, попытки формирования поля «References:» для ответа на множество сообщений сразу, являются недопустимыми; рассмотрение этого вопроса выходит за рамки документа.

17Повторный ввод сообщения в транспортную систему и использование полей пересылки отличаются от операции «forwarding» (пересылка). В последней используется два сообщения — суть этой операции заключается в том, что пользователь почтовой программы, получивший сообщение, может отправить копию этого сообщения другому лицу, которое в результате получает новое сообщение («копию»). Пересланное таким способом сообщение приходит не от исходного отправителя, а от того, кто принял решение о его пересылки и является, по сути дела, новым сообщением. Пересылка может заключаться также в приеме сообщения почтовой транспортной системой и отправке его в другое место для окончательной доставки. Поля пересылки не предназначены для использования при такой пересылке.

18Точка в obs-phrase не являлась допустимой в ранних версиях этой и всех других спецификаций. Точка (а не какой-либо другой символ из числа специальных) не допускалась во фразах, поскольку она при разборе создавала трудности в дифференциации фраз и частей в addr-spec (см. параграф 4.4). Здесь точка добавляется по той причине, что в настоящее время этот символ используется во множестве сообщений в поле отображаемого имени для адресов (особенно, в инициалах) и, следовательно, должен корректно интерпретироваться.

Рубрика: RFC | Оставить комментарий

RFC 5321 Simple Mail Transfer Protocol

Network Working Group                                     J. Klensin
Request for Comments: 5321                              October 2008
Obsoletes: 2821
Updates: 1123
Category: Standards Track

Простой протокол передачи электронной почты (SMTP)

Simple Mail Transfer Protocol

PDF

Статус документа

Это документ содержит проект стандарта протокола Internet для сообщества Internet и служит приглашением к дискуссии в целях развития и совершенствования протокола. Текущее состояние стандартизации и статус протокола можно узнать из текущей версии документа Internet Official Protocol Standards (STD 1). Допускается свободное распространение документа.

Аннотация

Этот документ является спецификацией базового протокола доставки электронной почты Internet. Документ консолидирует, обновляет и проясняет несколько предшествующих документов, отменяя их полностью или частично. Документ включает механизмы расширения SMTP и обобщение накопленного опыта для современного состояния Internet, но не содержит деталей отдельных расширений протокола. Хотя протокол SMTP разработан для обеспечения почтового транспорта и доставки, в данной спецификации содержится также информация, которая важна для протокола подачи сообщений в пользовательских почтовых агентах чтения почты и мобильных средах.

1. Введение

1.1. Транспортировка электронной почты

Целью протокола SMTP1 является обеспечение надежной и эффективной доставки электронной почты.

Протокол SMTP не зависит от конкретных подсистем передачи и требует для работы лишь канал с гарантированной и упорядоченной доставкой потока данных. Хотя в этом документе обсуждается использование транспорта TCP, возможно использование и других транспортных протоколов. Описания некоторых протоколов этого типа даны в приложениях к RFC 821 [1].

Важным свойством протокола SMTP является возможность транспортировки почты через множество сетей, которые обычно называют «почтовыми трансляторами SMTP»2 (см. параграф 3.6). Сети состоят из обоюдно доступных по протоколу TCP хостов публичной сети Internet, обоюдно доступных по TCP хостов приватных сетей TCP/IP, находящихся на межсетевыми экранами, или хостов некоторых иных локальных и распределенных сред, использующих на транспортном уровне протоколы, отличные от TCP. Используя протокол SMTP, процесс может передавать почту другому процессу в той же сети или некоторых других сетях через трансляторы или шлюзы, доступные из обеих сетей.

Таким путем почтовые сообщения можно передавать через множество промежуточных трансляторов (relay) или шлюзов на пути между отправителем и конечным адресатом. Для определения следующего промежуточного получателя (next-hop) на пути к адресату используется механизм Mail eXchanger (MX) системы доменных имен (RFC 1035 [2], RFC 974 [12], раздел 5 данного документа).

1.2. Предыстория и контекст документа

Документ содержит спецификацию базового протокола передачи электронной почты в сети Internet. Документ консолидирует, обновляет и разъясняет перечисленные ниже спецификации, не изменяя их функциональности:

  • исходная спецификация SMTP (Simple Mail Transfer Protocol) — RFC 821 [1];
  • требования к системе доменных имен и ее использованию для передачи электронной почты — RFC 1035 [2] и RFC 974 [12];
  • пояснения и вопросы применимости RFC 1123 [3];
  • материалы из механизмов расширения SMTP Extension — RFC 1869 [13];
  • редакторские правки и разъяснения к RFC 2821 [14] для повышения статуса до Draft Standard.

Данный документ отменяет действие RFC 821, RFC 974, RFC 1869, RFC 2821 и обновляет RFC 1123 (замена материалов по доставке электронной почты в RFC 1123). Однако в RFC 821 приведены спецификации некоторых свойств, которые не стали достаточно значимыми в среде Internet середины 1990-х, и (в приложениях) некоторые дополнительные транспортные модели. Эти разделы опущены здесь с целью снижения объема документа, интересующиеся читатели могут обратиться к RFC 821.

Документ также включает некоторые дополнительные материалы из RFC 1123, которые требовалось усилить. Такие материалы определены разными путями — прежде всего просмотром популярных списков рассылки и телеконференций, а также идентификацией проблем и разночтений, которые появлялись в разрабатываемых расширениях SMTP. В тех случаях, где настоящая спецификация выходит за пределы консолидации сведений из более ранних документов и реально отличается от них, приведенные здесь сведения имеют более высокий приоритет, как в техническом, так и в текстовом отношении.

Хотя SMTP разрабатывался как протокол транспортировки и доставки электронной почты, данная спецификация содержит также информацию, которая важна для использования протокола в качестве средства представления сообщений3, как рекомендовано спецификациями протоколов POP4 (RFC 937 [15], RFC 1939 [16]) и IMAP (RFC 3501 [17]). В общем случае предпочтительно использовать для представления почтовых сообщений отдельный протокол, описанный в RFC 4409 [18]; далее в документе этот вопрос рассматривается более подробно.

В параграфе 2.3 приводятся определения специфических для данного документа терминов. За исключением тех случаев, когда исторически сложившаяся терминология нужна для понимания, в данном документе применяются современные трактовки терминов «клиент» и «сервер» для обозначения передающих и принимающих процессов SMTP, соответственно.

В дополнительном документе RFC 5322 [4] обсуждаются разделы заголовков и тел почтовых сообщений, а также их структура и форматы.

1.3. Соглашение о терминах

Ключевые слова необходимо (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не нужно (SHALL NOT), следует (SHOULD), не следует (SHOULD NOT), рекомендуется (RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе интерпретируются в соответствии с RFC 2119 [5]. Такие термины в документе используются очень аккуратно в целях повышения уровня взаимодействия систем электронной почты. Каждое использование таких терминов должно трактоваться как уровень требований в части соответствия данной спецификации.

Поскольку этот документ имеет длинную предысторию, во избежание возникновения ошибок и заблуждений у читателей, большая часть примеров и упомянутых в них доменных имен заимствована из RFC 2821. Читателям следует быть осторожными с приведенными примерами и не использовать их напрямую в программном коде или конфигурационных файлах.

2. Модель SMTP

2.1. Базовая структура

Структура SMTP показана на рисунке.

            +----------+                +----------+
+------+    |          |                |          |
|Польз.|<-->|          |Команды/отклики |          |
+------+    |  Клиент  |      SMTP      |  Сервер  |
+------+    |   SMTP   |<-------------->|   SMTP   |    +------+
|Файлов|<-->|          |    и почта     |          |<-->|Файлов|
| сист.|    |          |                |          |    | сист.|
+------+    +----------+                +----------+    +------+
             Клиент SMTP                 Сервер SMTP

Когда у клиента SMTP имеется сообщение для передачи, он организует двухсторонний канал связи с сервером SMTP. Клиент SMTP отвечает за доставку почтовых сообщений одному или множеству серверов SMTP или возврат сообщения об отказе.

Способ представления почтовых сообщений клиенту SMTP и способ определения клиентом идентификаторов (имен) доменов, в которые данное сообщение будет передаваться, определяются локальными условиями и не рассматриваются в этом документе. В некоторых случаях указанный или определенный клиентом SMTP домен идентифицирует конечного получателя сообщения. В других случаях, когда клиенты SMTP связаны с реализациями протоколов POP (RFC 937 [15], RFC 1939 [16]) или IMAP (RFC 3501 [17]) или клиент располагается внутри изолированной транспортной среды, идентифицированный домен будет определять промежуточного получателя, через которого будут транслироваться все почтовые сообщения. Клиенты SMTP, которые передают весь трафик, независимо от домена адресата, связанного с конкретным сообщением, или не поддерживают очередей для повтора попыток передачи сообщений при неудаче, могут соответствовать данной спецификации, но не обеспечивать всех возможностей. Предполагается, что полнофункциональные реализации SMTP, включая трансляторы, которые используются неполными системами и их получателями, будут поддерживать очереди, повторы и альтернативную адресацию, рассматриваемые в данном документе. Во многих случаях упомянутым выше неполнофункциональным клиентам следует использовать протокол представления сообщений (RFC 4409 [18]) взамен SMTP.

Способ, с помощью которого клиент SMTP после определения домена адресата, находит сервер SMTP для передачи сообщения, а также процесс передачи определяются данной спецификацией. Для передачи почты SMTP-серверу клиент SMTP организует двухсторонний канал связи с сервером. SMTP-клиент определяет адрес подходящего хоста, на котором работает сервер SMTP, преобразуя доменное имя получателя в MX-запись (Mail exchanger) промежуточного или конечного хоста-получателя.

Сервер SMTP может быть конечным или промежуточным транслятором5 (после приема письма сервер выполняет функции клиента SMTP, пересылая сообщение дальше) или шлюзом6 (может передавать сообщение дальше, используя отличный от SMTP протокол). Команды SMTP генерируются клиентом SMTP и передаются серверу SMTP. Сервер SMTP передает отклики в ответ на команды клиента SMTP.

Иными словами, передача сообщения может осуществляться в один прием путем соединения исходного отправителя SMTP с конечным получателем SMTP или через цепочку промежуточных систем. В любом случае после того, как сервер сообщил об успешном завершении операции в конце передачи почтовых данных, происходит формальная передача ответственности — в соответствии с требованиями протокола сервер должен принять на себя ответственность за доставку сообщения или должным образом предоставить отчет о невозможности доставки (см. параграфы 6.1, 6.2 и 7.8 ниже).

После организации коммуникационного канала и согласования параметров клиент SMTP обычно инициирует почтовую транзакцию. Такая транзакция состоит из последовательности команд, задающих отправителя и получателя сообщения, а также передачи содержимого письма (включая все заголовки и прочие структуры). Если одно сообщение передается множеству адресатов, разумно передавать одну копию сообщения для всех получателей, доставка которым осуществляется на один хост или через один промежуточный транслятор.

Сервер обеспечивает отклик на каждую полученную команду – отклик может показывать восприятие команды (в таких случаях ожидаются дополнительные команды), а также содержать сообщение о временной или постоянной ошибке. Команды, задающие отправителя или получателей, могут включать поддерживаемые сервером SMTP расширения, описанные в параграфе 2.2. Диалог между клиентом и сервером осуществляется поэтапно (команда – отклик – команда …), хотя можно использовать по взаимному согласию конвейерную обработку (RFC 2920 [19]).

После завершения передачи сообщения клиент может запросить разрыв соединения или инициировать следующую почтовую транзакцию. Кроме того, клиент SMTP может использовать соединение с сервером для доступа к дополнительному сервису типа проверки корректности почтовых адресов или получения адресов из списка рассылок.

Как сказано выше, протокол обеспечивает механизм передачи электронной почты. Эта передача обычно осуществляется непосредственно с хоста отправителя на хост получателя, когда оба хоста используют один транспортный сервис. Если же хосты не подключены к общей транспортной системе, передача осуществляется с использованием одного или нескольких промежуточных серверов SMTP. Сегодня в Internet обычной практикой является представление исходного сообщения промежуточному серверу «представления сообщений»7, который похож на транслятор, но выполняет некоторые дополнительные функции; такие серверы рассматриваются в параграфе 2.3.10 и RFC 4409 [18]. Промежуточный хост в таких случаях действует как транслятор (SMTP relay) или шлюз в другие среды передачи и выбирается обычно с использованием MX-записей DNS (служба доменных имен).

Обычно промежуточные хосты определяются по записям DNS MX, а не путем явного задания маршрута отправителем (см. раздел 5, приложение C и параграф F.2).

2.2. Модель расширений

2.2.1. Базовые вопросы

В рамках программы, начатой в 1990, приблизительно через 10 лет после выпуска RFC 821, протокол был обновлен за счет добавления модели «расширения услуг»8, позволяющей клиентам и серверам согласовать использование общих функций, выходящих за пределы исходной спецификации SMTP. Механизм расширения SMTP определяет способ согласования расширенных возможностей клиента и сервера SMTP; сервер может информировать клиента о поддерживаемых расширениях.

Современные реализации SMTP должны поддерживать базовые механизмы расширения. Например, сервер должен поддерживать команды EHLO, даже если в нем не реализовано соответствующее расширение, а клиентам следует использовать команду EHLO вместо HELO9. В тех случаях, когда для взаимодействия не требуется явное использование HELO, настоящая спецификация всегда рассматривает только команда EHLO.

Протокол SMTP широко распространен и высококачественные реализации обеспечивают высокий уровень устойчивости к ошибкам. Однако сообщество Internet сейчас считает достаточно важными некоторые службы, которых просто не было в момент создания протокола. При добавлении поддержки таких служб должна обеспечиваться возможность приемлемой работы старых реализаций протокола. К числу таких расширений относятся:

  • команда EHLO взамен прежней команды HELO;
  • реестр расширений сервиса SMTP;
  • дополнительные параметры команд MAIL и RCPT;
  • возможность замены команд, определенных в данном протоколе (таких, как DATA) при передаче символов, отличных от ASCII (RFC 3030 [20]).

Сильные стороны протокола SMTP обусловлены, прежде всего, его простотой. Опыт использования множества протоколов показывает, что протоколы с меньшим числом опций получают более широкое распространение, нежели усложненные протоколы.

Каждое расширение, независимо от обеспечиваемых им преимуществ, должно быть тщательно проверено в части его реализации, развертывания и совместимости. Во многих случаях стоимость расширения сервиса SMTP может многократно превысить достигаемые преимущества.

2.2.2. Определение и регистрация расширений

Реестр расширенных служб SMTP поддерживается агентством IANA. С каждым расширением связано соответствующее ключевое значение EHLO. Каждая дополнительная служба, регистрируемая IANA, должна быть определена на основе стандартного протокола или одобренного IESG экспериментального протокола. Определение должно включать:

  • текстовое имя расширенного сервиса SMTP;
  • ключевое значение EHLO связанное с этим расширением;
  • синтаксис и возможные значения параметров, связанных с ключевым значением EHLO;
  • все дополнительные команды SMTP, связанные с расширением (такие команды обычно используются, но не являются обязательными, как и ключевое значение EHLO);
  • все новые параметры расширения, связанные с командами MAIL или RCPT;
  • описание воздействия поддержки расширения на поведение клиентов и серверов SMTP;
  • размер увеличения максимальной длины команд MAIL и/или RCPT сверх заданного настоящим стандартом.

Кроме того, все ключевые значения EHLO, начинающиеся с X или x, указывающие на локальные расширения сервиса SMTP, используются только на основе двухсторонних соглашений. Ключевые слова, начинающиеся с X (независимо от регистра) недопустимо использовать в регистрируемых расширениях сервиса. И наоборот, ключевые значения, представляемые в отклике EHLO, который не начинается с X, должны соответствовать стандарту, проекту стандарта или одобренному IESG экспериментальному расширению SMTP, зарегистрированному IANA. Для соответствующих требованиям стандарта серверов недопустимо предлагать начинающиеся с отличных от X символов расширения сервиса, если они не зарегистрированы.

Имена дополнительных команд и параметров подчиняются тем же правилам, что используются для ключевых значений EHLO; в частности, команды, начинающиеся с X, являются локальным расширением и могут использоваться без регистрации и стандартизации. И наоборот, все команды, которые начинаются с символов, отличных от X, должны регистрироваться.

2.2.3. Дополнительные вопросы, связанные с расширениями

Допускаются расширения, которые могут существенно изменять базовые операции SMTP. Текст в остальных параграфах данного документа следует трактовать с учетом этого обстоятельства. В частности, расширения могут изменять минимальные пределы, указанные в параграфе 4.5.3, отменять требование по использованию набора символов ASCII, упомянутое выше, или вводить некие дополнительные режимы обслуживания сообщений.

В частности, если расширение предполагает, что на пути доставки обычно поддерживаются особые возможности данного расширения, а промежуточная система SMTP определяет, что на следующем этапе такие возможности не поддерживаются, эта система может выбрать с учетом конкретного расширения и обстоятельств попытку более поздней доставки и/или выбора другого хоста MX. При использовании такое стратегии тайм-аут возврата к формату без расширения (если таковой имеется) следует задавать меньше обычного тайм-аута, используемого для возврата почты в случае невозможности доставки (например, если обычный тайм-аут составляет три дня, тайм-аут для попытки передачи почты без использования расширения может составить один день).

2.3. Терминология SMTP

2.3.1. Почтовые объекты

Протокол SMTP обеспечивает транспортировку объектов электронной почты. Каждый объект состоит из конверта (envelope) и содержимого.

Конверт SMTP передается как серия протокольных элементов SMTP (см. главу 3). Конверт содержит адрес отправителя (по которому должны возвращаться отчеты об ошибках) и один или более адресов получателей, а также дополнительную информацию для расширений протокола. В силу исторических причин возможно использование вариаций задания адреса возврата (адреса отправителя) в команде MAIL для указания альтернативных режимов доставки; использование таких вариаций в настоящее время осуждается (см. Приложение F и параграф F.6).

Содержимое SMTP передается в виде протокольного элемента SMTP DATA и состоит из двух частей – заголовков и тела. Если содержимое соответствует другим современным стандартам, заголовок состоит из набора полей, каждое из которых включает имя заголовка, двоеточие (;) и данные, структурированные в соответствии со спецификацией формата сообщения (RFC 5322 [4]); тело сообщения, при наличии в нем структуры, соответствует спецификации MIME (RFC 2045 [21]). Содержимое является текстовым по своей природе и выражается с использованием набора символов US-ASCII [6]. Хотя расширения SMTP (типа 8BITMIME, RFC 1652 [22]) могут обходить это ограничение для содержимого, заголовки всегда должны кодироваться с использованием набора символов US-ASCII. Два расширения MIME (RFC 2047 [23] и RFC 2231 [24]) определяют алгоритм представления в заголовках символов, не входящих в US-ASCII, с использованием комбинаций символов набора US-ASCII.

2.3.2. Отправители и получатели

В RFC 821 два хоста, принимающие участие в транзакции SMTP, были описаны как SMTP-sender (отправитель) и SMTP-receiver (получатель). В настоящей спецификации используются иные термины, отражающие сложившуюся практику — SMTP client (иногда просто client) и SMTP server (или просто server) для отправителя и получателя, соответственно. Поскольку в режиме трансляции один хост может выступать в качестве клиента и сервера, продолжается использование терминов «получатель» (receiver) и «отправитель» (sender) там, где это нужно для понимания.

2.3.3. Почтовые агенты и хранилища сообщений

В данной спецификации используется современная терминология, устоявшаяся с момента публикации RFC 821. В частности, клиенты и серверы SMTP обеспечивают почтовый транспортный сервис и, следовательно, называются «агентами доставки почты» — АДП (Mail Transfer Agent или MTA). Пользовательские почтовые агенты – ППА (Mail User Agent, MUA или UA) выступают в качестве исходных отправителей и конечных получателей почтовых сообщений. На стороне отправителя ППА может собирать почту от пользователя для передачи ее АДП; агент АДП на стороне получателя передает почту ППА (по крайней мере, передает этому агенту ответственность за доставку почты; например, помещая ее в «почтовое хранилище» — message store). Однако, хотя эти термины достаточно точно выражают суть и применимы к другим средам, границы между ППА (MUA) и АДП (MTA) определены недостаточно четко. Следовательно, читатель должен внимательно относиться к терминологии.

2.3.4. Хост

В рамках данной спецификации термин «хост» обозначает компьютерную систему, подключенную к Internet (или, в некоторых случаях, к частной сети TCP/IP) и поддерживающую протокол SMTP. Хосты обозначаются именами (см. следующий параграф); не следует использовать для идентификации хостов полные адреса (см. параграф 4.1.2).

2.3.5. Доменные имена

Доменное имя (или просто домен) состоит из одной или нескольких разделенных точками компонент. В случае использования в качестве адреса домена верхнего уровня, строка доменного имени не содержит точек. Это ведет к возникновению требования, более подробно рассмотренного ниже, об использовании при транзакциях SMTP в публичной сети Internet только полных доменных имен (FQDN10), что особенно важно при использовании доменов верхнего уровня. Компоненты доменных имен (метки в терминах DNS RFC 1035 [2]) при транзакциях SMTP могут содержать только последовательности букв11, цифр, дефиса (-) и знака подчеркивания (_) из набора символов ASCII [6]. Доменные имена используются для обозначения хостов и других объектов иерархии доменных имен. Например, доменное имя может указывать на псевдоним (метка CNAME RR) или метку записи MX (Mail exchanger), которая будет использоваться для доставки почты вместо представленного имени хоста. Дополнительные сведения о доменных именах можно найти в RFC 1035 [2] и разделе 5 данной спецификации.

Доменное имя, как описано в данном документе и RFC 1035 [2], представляет собой полное имя (fully-qualified domain name или FQDN). Доменные имена, не являющиеся FQDN, есть ни что иное, как локальные псевдонимы. В транзакциях SMTP появление локальных псевдонимов недопустимо.

При использовании доменных имен в SMTP допускаются только полные (FQDN), преобразуемые DNS имена. Иными словами, разрешено использовать имена, которые могут быть преобразованы в записи MX RR или адреса (RR типа A или AAAA, как сказано в разделе 5), а также CNAME RR, псевдонимы которых могут быть преобразованы в MX или адреса. Локальные псевдонимы и неполные имена использовать недопустимо. Указанное правило имеет два исключения:

  • доменное имя, указываемое в команде EHLO должно быть основным именем хоста (именем, преобразуемым в адрес) или, если у хоста нет имени, полным адресом, описанным в параграфе 4.1.3 и дополнительно рассмотренным при обсуждении команды EHLO в параграфе 4.1.4;
  • зарезервированное имя почтового ящика postmaster может использоваться в команде RCPT без полного доменного имени (см. параграф 4.1.1.3) и, в случае такого использования, должно приниматься.

2.3.6. Буфер и таблица состояний

Сессии SMTP имеют разные состояния и обе стороны аккуратно поддерживают общее представление о текущем состоянии сессии. В этом документе мы будем представлять это состояние виртуальным буфером и таблицей состояний на сервере, которые могут использоваться клиентом (например, клиент может очистить буфер, сбросить таблицу состояния — в результате чего информация из буфера удаляется, а таблица переходит в некое начальное состояние).

2.3.7. Команды и отклики

Команды SMTP и (если расширение сервиса не задает иного) данные сообщений передаются от отправителя к получателю через коммуникационный канал в форме строк.

Отклик SMTP представляет собой подтверждение (или отказ), передаваемое в форме строк от получателя к отправителю через коммуникационный канал в ответ на полученную команду. Общей формой отклика является цифровой код результате (отказ или успешное завершение), за которым обычно следует текстовая строка. Коды служат для использования программами, а текст обычно предназначен для человека. В RFC 3463 [25] содержится спецификация дополнительного структурирования текстовых строк, включая использование дополнений и более специфических кодов завершения (см. также RFC 5248 [26]).

2.3.8. Строки

Строка состоит из некоторого (возможно, нулевого) числа символов данных и завершается символами ASCII для возврата каретки (CR — 0Dh) и перевода строки (LF — 0Ah). Последовательность завершения строки в этом документе будет обозначаться <CRLF>. Для реализаций, соответствующих требованиям данной спецификации, недопустимо принимать или генерировать в качестве завершения строки любые другие символы или последовательности символов. Серверы могут вносить ограничения на длину строк (см. раздел 4).

В дополнение отметим, что использование в тексте отдельных символов CR или LF (не в комбинации <CRLF>) имеет долгую историю проблем в реализациях почтовых систем и приложениях, работающих с электронной почтой. Для клиентов SMTP недопустима передача этих символов за исключением тех случаев, когда комбинация символов служит для завершения строки, а в этом случае должна применяться только стандартная последовательность <CRLF>.

2.3.9. Содержимое сообщения и почтовые данные

Термины «содержимое сообщения» (message content) и «почтовые данные (mail data) в этом документе являются взаимозаменяемыми и служат для обозначения информации, передаваемой после восприятия команды DATA до завершения передачи. Содержимое сообщения включает заголовки и (возможно структурированное) тело сообщения. Спецификация MIME (RFC 2045 [21]) обеспечивает стандартные механизмы структурирования тела сообщений.

2.3.10. Отправитель, система доставки, транслятор, шлюз

В данной спецификации различаются четыре типа систем SMTP на основе выполняемых ими функций передачи электронной почты. Система-отправитель (SMTP originator) вносит сообщение в Internet или, в более общем случае, в среду транспортного сервиса. Система доставки (delivery) SMTP принимает почту от транспортного сервиса и передает ее пользовательскому почтовому агенту или размещает в хранилище сообщений, из которого пользовательский агент может взять почту впоследствии. Транслятор (relay) SMTP получает почту от клиента SMTP и передает ее другому серверу SMTP (для доставки или следующей трансляции) без изменения данных, добавляя лишь трассировочную информацию в заголовок.

Шлюзами (gateway) SMTP называют системы, получающие почту от клиентов из одной транспортной среды и передающие ее серверу другой среды. Различия в протоколах и семантике сообщения по разные стороны шлюза могут потребовать преобразования, которое не может быть выполнено трансляторами SMTP. В контексте данной спецификации межсетевые экраны (firewall), переписывающие адреса, следует рассматривать как шлюзы, даже если по обе стороны экрана используется среда SMTP (см. RFC 2979 [27]).

2.3.11. Почтовый ящик и адрес

В данной спецификации термин «адрес» означает текстовую строку, идентифицирующую пользователя, которому предназначено сообщение, или место, в котором почта будет сохранена. Термин «почтовый ящик» (mailbox) обозначает место хранения почты. Обычно эти термины взаимозаменяемы, если не имеет значения разница между местом хранения почты (почтовый ящик) и ее конкретным получателем (адрес). Адрес обычно состоит из пользовательской и доменной части. Стандартные соглашения об именах почтовых ящиков предполагают использование формата local-part@domain — современная терминология поддерживает значительно более широкий спектр применений, нежели просто имена пользователей. По этой причине, а также в результате исторической проблемы, связанной с попытками промежуточных хостов менять локальную часть адреса в целях оптимизации, эта часть адреса должна интерпретироваться только хостом, указанным в доменной части адреса.

2.4. Общие синтаксические принципы и модель транзакции

Команды и отклики SMTP подчиняются жестким синтаксическим правилам. Все команды начинаются с «командного глагола» (command verb), а все отклики – с 3-значного цифрового кода. В некоторых командах и откликах за командой или кодом должны следовать аргументы. Некоторые команды не принимают аргументов (после команды), а за некоторыми кодами откликов может следовать произвольный текст. Во всех случаях присутствия текста он отделяется от команды или кода символом пробела. Полные описания команд и откликов приведены в разделе 4.

Регистр символов в командах и значениях аргументов не имеет значения (т. е., TO: и to: в команде RCPT не различаются), однако это правило имеет исключения для локальной части названия почтового ящика (расширения SMTP могут явно указывать чувствительные к регистру символов элементы). Команды, значения аргументов (кроме локальной части имени почтового ящика) и свободный текст могут содержать произвольную комбинацию символов верхнего и нижнего регистра. Для локальной части имен почтовых ящиков регистр символов должен приниматься во внимание. Следовательно, реализации SMTP должны пытаться сохранить регистр символов в локальной части имени почтового ящика. В частности, для некоторых хостов пользователь smith может отличаться от пользователя Smith. Однако использование чувствительных к регистру локальных частей в именах почтовых ящиков снижает уровень взаимодействия – следует избегать такого применения локальных имен. Домены в почтовых адресах соответствуют обычным правилам DNS и, следовательно, не чувствительны к регистру символов.

Некоторые серверы SMTP в нарушение данной спецификации (и RFC 821) требуют от клиентов представления команд в верхнем регистре. В реализациях могут приниматься меры для представления команд в соответствии с требованиями таких серверов.

Поле аргументов содержит текстовую строку переменной длины, заканчивающуюся символами <CRLF>. Принимающая сторона не будет предпринимать никаких действий до получения стандартного завершения строки.

Синтаксис каждой команды рассматривается ниже вместе с описаниями команд. Общие элементы и параметры рассмотрены в параграфе 4.1.2.

Команды и отклики состоят из символов ASCII [6]. Когда транспортный сервис обеспечивает 8-битовый (байты или октеты) канал передачи, каждый 7-битовый символ передается с выравниванием по правому краю (старший бит октета имеет нулевое значение). Стандартный сервис SMTP обеспечивает поддержку только 7-битовых символов. Клиенту-отправителю SMTP, который не смог согласовать подходящее расширение с сервером (см. следующий параграф), недопустимо передавать сообщения, содержащие информацию в старших битах октетов. Если в нарушение этого правила такое сообщение передается, принимающий сервер SMTP может сбросить старший бит или отвергнуть сообщение как некорректное. В общем случае транслятору SMTP следует предполагать, что содержимое принятого сообщения корректно и, в предположении что конверт позволяет это сделать, транслировать сообщение без проверки его содержимого. Конечно, если содержимое некорректно и путь передачи не может его воспринять, такое решение может привести к доставке конечному адресату искаженного сообщения. Системы доставки SMTP могут отвергать такие сообщения или возвращать их, как недоставляемые, вместо попытки доставки. В отсутствии предлагаемого сервером расширения, явно позволяющего делать это, никаким передающим системам SMTP не дозволяется передавать envelope-команды, содержащие символы, не включенные в набор US-ASCII; принимающим системам следует отвергать такие команды, используя стандартный отклик 500 syntax error — invalid character.

Клиент может запросить у сервера передачу 8-битового содержимого сообщений с использованием расширенных возможностей SMTP, прежде всего 8BITMIME RFC 1652 [22]. Серверам SMTP следует поддерживать режим 8BITMIME. Однако это недопустимо трактовать, как разрешение на неограниченную передачу 8-битовых символов и не позволяет передавать в конвертах сообщений символы, отличные от ASCII. Для отправителя недопустимо запрашивать режим 8BITMIME при передачи данных, где в качестве старшего бита не используется соответствующий формат MIME с подходящим транспортным кодирование; серверы могут отвергать такие сообщения.

Используемая в этом документе металингвистическая нотация соответствует нотации Augmented BNF, принятой в документах других почтовых систем Internet. Читателям, которые незнакомы с этим синтаксисом, следует прочесть спецификацию ABNF в RFC 5234 [7]. Для ясности термины метаязыка, используемые в тексте, обозначены угловыми скобками (например, <CRLF>). Читателям следует отдавать отчет в том, выражения метаязыка могут быть неполными. Имеется множество случаев, когда представленная в тексте информация ограничивает или иначе меняет синтаксис или семантику метаязыка.

3. Обзор процедур SMTP

В этом разделе приведены описания процедур, используемых в SMTP: инициирование сеансов, почтовые транзакции, пересылка почты, проверка имен почтовых ящиков, обработка списков рассылки, а также организация и завершение обмена данными. Вопросы трансляции почты, почтовых доменов и смены ролей рассматриваются в конце раздела. В Приложении D рассматривается несколько конкретных сценариев почтовых транзакций.

3.1. Инициирование сеанса

Сеанс SMTP инициируется, когда клиент соединяется с сервером и сервер отвечает соответствующим сообщением.

Реализация сервера SMTP может включать идентификацию своих программ и сведения об их версии в отклик подтверждения соединения после кода 220, на практике эта информация позволяет упросить поиск и решение проблем. Реализации серверов могут включать возможность запрета передачи данных о программе и ее версии в целях безопасности. Хотя некоторые системы указывают свои контактные адреса для связанных с почтой проблем, это не может служить заменой поддержки требуемого стандартом адреса postmaster (см. раздел 4).

Протокол SMTP позволяет серверу формально отвергать транзакцию, не запрещая изначальные соединения: код 554 может возвращаться в открывающем сообщении взамен кода 220. Сервер, использующий такой вариант, должен по-прежнему ждать, пока клиент передаст команду QUIT (см. параграф 4.1.1.10) перед закрытием соединения, а на любую мешающую команду следует возвращать отклик 503 bad sequence of commands (некорректная последовательность команд). Поскольку попытка организации SMTP-соединения с такими системами может приводить к ошибке, серверу, возвращающему код 554, следует передавать вместе с кодом информацию, которая позволит передающей системе понять причину ошибки.

3.2. Инициирование клиента

После того, как сервер передал приглашающее сообщение (приветствие) и клиент получил его, последний обычно передает серверу команду EHLO, идентифицирующую клиента. В дополнение к открытию сеанса использование EHLO показывает, что клиент способен работать с расширенным сервисом и запрашивает у сервера список поддерживаемых им расширений. Старые системы SMTP, не способные поддерживать расширения сервиса, и современные клиенты, которым не требуется расширенный сервис в инициируемом почтовом сеансе, могут использовать HELO взамен EHLO. Для серверов недопустимо возвращать расширенные отклики в стиле EHLO в ответ на команду HELO. Для конкретной попытки соединения, если сервер возвращает отклик command not recognized (команда не распознана) на команду EHLO, клиенту следует начать процесс заново и передать команду HELO.

Хост, передающий команду EHLO, идентифицирует в ней себя; команду можно интерпретировать как Hello, I am <domain> (Привет, я домен …), а для случая EHLO – and I support service extension requests (и я поддерживаю расширения …).

3.3. Почтовые транзакции

Почтовая транзакция SMTP состоит из трех этапов. Началом транзакции служит команда MAIL, дающая идентификацию отправителя (в общем случае команда MAIL может быть введена только при отсутствии незавершенных почтовых транзакций; см. параграф 4.1.4.). После этого следует одна или несколько команд RCPT, указывающих получателей сообщения. Последний этап транзакции начинается командой DATA, которая инициирует передачу почтовых данных и завершается индикатором end of mail, который также подтверждает транзакцию.

Первым этапом транзакции является команда MAIL.

MAIL FROM:<reverse-path> [SP <mail-parameters> ] <CRLF>

Эта команда говорит получателю SMTP о начале новой почтовой транзакции и сбрасывает все таблицы состояний и буферы, включая любые данные получателя или почтовые данные. Часть <reverse-path> (обратный путь) первого или единственного аргумента команды содержит название почтового ящика отправителя (между скобками < и >), которое может использоваться для передачи отчетов об ошибках (см. параграф 4.2). Восприняв команду, сервер SMTP возвращает отклик 250 OK. Если указанный почтовый ящик по каким-то причинам неприемлем, сервер должен возвратить отклик, показывающий временной тип отказа – постоянная (т. е., повторится при повторе команды клиентом) или временная (т. е., адрес клиента может быть принят при следующем вызове) ошибка. Несмотря на очевидность этого требования, существуют обстоятельства, при которых возможность восприятия обратного пути невозможно определить, пока не будет получен по крайней мере один прямой путь (в команде RCPT). В таких случаях сервер может воспринять обратный путь (отклик 250) и сообщить о возникновении проблем после получения и проверки прямых путей. Обычно это делается с помощью откликов 550 или 553.

Исторически <reverse-path> может содержать больше данных, нежели просто имя почтового ящика, но современным системам не следует использовать маршрутизацию почты отправителем — source routing (см. Приложение C).

Дополнительные параметры <mail-parameters> связываются с согласованным расширением сервиса SMTP (см. 2.2).

Вторым этапом транзакции является команда RCPT. Данный этап может повторяться много раз.

RCPT TO:<forward-path> [ SP <rcpt-parameters> ] <CRLF>

Первый или единственный аргумент этой команды включает прямой путь forward-path (обычно имя почтового ящика и домена, обязательно заключенные в скобки <>), идентифицирующий получателя. Восприняв команду, сервер SMTP возвращает отклик 250 OK и сохраняет прямой путь. Если известно, что почта не может быть доставлена адресату, сервер SMTP возвращает отклик 550, обычно сопровождаемый строкой типа «no such user — » с именем почтового ящика, для которого невозможна доставка (возможны также другие обстоятельства и коды возврата).

Параметр <forward-path> может содержать не только адрес получателя. Исторически <forward-path> может включать маршрут (source routing) к получателю в виде списка промежуточных хостов, однако современным клиентам SMTP не рекомендуется использовать маршрутизацию почты отправителем (см. Приложение C). Сервер должен быть готов к восприятию списка source route в прямом пути, но рекомендуется игнорировать эти маршруты и можно отклонять предлагаемую таким маршрутом трансляцию. Подобно этому, сервер может отказаться от приема почты, предназначенной для других хостов или систем. Эти ограничения делают сервер бесполезным в качестве транслятора для клиентов, не полностью поддерживающих функциональность SMTP. Следовательно, для клиентов с ограниченными возможностями недопустимо предполагать, что любой SMTP-сервер в Internet можно использовать для обработки (трансляции) почты. Если команда RCPT принята без предшествующей команды MAIL, сервер должен возвращать отклик 503 Bad sequence of commands12. Дополнительные параметры <rcpt-parameters> связываются с согласованным расширением сервиса SMTP (см. параграф 2.2).

Поскольку такая ошибка встречается достаточно часто, подчеркнем, что не допускается включение пробелов с любой стороны от знака двоеточия (:) после FROM в команде MAIL или после TO в команде RCPT. Точный синтаксис показан выше.

Третьим этапом транзакции является команда DATA (или соответствующая команда протокольного расширения).

DATA <CRLF>

Восприняв команду, сервер SMTP возвращает промежуточный отклик 354 Intermediate и рассматривает все последующие строки, вплоть (но не включая) до индикатора завершения почтовых данных, как текст сообщения. При успешном приеме всего текста сервер сохраняет полученные данные и возвращает отправителю отклик 250 OK.

Поскольку почтовые данные передаются через коммуникационный канал, завершение данных должно быть указано таким образом, чтобы можно было возобновить командный диалог. Протокол SMTP использует для обозначения конца почтовых данных точку в пустой строке. Для предотвращения ошибок при наличии такой последовательности в пользовательских данных применяется специальная процедура (transparency), описанная в параграфе 4.5.2.

Индикатор завершения почтовых данных также подтверждает почтовую транзакцию и говорит серверу SMTP, что нужно обрабатывать сохраненные пользовательские и почтовые данные. Восприняв данные, сервер SMTP возвращает отклик 250 OK. Сбой при обработке команды DATA может происходить только на двух этапах обмена данными.

Если команды MAIL и RCPT не были введены или были отвергнуты, сервер может возвращать отклик command out of sequence (503) или no valid recipients (554 – нет корректных получателей) в ответ на команду DATA. При получении одного из таких откликов (или любого отклика 5yz) для клиента недопустима передача данных серверу (точнее, передача данных недопустима, пока не будет получен отклик 354).

Если команда воспринята и передан отклик 354, невыполнение команды DATA может быть связано только с неполнотой почтовой транзакции (например, не указан адресат), недоступностью ресурсов (включая и неожиданную недоступность сервера) или отказом сервера от обработки сообщения в соответствии с заданной политикой или по иным причинам.

Однако на практике некоторые серверы не проверяют адресата после приема текста сообщения. Таким серверам следует трактовать отказ для одного или нескольких получателей как «отказ обусловленный другим отказом» (subsequent failure) и возвращать почтовое сообщение, как указано в главе 6 и, в частности, в параграфе 6.1. Использование отклика 550 mailbox not found (или его эквивалента) после восприятия данных делает для клиента сложной или невозможной диагностику причины отказа.

При использовании формата RFC 822 ([28], [4]) почтовые данные включают элементы заголовка, такие как Date, Subject, To, Cc, From13. Серверам SMTP не рекомендуется отвергать сообщения на основе дефектов в заголовках RFC 822 и MIME (RFC 2045 [21]) или в теле сообщения. В частности, недопустимо отвергать сообщения, в которых число полей Resent не соответствует или Resent-to появляется без Resent-from и/или Resent-date.

Команды почтовых транзакций должны использоваться в приведенном выше порядке.

3.4. Пересылка для коррекции и обновления адресов

Поддержка пересылки чаще всего требуется для консолидации адресов и упрощения адресации в сети предприятия (или применительно к такой сети) и реже для случаев изменения адресов. Пересылка без уведомления отправителя (Silent forwarding) в целях обеспечения безопасности или сокрытия внутренней структуры весьма распространена сегодня в Internet.

В обоих перечисленных случаях приходится решать вопрос сокрытия (в некоторых случаях – безопасности) информации – следует ли показывать отправителю данные о пересылке почты. Это может быть особо важным, когда конечный адресат просто недоступен для отправителя. Следовательно, механизм пересылки, описанный в параграфе 3.2 RFC 821 и особенно строки откликов 251 (скорректированный получатель) и 551 на команду RCPT должны осторожно оцениваться при разработке и, когда это возможно, при настройке конфигурации системы (см. также параграф 7.4).

В частности:

  • Сервер может пересылать сообщения, когда ему известно об изменении адреса. При такой пересылке сервер может предоставлять сведения о смене адреса с кодом 251 или «по-тихому» пересылать сообщение, возвращая код 250. При использовании кода 251 недопустимо предполагать, что клиент будет обновлять информацию об адресе получателя на основе принятого от сервера отклика.

Или:

  • Сервер может отвергнуть или «завернуть» сообщения, когда их невозможно доставить по указанному адресу. В таких случаях сервер может сообщить о смене адреса в отклике 551 или отвергнуть сообщение как недоставляемое с кодом 550 без дополнительных сведений. При использовании кода 551 недопустимо предполагать, что отправитель будет обновлять адрес на основе полученных сведений или доводить эту информацию до пользователя.

Реализациям серверов SMTP, поддерживающим отклики с кодами 251 и/или 551, следует обеспечивать конфигурационный механизм, позволяющий отключить или ограничить дополнительную информацию для сайтов, которые могут использовать ее нежелательным способом.

3.5. Команды для отлаживания адресов

3.5.1. Обзор

Протокол SMTP обеспечивает команды для проверки имен пользователей или получения содержимого списков рассылок. Такие операции осуществляются с помощью команд VRFY и EXPN, которые получают текстовые строки в качестве аргументов. Реализациям следует поддерживать команды VRFY и EXPN (особенности использования этих команд рассмотрены в параграфах 3.5.2 и 7.3).

Для команды VRFY параметром является имя пользователя, к которому может добавляться доменное имя (см. ниже). При получении нормального отклика (код 250) такой отклик может включать полное имя пользователя и должен включать название почтового ящика. Текст отклика должен использовать одну из двух возможных форм:

User Name <local-part@domain>
local-part@domain

Когда имя, указанное в команде VRFY, может идентифицировать более одного почтового ящика, сервер может отметить неоднозначность или предложить в отклике несколько вариантов. Иными словами, в таких случаях возможен любой из перечисленных ниже вариантов отклика на команду VRFY:

553 User ambiguous

или

553- Ambiguous; Possibilities are
553-Joe Smith <jsmith@foo.com>
553-Harry Smith <hsmith@foo.com>
553 Melvin Smith <dweep@foo.com>

или

553-Ambiguous; Possibilities
553- <jsmith@foo.com>
553- <hsmith@foo.com>
553 <dweep@foo.com>

При нормальных условиях предполагается, что клиент, получивший отклик 553, доведет эту информацию до пользователя. Использование приведенных здесь форм и ключевых слов user ambiguous (пользователя не определить однозначно) или ambiguous (неоднозначность), возможно дополненных расширенными кодами отклика (типа рассмотренных в RFC 3463 [25]), помогает при необходимости обеспечивать автоматический перевод на другие языки. Клиенты с высоким уровнем автоматизации и поддержкой других языков могут попытаться перевести отклик, возвратить пользователю нестандартную индикацию или предпринять некоторые автоматические операции типа обращения к службе каталогов для получения дополнительных данных перед возвратом отклика пользователю.

Для команды EXPN строка параметров идентифицирует список рассылки и при успешном выполнении команды возвращается отклик 250, который может включать полные имена пользователей и должен включать имена почтовых ящиков из списка.

На некоторых хостах различия между списками рассылок и псевдонимами выражены весьма слабо, поскольку оба типа записей могут сохраняться в единой структуре данных и возможны списки рассылок, содержащие единственный адрес. Если дается запрос на применение команды VRFY к списку рассылок, позитивный отклик может быть возвращен, если направленное по адресу списка сообщение может быть доставлено кому-либо из списка, в остальных случаях следует возвращать сообщение об ошибке (например, отклик 550 That is a mailing list, not a User14 или 252 Unable to verify members of mailing list15). Если делается запрос имени пользователя из списка, сервер может давать позитивный отклик, содержащий список из одного имени, или сообщение об ошибке (например, 550 That is a user name, not a mailing list16).

При успешном выполнении возвращаемый многострочный отклик (обычный для EXPN) содержит имя одного почтового ящика в каждой строке. Ситуации с неоднозначными запросами были рассмотрены выше.

Термин User name (имя пользователя) является недостаточно четким и должен использоваться осмотрительно. Реализации команд VRFY и EXPN должны, по крайней мере, распознавать локальные почтовые ящики, как имена пользователей. Однако в сети Internet зачастую один хост обслуживает почту для множества доменов и хостам (особенно тем, которые работают с разными доменами) следует обеспечивать такую функциональность и воспринимать форму local-part@domain, как имя пользователя; хосты также могут распознавать, как имена пользователей, строки других типов.

Случай получения имен почтовых ящиков из списка рассылок требует многострочных откликов типа приведенного ниже (C – клиент, S – сервер; прим. перев.):

C: EXPN Example-People
S: 250-Jon Postel <Postel@isi.edu>
S: 250-Fred Fonebone <Fonebone@physics.foo-u.edu>
S: 250 Sam Q. Smith <SQSmith@specific.generic.com>

или

C: EXPN Executive-Washroom-List
S: 550 Access Denied to You.

Символьная строка аргументов VRFY и EXPN не может быть дополнительно ограничена вследствие различных концепций именования пользователей и почтовых ящиков в разных реализациях. В некоторых системах аргументом команды EXPN может быть имя файла, содержащего список рассылки, но здесь опять приходится сталкиваться с различными соглашениями по именованию файлов в Internet. Отметим также, что в силу исторических причин вариации возвращаемых этими командами откликов достаточно велики, поэтому интерпретировать отклики следует очень осторожно и использовать только в целях диагностики.

3.5.2. Нормальные отклики VRFY

Когда возвращается нормальный код (2yz или 551) в результате запроса VRFY или EXPN, отклик должен включать имя почтового ящика в формате <local-part@domain>, где domain является полным доменным именем (FQDN). В ситуациях, исключающих нарушение требований данной спецификации, может возвращаться текстовая строка произвольной формы. Для облегчения анализа и разделения имени почтового ящика и данных человека (или компании) адрес следует выводить в угловых скобках. При возврате адресов (а не произвольной текстовой строки) команды EXPN и VRFY должны возвращать только корректные значения доменной части адреса, которые можно использовать в команде RCPT. Следовательно, если адрес может передаваться программе или другой системе, должно указываться имя почтового ящика, используемого для доступа к адресату. Возврат путей (явные маршруты source route) для команд VRFY и EXPN недопустим.

Реализациям серверов следует поддерживать обе команды VRFY и EXPN. В целях безопасности может обеспечиваться локальная возможность отключить любую из этих команд (или обе) с помощью конфигурационных параметров. Когда эти команды поддерживаются, не требуется обеспечивать их работу через трансляторы, если трансляция разрешена. Обе эти команды были необязательными в спецификации RFC 821, но команда VRFY стала обязательной в RFC 1123 [3]. Если команда EXPN поддерживается, она должна быть указана как расширение сервиса в отклике EHLO. VRFY можно указывать удобным способом, но в силу обязательности ее поддержки, клиенты SMTP не обязаны проверять наличие этой команды в списке расширений перед началом ее использования.

3.5.3. Значения откликов при успешном завершении VRFY или EXPN

Для серверов недопустим возврат откликов 250 на команды VRFY и EXPN, пока адрес реально не проверен. В частности, для сервера недопустимо возвращать код 250, если его действия ограничились проверкой корректности синтаксиса. В таких случаях следует возвращать код 502 (команда не реализована) или 500 (синтаксическая ошибка, команда не распознана). Как было указано, реализация (в смысле проверки адресов и возврата информации) команд VRFY и EXPN настоятельно рекомендуется. Следовательно, реализации, возвращающие код 500 или 502 для команды VRFY не являются полностью совместимыми с данной спецификацией.

Существуют ситуации, когда адрес представляется корректным, но не может быть проверен в реальном масштабе времени (в частности, когда сервер используется при обмене почтой для другого сервера или домена). «Видимая корректность» (Apparent validity) в таких случаях будет включать, по крайней мере, проверку синтаксиса и может также включать проверку возможности трансляции для указанного адреса. В таких случаях следует возвращать код 252. Эти ситуации связаны с вопросами проверки RCPT, рассмотренными в параграфе 2.1. Аналогично ситуации, описанной в 3.4, коды 251 и 551 могут использоваться для команд VRFY и EXPN, чтобы показать адреса, которые распознаны, но почта для них будет пересылаться или отвергаться. Реализациям в общем случае следует быть более жесткими в вопросах проверки адресов для случая VRFY, нежели для команды RCPT, даже если это будет занимать немного больше времени.

3.5.4. Семантика и использование EXPN

Команда EXPN зачастую очень полезна для отладки и поиска проблем, связанных со списками рассылок и псевдонимами ко множеству адресов (multiple-target-address alias). Некоторые системы пытаются использовать поиск отправителя в списке рассылки для предотвращения дубликатов. Распространение системы псевдонимов с почтой в Internet для хостов (обычно записи MX и CNAME на серверах DNS), почтовых ящиков (различные типы локальных псевдонимов хоста) и в различных proxy-системах делает почти невозможной стратегию согласованного использования псевдонимов и почтовым системам не следует пытаться решить эту задачу.

3.6. Трансляция и маршрутизация почты

3.6.1. Маршрутизация, заданная отправителем, и трансляция

В общем случае доступность записей MX в DNS (RFC 1035 [2], RFC 974 [12]) избавляет от необходимости использования явно заданных маршрутов в почтовой системе Internet. С явной маршрутизацией почты связано множество проблем, делающих такое использование совершенно нежелательным. Клиентам SMTP не следует генерировать явные маршруты source route за исключением особых ситуаций. Серверы SMTP могут отказывать в трансляции или не воспринимать сообщения с указанным отправителем маршрутом. Обнаружив маршрутную информацию, сервер SMTP может игнорировать ее и просто переслать почту конечному адресату, указанному в последнем элементе заданного маршрута, — серверам следует поступать именно так. Встречаются случаи некорректного использования имен адресатов, отсутствующих в записях DNS, с использованием преобразования имен на промежуточных хостах, указанных в маршруте source route. При исключении (игнорировании) заданного отправителем маршрута в таких случаях возникают проблемы. Это одна из нескольких причин, по которым для клиентов SMTP недопустима генерация некорректных маршрутов source route или путей, зависящих от последовательного преобразования имен.

Когда заданные отправителем маршруты не используются, процесс, описанный в RFC 821 для конструирования обратного пути из прямого, неприменим и обратный путь во время доставки будет просто адресом, указанным в команде MAIL.

3.6.2. Записи MX и трансляция

Транслирующий сервер SMTP обычно определяется из записи MX и не является системой окончательной доставки почты. Такой сервер может принимать или отвергать трансляцию почты аналогично восприятию или отказу для почты локальных пользователей. Если сервер принял трансляцию, от становится клиентом SMTP, организуя канал передачи следующему серверу SMTP, указанному в DNS (в соответствии с правилами, описанными в разделе 5), и передает ему почту. Если сервер отвергает трансляцию почты для какого-либо адреса, ему следует возвращать отклик 550.

В данной спецификации не рассматриваются вопросы верификации путей возврата для передачи уведомлений о доставке. В последнее время были выполнены работы (такие, как SPF [29] и DKIM [30] [31]) по обеспечению способов проверки корректности адресов возврата и их принадлежности лицу, действительно отправившему сообщение. Сервер может попытаться проверить путь возврата перед использованием этого адреса для передачи уведомления о доставке, однако здесь не определяются способы такой проверки и не дается рекомендация по выбору способа проверки.

3.6.3. Серверы представления сообщений как трансляторы

Существует множество клиентов, передающих почту (часто эти же программы служат для приема почты по протоколу POP3 или IMAP), которые не обеспечивают полную поддержку данной спецификации (например, поддержка очередей для последующей передачи). Для таких клиентов обычной практикой является организация частного соглашения с сервером для отправки ему всей почты с целью последующей обработки и доставки. Как указано здесь, SMTP не является идеальным решением для таких задач. Разработан стандартизованный протокол представления почтовых сообщений (RFC 4409 [18]), учитывающий опыт использования систем SMTP. В любом случае, частный характер соглашения между сервером и клиентами выводит этот вопрос за пределы данной спецификации.

Важно отметить, что записи MX могут указывать на серверы SMTP, которые действуют как шлюзы в другие среды, а не только выполняют трансляцию и окончательный прием почты (см. параграф 3.8 и раздел 5).

Если сервер SMTP принял на себя задачу трансляции почты и позднее обнаружил, что получатель указан некорректно или почту невозможно доставить по тем или иным причинам, этот сервер должен создать уведомление о невозможности доставки почты и переслать его отправителю недоставленного сообщения, указанному в обратном пути. Для уведомления следует (по возможности) использовать стандартные форматы (см., например RFC 3461 [32] и RFC 3464 [33]).

Это уведомление должно передаваться сервером SMTP с хоста-транслятора или хоста, который обнаружил невозможность доставки. Естественно, что для серверов SMTP недопустима отправка уведомлений о невозможности доставки уведомлений17. Одним из способов предотвращения петель при передаче сообщений об ошибках является использование пустой строки обратного пути в команде MAIL при передаче уведомления. При передаче такого сообщения строка обратного пути должна быть пустой – null (см. параграф 4.5.5). Команда MAIL с пустым обратным путем имеет вид:

MAIL FROM:<>

Как указано в параграфе 6.4, транслятору SMTP не нужно проверять и обрабатывать заголовки и тело транслируемых сообщений, а также недопустимо предпринимать какие-либо любые действия по отношению к сообщению, за исключением добавления к заголовку строки Received: (см. параграф 4.4) и (необязательной) попытки обнаружения петель в почтовой системе (см. параграф 6.3). Естественно, запрет распространяется и на изменение любых полей заголовка и текста сообщения (см. также параграф 7.9).

3.7. Почтовые шлюзы

Описанные выше трансляторы работают в транспортной среде Internet SMTP, однако записи MX и разные формы явной маршрутизации могут потребовать использования промежуточных серверов SMTP, которые будут обеспечивать преобразование почты между различными транспортными системами. Как было отмечено в параграфе 2.3.10, такие системы, работающие на границах между двумя системами транспортного сервиса, называются шлюзами или почтовыми шлюзами18.

Шлюзование почты между различными почтовыми средами (разные форматы и протоколы) является сложной задачей, стандартизация которой также непроста. Однако можно сформулировать некие требования общего плана для шлюзов между Internet и другими почтовыми средами.

3.7.1. Поля заголовка при использовании шлюзов

Поля заголовка могут быть при необходимости переписаны, когда сообщение передается через границу между почтовыми средами. Несмотря на приведенные в параграфе 6.4 запреты, локальная часть адреса получателя может быть изменена шлюзом; допускается также проверка содержимого почты.

Другие почтовые системы при передаче сообщений в Internet часто используют подмножество заголовков RFC 822 или обеспечивает похожую функциональность с использованием другого синтаксиса, но некоторые из таких почтовых систем не имеют эквивалента конвертов SMTP. Следовательно, когда сообщение покидает почтовую среду Internet, может потребоваться включение информации из конверта SMTP в заголовок сообщения. Возможным решением будет создание новых полей заголовка для передачи информации из конверта (например, X-SMTP-MAIL: и X-SMTP-RCPT:). Однако такое решение потребует изменения почтовых программ в чужой среде и может привести к разглашению частной информации (см. параграф 7.2).

3.7.2. Строки Received при использовании шлюзов

При пересылке сообщения в среду Internet или из нее шлюз должен включить в заголовок свою строку Received:, но недопустимо менять строки Received, уже имеющиеся в заголовке.

Поля Received: сообщений из чужих сред могут не соответствовать данной спецификации. Однако наиболее важным аспектом использования строк Received: является диагностика сбоев в почтовой системе и такая отладка может быть сильно осложнена шлюзами, которые пытаются «исправить» строки Received:. Другим важным аспектом обработки трассировочных полей из других (не SMTP) сред является то, что для принимающей системы недопустимо отвергать почту на основе формата полей трассировки и следует сохранять максимум здравомыслия при встрече с неожиданной информацией или форматами полей трассировки.

Шлюзу следует указывать среду и протокол в поле via строки Received, создаваемый шлюзом.

3.7.3. Адресация при использовании шлюзов

Со стороны Internet шлюзу следует воспринимать все корректные форматы адресов в командах SMTP и заголовках RFC 822, а также все корректные сообщения RFC 822. Генерируемые шлюзом адреса и заголовки должны соответствовать применимым стандартам Internet (включая данную спецификацию и RFC 5322 [4]). Шлюзы подчиняются тем же правилам обработки маршрутов source route, которые описаны в параграфе 3.3 для других систем SMTP.

3.7.4. Другие поля заголовков при использовании шлюзов

Шлюз должен обеспечивать соответствие требованиям Internet всех полей заголовков в сообщениях, передаваемых в почтовую среду Internet. В частности, все адреса в полях From:, To:, Cc: и т. п. должны преобразовываться (если нужно) в соответствии с синтаксисом RFC 5322 [4], должны указывать только полные доменные имена и должны быть эффективны и полезны для передачи откликов. Алгоритму, используемому для преобразования почты Internet в другие форматы, следует обеспечивать доставку сообщений об ошибках из чужой почтовой среды по пути возврата в конверте SMTP, а не отправителю, указанному в поле From:, Sender: (или других полях) заголовка сообщения.

3.7.5. Конверты при работе со шлюзами

При пересылке сообщений из других сред в Internet шлюзу следует устанавливать в конверте путь возврата в соответствии с адресом возврата сообщений об ошибках, если этот адрес предоставляется чужой средой. Если в чужой среде нет эквивалентной концепции, шлюз должен выбрать и использовать наилучшее приближение (адрес исходного отправителя сообщения при отсутствии других вариантов).

3.8. Прерывание сеансов и соединений

Соединение SMTP разрывается при получении от клиента команды QUIT. Сервер возвращает в ответ на эту команду позитивный отклик и закрывает соединение.

Для серверов SMTP недопустимо преднамеренно закрывать соединения в нормальных условиях (см. параграф 7.8) за исключением следующих ситуаций:

  • После получения команды QUIT и отклика на нее с кодом 221.
  • После определения необходимости отключения (shut down) сервиса SMTP и возврата кода 421. Такой отклик может выдаваться после получения сервером любой команды или (при необходимости) асинхронно (независимо от команд) в предположении, что клиент будет получать отклик после ввода следующей команды.
  • После тайм-аута (см. параграф 4.5.3.2) в процессе ожидания от клиента команды или данных.

В частности, разрыв соединения сервером в ответ на непонятную команду является нарушением данной спецификации. Ожидается, что серверы будут терпимы к неизвестным командам, возвращая в ответ на них код 500 и ожидая дальнейших инструкций от клиента.

Серверам SMTP, которые отключаются в результате внешнего воздействия, следует пытаться передать клиенту строку, содержащую код 421, до завершения работы. Клиент SMTP обычно будет получать код 421 после передачи следующей команды.

Клиентам SMTP, узнавшим о закрытии соединения, сбросе или других коммуникационных сбоях вследствие неконтролируемых клиентом событий (в нарушение данной спецификации, иногда неизбежное), для обеспечения устойчивости почтовой системы следует трактовать почтовую транзакцию, как при получении отклика 451 и действовать в соответствии с этим.

3.9. Почтовые списки и псевдонимы

Хостам SMTP следует поддерживать как псевдонимы, так и списки для преобразования адресов при групповой рассылке сообщений. Когда сообщение доставляется или пересылается по каждому адресу из списка, адрес возврата в конверте (MAIL FROM:) должен заменяться на адрес администратора списка. Однако в таких случаях заголовок сообщения (RFC 5322 [4]) должен сохраняться неизменным; в частности, не должно меняться поле From.

Одним из важных свойств почтовой системы является механизм доставки одного сообщения множеству адресатов за счет преобразования (expanding или exploding) псевдоадреса в список реальных адресов получателей. Когда сообщение направляется по такому псевдоадресу (иногда его называют exploder), копия этого сообщения пересылается по каждому адресу из списка. Серверу следует просто использовать адреса из списка, применение эвристики или проверки соответствия для исключения некоторых адресов (например, отправителя исходного сообщения) настоятельно не рекомендуется. Псевдоадреса называют списками (list, mail list) или псевдонимами (alias) в зависимости от способа получения адресов из списка.

3.9.1. Псевдонимы

Для преобразования псевдонима почтовая программа-получатель просто заменяет в заголовке псевдоадрес преобразованным адресом из псевдонима, сохраняя неизменными остальную часть конверта и тело сообщения. После этого сообщения доставляются или пересылаются по всем адресам.

3.9.2. Списки

Почтовые списки обеспечивают перераспределение (redistribution), а не пересылку (forwarding) сообщений. Для преобразования списка почтовая программа-получатель заменяет в конверте псевдоадрес реальными адресами из списка. Адрес возврата в конверте заменяется так, чтобы все сообщения об ошибках приходили по адресу администратора списка (не отправителя сообщения), который обычно контролирует содержимое списков и доставку. Отметим, что основное различие между обработкой псевдонимов (параграф 3.9.1) и списков (данный параграф) заключается в изменении адреса возврата при рассылке по списку. Хотя списки ограничивают набор операций обработки описанными здесь действиями, они являются попыткой эмуляции АДП (MTA); такие списки можно рассматривать как продолжение процедур транзита почты.

Существуют списки, которые поддерживают дополнительные (иногда значительные) изменения конвертов и тела сообщений. Такие списки необходимо рассматривать как полные ППА (MUA), которые принимают сообщение и передают новое.

4. Спецификации SMTP

4.1. Команды SMTP

4.1.1. Синтаксис и семантика команд

Команды SMTP определяют передачу почты и функции почтовой системы, запрашиваемые пользователем. Команды представляют собой текстовые строки, завершающиеся последовательностью <CRLF>. Команда, как таковая, представляет собой строку букв, завершаемую пробелом <SP> (при наличии параметров) или <CRLF>. В целях повышения уровня взаимодействия получателям SMTP следует быть терпимыми к пробелам перед завершающей последовательностью <CRLF>. Синтаксис локальной части имени почтового ящика соответствует соглашениям принимающего сайта и синтаксису, описанному в параграфе 4.1.2. Команды SMTP обсуждаются ниже, а рассмотрению откликов посвящен параграф 4.2.

Почтовая транзакция включает несколько объектов данных, используемых в качестве аргументов различных команд. Обратный путь является аргументом команды MAIL, прямой путь – аргументом RCPT, а почтовые данные – аргументом команды DATA. Эти аргументы или объекты данных должны передаваться и сохраняться до завершения почтовой транзакции. Для каждого типа данных (прямой и обратный путь и почтовые данные) используются различные буферы (буферы прямых и обратных путей, буфер данных). Конкретная команда приводит к добавлению информации в конец соответствующего буфера или созданию одного или нескольких новых буферов.

Некоторые команды (RSET, DATA, QUIT) не поддерживают параметров. В отсутствие специфических расширений, предлагаемых сервером и принимаемых клиентом, для последних недопустимо передавать параметры таким командам, а серверу следует отвергать команды, как в случае некорректного синтаксиса.

4.1.1.1. Расширенное (EHLO) или стандартное (HELO) приветствие

Эти команды используются для представления SMTP-клиента серверу SMTP. Поле аргументов содержит полное доменное имя клиента SMTP, если такое имя доступно. В тех случаях, когда клиент SMTP не имеет значимого доменного имени (например, при динамическом выделении адресов и недоступности обратного преобразования), клиентам следует передавать полный адрес (см. параграф 4.1.3).

В RFC 2821 и неформальной практике прошлых лет рекомендуется сопровождать точный адрес информацией, которая поможет идентифицировать клиентскую систему. Такая практика не получила широкого распространения и многие серверы SMTP рассматривают дополнительную информацию, как ошибку. В целях обеспечения взаимодействия серверам полезно принимать такую информацию, но клиентам SMTP не следует передавать ее.

Сервер SMTP представляет себя клиенту в данном соединении с помощью отклика на команду приветствия.

Клиентам SMTP следует начинать сессию SMTP с помощью команды EHLO. Если сервер SMTP поддерживает расширенные службы SMTP, он будет передавать позитивный отклик, сообщение об отказе или сообщение об ошибке. Если сервер SMTP (в нарушение данной спецификации) не поддерживает никаких расширений SMTP, он будет генерировать сообщение об ошибке. Старые клиенты SMTP могут (как обсуждалось выше) использовать команду HELO (в соответствии с RFC 821) взамен EHLO, а серверы должны поддерживать команды HELO и давать на них правильный отклик. В любом случае клиент должен использовать команду HELO или EHLO до начала почтовой транзакции.

Эти команды и отклики 250 OK в ответ на них подтверждают, что клиент и сервер SMTP находятся в начальной стадии, в которой нет выполняемых транзакций, а все таблицы состояния и буфера еще пустые.

Синтаксис:

ehlo = "EHLO" SP ( Domain / address-literal ) CRLF
helo = "HELO" SP Domain CRLF

Обычно в ответ на команду EHLO возвращается многострочный отклик, каждая строка которого содержит ключевое слово и может включать один или несколько параметров. В соответствии с требованиями к нормальному синтаксису многострочных откликов ключевые слова следуют после кода 250 и дефиса (для всех строк, кроме последней) или пробела (в последней строке). Ниже приведен пример позитивного отклика с использованием нотации ABNF и символов завершения из RFC 5234 [7]:

   ehlo-ok-rsp    = ( "250" SP Domain [ SP ehlo-greet ] CRLF )
                    / ( "250-" Domain [ SP ehlo-greet ] CRLF
                    *( "250-" ehlo-line CRLF )
                    "250" SP ehlo-line CRLF )
   ehlo-greet     = 1*(%d0-9 / %d11-12 / %d14-127)
                    ; строка любых символов, кроме CR и LF

   ehlo-line      = ehlo-keyword *( SP ehlo-param )

   ehlo-keyword   = (ALPHA / DIGIT) *(ALPHA / DIGIT / "-")
                    ; дополнительный синтаксис ehlo-params зависит от ehlo-keyword

   ehlo-param     = 1*(%d33-126)
                    ; любые символы, включая <SP> и все коды управления (US-ASCII 0-31 и 127,
                    ; включительно)

Хотя в команде EHLO можно использовать любую комбинацию строчных и прописных букв, команда всегда должна распознаваться и обрабатываться как EHLO (заглавные буквы) – это просто расширение практики, указанной в RFC 821 и параграфе 2.4.

Отклик на команду EHLO должен включать ключевые слова (и связанные с ними параметры при наличии последних) для всех команд, не перечисленных как «обязательные» в параграфе 4.5.1, за исключением команд для приватного использования, описанных в параграфе 4.1.5. Команды для приватного использования также можно включать в список.

4.1.1.2. Начало транзакции (MAIL)

Эта команда служит для инициирования почтовой транзакции, в которой почтовые данные доставляются на сервер SMTP, который, в свою очередь, доставляет почту в один или несколько почтовых ящиков или передает ее другой почтовой системе (возможно, с использованием SMTP). Поле аргументов содержит обратный путь и может включать дополнительные параметры. В общем случае команда MAIL может передаваться только при отсутствии незавершенных почтовых транзакций (см. параграф 4.1.4).

Обратный путь указывает почтовый ящик отправителя. В силу исторических причин почтовому ящику может предшествовать список хостов, но такая практика в настоящее время осуждается (см. Приложение C). В некоторых типах сообщений-отчетов, отклики на которые могут порождать петли (например, уведомления о доставке или невозможности доставки) поле обратного пути является пустым (см. параграф 3.6).

Эта команда очищает буферы обратного пути, прямого пути и почтовых данных, а также помещает информацию из строки параметров в буфер обратного пути.

Если согласовано использование расширенного сервиса, команда MAIL может содержать дополнительные параметры.

Синтаксис:

mail = "MAIL FROM:" Reverse-path [SP Mail-parameters] CRLF
4.1.1.3. Получатель (RCPT)

Эта команда служит для идентификации отдельного получателя почтовых данных; при необходимости задать множество получателей команда повторяется соответствующее число раз. Поле аргументов содержит прямой путь и может включать дополнительные параметры.

Прямой путь обычно указывает почтовый ящик получателя. Передающим системам не следует генерировать дополнительный список хостов, известный как source route (маршрут, заданный отправителем). Принимающие системы должны распознавать синтаксис source route, но им следует вырезать спецификацию этого маршрута, используя взамен доменное имя, связанное с почтовым ящиком, как будто отправитель вообще не задавал маршрута.

Подобно этому, трансляторам следует пропускать или игнорировать source route, а имена недопустимо копировать в поле обратного пути. Когда почта приходит к конечному адресату (прямой путь содержит только почтовый ящик получателя), сервер SMTP помещает сообщение в почтовый ящик адресата в соответствии с принятыми соглашениями.

Эта команда добавляет свой аргумент forward-path в буфер прямого пути, не меняя содержимого буферов обратного пути и почтовых данных.

Например, почта, полученная транслятором xyz.com и содержащая в конверте команды:

MAIL FROM:<userx@y.foo.org>
RCPT TO:<@hosta.int,@jkl.org:userc@d.bar.org>

обычно будет пересылаться непосредственно на хост d.bar.org с командами в конверте:

MAIL FROM:<userx@y.foo.org>
RCPT TO:<userc@d.bar.org>

Как указано в Приложении C, хост xyz.com может также транслировать почту через другой хост, используя в конверте команды:

MAIL FROM:<userx@y.foo.org>
RCPT TO:<@hosta.int,@jkl.org:userc@d.bar.org>

или (для трансляции через jkl.org):

MAIL FROM:<userx@y.foo.org>
RCPT TO:<@jkl.org:userc@d.bar.org>

Попытки такого использования трансляторов в настоящее время осуждаются. Поскольку хосты не обязаны транслировать почту, xyz.com может отвергнуть сообщение при получении команды RCPT, используя отклик 550 (отказ в соответствии с используемыми правилами).

Если согласовано использование расширенного сервиса, команда RCPT может также включать параметры, связанные с конкретным типом расширения, предлагаемого сервером. Для клиента недопустима передача параметров, кроме тех, которые связаны с расширением, предложенным сервером в отклике EHLO.

Синтаксис:

rcpt = "RCPT TO:" ( "<Postmaster@" Domain ">" / "<Postmaster>"
/ Forward-path ) [SP Rcpt-parameters] CRLF

Отметим, что в отличие от обычных правил для локальных путей регистр символов в строке Postmaster принимается во внимание.

4.1.1.4. Данные (DATA)

Получатель обычно возвращает отклик 354 на команду DATA и после этого трактует дальнейшие строки (символьные последовательности, завершающиеся <CRLF>, как сказано в параграфе 2.3.7), как почтовые данные от отправителя. Эта команда добавляет почтовые данные в конец буфера данных. Данные могут включать любые из 128 символов ASCII, хотя опыт показывает, что использование управляющих символов (кроме SP, HT, CR, LF) может вызывать проблемы, поэтому следует избегать таких символов.

Данные завершаются строкой, содержащей только точку и последовательность завершения строки (в потоке символов это будет <CRLF>.<CRLF>, см. параграф 4.5.2). Такая последовательность символов указывает на завершение потока данных. Первая последовательность <CRLF> на самом деле завершает последнюю строку почтовых данных (текста сообщения) или (при отсутствии данных) – командную строку DATA (случай отсутствия данных не соответствует этой спецификации, поскольку он требует, чтобы не передавалось ни трассировочных полей заголовка, ни заголовка сообщения, требуемых RFC 5322 [4]). Недопустимо добавление лишних последовательностей <CRLF>, поскольку это будет приводить к вставке пустой строки в сообщение. Единственным исключением из этого правила является обработка сообщений, переданных исходному отправителю без завершающей последовательности <CRLF> в последней строке; в таких случаях отправляющая сообщение система SMTP должна отвергнуть сообщение как некорректное или добавить <CRLF> в конце, чтобы принимающий сервер SMTP смог зафиксировать условие end of data (конец сообщения).

Использование строк, завершающихся одиночным символом <LF>19, как это принято в некоторых UNIX-системах, порождает значительно больше проблем, нежели решает и для серверов SMTP такой подход недопустим, даже во имя повышения отказоустойчивости. В частности, последовательности <LF>.<LF> недопустимо трактовать как эквивалент последовательности <CRLF>.<CRLF> для завершения почтовых данных.

Получение индикатора завершения данных требует от сервера обработки сохраненных данных почтовой транзакции. При этой обработке используется содержимое буферов прямого и обратного пути, а также буфера данных. По завершении команды буферы очищаются. Если обработка команды завершилась успешно, получатель должен передать отклик OK, а при неудаче – отклик о неудачной попытке. Модель SMTP не допускает частичных отказов на этом этапе – сообщение или воспринимается сервером для доставки с возвратом позитивного отклика, или не принимается и сервер возвращает негативный отклик. После передачи позитивного отклика на завершение приема данных сервер принимает на себя полную ответственность за это сообщение (см. параграф 6.1). При обнаружении ошибок впоследствии должны передаваться почтовые уведомления об ошибках, как сказано в параграфе 4.4.

Когда сервер SMTP воспринимает сообщение для трансляции или окончательной доставки, он помещает трассировочную запись, которую также называют time stamp line (строка с временной меткой) или Received в верхней части почтовых данных. Эта запись показывает хост, передавший сообщение, хост-приемник (сервер), а также дату и время приема сообщения. Транслируемые сообщения могут содержать на финальном этапе множество трассировочных записей. Детальное описание трассировки и синтаксиса записей приводится в параграфе 4.4.

Дополнительную информацию по обработке команд DATA можно найти в параграфе 3.3.

Синтаксис:

data = "DATA" CRLF
4.1.1.5. Сброс (RSET)

Эта команда служит для прерывания текущей почтовой транзакции. Все сохраненные в буферах данные должны быть отброшены с очисткой буферов и таблиц состояния. Принимающая сторона в ответ на команду RSET должна передать отклик 250 OK без дополнительных аргументов. Команду RSET клиент может вводить в любой момент транзакции. Эта команда является эквивалентом NOOP (не выполняется никаких действий) при введении сразу после EHLO, до первого использования EHLO в данном сеансе, после завершения и подтверждения передачи данных или непосредственно перед командой QUIT. Для серверов SMTP недопустимо закрывать соединение в результате получения команды RSET – для разрыва соединения служит команда QUIT (см. параграф 4.1.1.10).

Поскольку обработка команд EHLO требует некоторых дополнительных операций на сервере, использование команды RSET обычно более эффективно, чем повторный ввод EHLO, хотя формальная семантика одинакова.

Существуют обстоятельства (не контролируемые данной спецификацией), при которых сервер SMTP может получить индикацию разрыва или сброса соединения на нижележащем уровне TCP. Для сохранения отказоустойчивости почтовых систем серверам SMTP следует быть готовыми к таким ситуациям и трактовать их как получение команды QUIT до потери соединения.

Синтаксис:

rset = "RSET" CRLF
4.1.1.6. Проверка (VRFY)

Эта команда просит получателя подтвердить аргументы, идентифицирующие пользователя или почтовый ящик. Если это имя пользователя, возвращается информация в соответствии с описанием в параграфе 3.5.

Данная команда не воздействует на содержимое буферов обратного и прямого пути, а также буфера почтовых данных.

Синтаксис:

vrfy = "VRFY" SP String CRLF
4.1.1.7. Преобразование списка (EXPN)

Эта команда просит подтвердить аргументы, идентифицирующие список рассылки, и (при наличии указанного списка) возвращает список членов. При успешном завершении команды возвращается информация, описанная в параграфе 3.5. Этот отклик будет содержать множество строк за исключением тривиальных случаев списка с одним адресом.

Данная команда не воздействует на содержимое буферов обратного и прямого пути, а также буфера данных.

Синтаксис:

expn = "EXPN" SP String CRLF
4.1.1.8. Справка (HELP)

По этой команде сервер возвращает краткие справочные сведения о командах и аргументах. Команда может использовать в качестве аргумента имя другой команды для получения соответствующей справки.

Данная команда не воздействует на содержимое буферов обратного и прямого пути, а также буфера данных. Команда может использоваться в любой момент.

Серверам следует поддерживать команду HELP без аргументов и можно поддерживать команду с аргументами.

Синтаксис:

help = "HELP" [ SP String ] CRLF
4.1.1.9. Пустая операция (NOOP)

Эта команда не влияет на значения параметров и выполнение введенных ранее команд. По команде сервер просто передает отклик 250 OK.

Данная команда не воздействует на содержимое буферов обратного и прямого пути, а также буфера данных и может вводиться в любой момент. При наличии у команды параметров серверу следует игнорировать их.

Синтаксис:

noop = "NOOP" [ SP String ] CRLF
4.1.1.10. Завершение сеанса (QUIT)

Получив эту команду сервер должен возвратить отклик и 221 OK закрыть канал передачи.

Для получателя недопустим преднамеренный разрыв соединения до получения команды QUIT и отклика на нее (даже при возникновении ошибок). Для сервера недопустим преднамеренный разрыв соединения до передачи команды QUIT и следует дождаться отклика на нее (даже при возникновении ошибок в результате выполнения предыдущих команд). Если соединение закрыто преждевременно в нарушение сказанного выше или в результате системного или сетевого сбоя, сервер должен прервать все незавершенные транзакции, не отказываясь от выполненных транзакций, и (в общем случае) должен действовать, как при получении информации об ошибке во время выполнения команды или транзакции (т. е. отклик 4yz).

Команда QUIT может быть введена в любой момент. Незавершенная почтовая транзакция прерывается.

Синтаксис:

quit = "QUIT" CRLF
4.1.1.11. Mail-Parameter and Rcpt-Parameter Error Responses

Если сервер SMTP не распознает или не поддерживает один или более параметров конкретной команды MAIL FROM или RCPT TO, он будет возвращать код 555.

Если по той или иной причине сервер временно не способен принят один или множество параметров, связанных с командой MAIL FROM или RCPT TO, а определение соответствующего параметра не требует использования иного кода, серверу следует возвращать код 455.

Ошибки, связанные с конкретными параметрами и их значениями, определяются в соответствующих RFC.

4.1.2. Синтаксис аргументов команд

Ниже приведен синтаксис полей аргументов перечисленных выше команд (по возможности, используется синтаксис, описанный в RFC 5234 [7]). Некоторые из приведенных ниже вариантов используются только с маршрутами source route, как описано в Приложении C. Обозначения, не определенные здесь (типа ALPHA, DIGIT, SP, CR, LF, CRLF), описаны в разделе 6 RFC 5234 [7] или при формальном определении синтаксиса сообщений в RFC 5322 [4].

   Reverse-path   = Path / "<>"
   Forward-path   = Path
   Path           = "<" [ A-d-l ":" ] Mailbox ">"
   A-d-l          = At-domain *( "," At-domain )
                  ; отметим, что эта форма, называемая source route, должна приниматься, 
                  ; ее не следует генерировать и следует игнорировать.
   At-domain      = "@" Domain
   Mail-parameters  = esmtp-param *(SP esmtp-param)
   Rcpt-parameters  = esmtp-param *(SP esmtp-param)
   esmtp-param    = esmtp-keyword ["=" esmtp-value]
   esmtp-keyword  = (ALPHA / DIGIT) *(ALPHA / DIGIT / "-")
   esmtp-value    = 1*(%d33-60 / %d62-126)
                  ; любые символы кроме =, SP и управляющих кодов. Если эта строка 
                  ; представляет собой почтовый адрес (например, Mailbox), следует 
                  ; использовать синтаксис xtext [32].
   Keyword        = Ldh-str
   Argument       = Atom
   Domain         = sub-domain *("." sub-domain)
   sub-domain     = Let-dig [Ldh-str]
   Let-dig        = ALPHA / DIGIT
   Ldh-str        = *( ALPHA / DIGIT / "-" ) Let-dig
   address-literal  = "[" ( IPv4-address-literal /
                    IPv6-address-literal /
                    General-address-literal ) "]"
                    ; см. параграф 4.1.3
   Mailbox        = Local-part "@" ( Domain / address-literal )
   Local-part     = Dot-string / Quoted-string
                  ; регистр символов может различаться
   Dot-string     = Atom *("."  Atom)
   Atom           = 1*atext
   Quoted-string  = DQUOTE *QcontentSMTP DQUOTE
   QcontentSMTP   = qtextSMTP / quoted-pairSMTP
   quoted-pairSMTP  = %d92 %d32-126
                    ; т. е., обратная дробная черта, за которой следует символ 
                    ; псевдографики ASCII (включая \) или пробел (SP)
   qtextSMTP      = %d32-33 / %d35-91 / %d93-126
                  ; т. е., кавычках допускается использование любых символов псевдографики 
                  ; ASCII (за исключением \ и двойных кавычек) или пробелов без символа
                  ; обратной дробной черты
   String         = Atom / Quoted-string

Хотя в приведенном выше описании требования к локальной части адреса относительно либеральны, хостам, принимающим почту, следует избегать организации почтовых ящиков, для которых Local-part требует (или использует) форму Quoted-string или различается регистр символов. Для любых задач, требующих генерации или сравнения полей Local-part, все формы Quoted-string должны трактоваться как эквивалентные и передающим системам следует передавать форму, использующую минимальное квотирование.

Недопустимо определять почтовые ящики таким образом, чтобы в SMTP требовалось использование символов, не входящих в набор ASCII (октетов с 1 в старшем бите) или управляющих кодов ASCII (десятичные значения 0-31 и 127). Такие символы недопустимо использовать в командах MAIL и RCPT или других командах, содержащих имена почтовых ящиков.

Отметим, что обратный слэш (\) относится к символам квотирования, используемым для индикации буквального (literally) использования следующего символа (взамен обычной интерпретации). Например, запись «Joe\, Smith» соответствует “Joe, Smith”, т. е. Запятая после знака \ трактуется именно как запятая, а не специальный символ.

Для обеспечения взаимодействия и совместимости с DNS в именовании и приложениях (см., например, параграф 2.3.1 базового стандарта DNS — RFC1035 [2]) недопустимо включать в метки доменных имен для клиентов и серверов SMTP никакие символы, кроме букв латиницы, цифр и дефиса. В частности, символ подчеркивания (underscore) использовать нельзя. Серверы SMTP, получающие команды с некорректными символами (при отсутствии других причин для отказа), должны отвергать такие команды с возвратом отклика 501 (это правило, подобно другим, может быть изменено расширениями SMTP).

4.1.3. «Дословные» адреса

Иногда хост не знает доменного имени и почтовая связь (в частности, передача сообщений об ошибках) блокируется. Для решения этой проблемы в качестве альтернативы доменному имени может использоваться специальная форма адреса (literal address). Для адресов IPv4 эта форма использует десятичное представление байтов IP-адреса с разделением точками. Адреса заключаются в квадратные скобки (например, [123.255.37.2]), которые говорят об использовании адреса IPv4 в десятичном представлении с разделением точками. Для IPv6 и других форм адресации, которые могут быть в последствии стандартизованы, форма включает стандартизованный тег, идентифицирующий синтаксис адреса, (двоеточие — 🙂 и собственно адрес в формате, заданном стандартом [например, RFC 4291 [8] для IPv6].

В частности, используются следующие варианты:

   IPv4-address-literal  = Snum 3("."  Snum)
   IPv6-address-literal  = "IPv6:" IPv6-addr
   General-address-literal  = Standardized-tag ":" 1*dcontent
   Standardized-tag  = Ldh-str
                     ; должен быть опубликован в RFC со статусом Standards-Track  и 
                     ; зарегистрирован IANA
   dcontent       = %d33-90 / ; Печатаемый символ US-ASCII
                  %d94-126    ; исключая "[", "\", "]"
   Snum           = 1*3DIGIT
                  ; значения от 0 до 255 в десятичном представлении
   IPv6-addr      = IPv6-full / IPv6-comp / IPv6v4-full / IPv6v4-comp
   IPv6-hex       = 1*4HEXDIG
   IPv6-full      = IPv6-hex 7(":" IPv6-hex)
   IPv6-comp      = [IPv6-hex *5(":" IPv6-hex)] "::"
                  [IPv6-hex *5(":" IPv6-hex)]
                  ; "::" представляет по крайней мере две 16-битовых группы нулей. В 
                  ; дополнение может использоваться до 6 групп.
   IPv6v4-full    = IPv6-hex 5(":" IPv6-hex) ":" IPv4-address-literal
   IPv6v4-comp    = [IPv6-hex *3(":" IPv6-hex)] "::" [IPv6-hex *3(":" IPv6-hex) ":"]
                  IPv4-address-literal
                 ; :: представляет по крайней мере две 16-битовых последовательности нулей
                 ; в дополнение к :: может присутствовать не более 4 групп и
                 ; IPv4-address-literal

4.1.4. Порядок команд

Для порядка использования команд существуют некоторые ограничения.

Сеанс, который будет включать почтовую транзакцию, должен быть сначала инициализирован командой EHLO. Серверам SMTP следует воспринимать без инициализации команды, не использующие почтовых транзакций (например, VRFY или EXPN).

Команда EHLO может вводиться клиентом в действующем сеансе. При первом использовании команды в данной сессии сервер SMTP должен очистить все буферы и сбросить состояние, как при получении команды RSET. Иными словами, последовательность команд RSET — EHLO является избыточной, и мало полезна ввиду выполнения ненужных повторяющихся действий.

Если команда EHLO неприемлема для сервера SMTP, он должен возвращать отклик 501, 500, 502 или 550. Сервер SMTP должен сохранять после передачи таких откликов состояние, которое было до получения команды EHLO.

Клиент SMTP должен (по возможности) предоставлять в параметрах команд EHLO первичное доменное имя (не CNAME или MX) своего хоста, как сказано в параграфе 2.3.5. Если это невозможно (например, клиент использует динамический адрес и не имеет явного имени), следует взамен имени использовать «дословный» адрес.

Сервер SMTP может проверять соответствие доменного имени в команде EHLO реальному IP-адресу клиента. Однако для сервера недопустимо отвергать сообщение по результатам проверки. Эти результаты могут использоваться для протоколирования и трассировки. Отметим, что этот запрет применим только к соответствию параметра и адреса IP; дополнительное рассмотрения вопросов отказа от приема входящих соединений или почтовых сообщений проводится в параграфе 7.9.

Команды NOOP, HELP, EXPN, VRFY и RSET могут использоваться любой момент на протяжении всего сеанса и даже без предварительной организации сеанса. Серверам SMTP следует нормально обрабатывать эти команды (т. е., не выдавать в ответ отклик 503) даже в тех случаях, когда эти команды используются до получения команды EHLO; клиентам следует открывать сессию с помощью команды EHLO до ввода перечисленных команд.

Если следовать этим правилам, пример из RFC 821, показывающий отклик «550 access denied to you» в ответ на команду EXPN некорректен, если команда EHLO не была введена до EXPN или клиенту не было отказано в обслуживании на основе IP-адреса клиента или по результатам аутентификации или аналогичных механизмов.

Команда MAIL (или устаревшие команды SEND, SOML, SAML) начинает почтовую транзакцию. После начала транзакции последняя включает начальную команду, одну или несколько команд RCPT и команду DATA, вводимые в указанном порядке. Почтовая транзакция прерывается командой RSET, новой командой EHLO или командой QUIT. В сеансе может происходить множество последовательных транзакций или не быть транзакций вообще. Недопустимо передавать команду MAIL (или SEND, SOML, SAML), если почтовая транзакция уже открыта, т. е., эту команду можно передавать только при отсутствии в сеансе продолжающейся почтовой транзакции – предыдущая транзакция должна быть завершена успешным выполнением команды DATA или прервана командой RSET или новой командой EHLO.

Если аргумент начинающей транзакцию команды неприемлем, должен возвращаться отклик 501 и сервер SMTP должен сохранять свое состояние. Если в сеансе нарушается порядок команд в такой степени, что это препятствует их выполнению сервером, последний должен возвратить отклик 503, сохраняя свое состояние.

Последней командой сеанса должна быть команда QUIT. Клиентам следует использовать команду QUIT для разрыва соединения даже в тех случаях, когда команда организации сеанса не была передана и воспринята.

4.1.5. Команды частного использования

Как было сказано в параграфе 2.2.2, команды, начинающиеся с X, могут использоваться в результате двухстороннего соглашения между клиентом (отправитель) и сервером (получатель) SMTP. Предполагается, что сервер SMTP, не распознающий такие команды, будет возвращать отклик 500 Command not recognized. Сервер SMTP с расширенными функциями может перечислить имена, связанные с командами частного использования, в своем отклике на команду EHLO.

Команды, переданные или воспринятые системами SMTP и не начинающиеся с X, должны соответствовать требованиям параграфа 2.2.2.

4.2. Отклики SMTP

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

Детальное описание последовательностей команда – отклик приводится в параграфе 4.3.

Отклик SMTP содержит трехзначный номер (передается как три числовых символа), за которым обычно следует строка текста, если в данной спецификации явно не указано иное. Числовые коды предназначены для автоматического определения состояния, в которое нужно перейти, текст – для человека. Цифровой код обеспечивает требуемую информацию и программе-клиенту не требуется просматривать текстовую часть отклика, которую в результате можно просто отбрасывать или передавать пользователю. Имеющиеся исключения из этого правила явно указаны в спецификации. В частности, коды откликов 220, 221, 251, 421 и 551 связаны с текстовыми сообщениями, которые клиентская программа должна разбирать и интерпретировать. В общем случае текст может зависеть от сервера или текущего контекста, т. е. каждый оклик может содержать разный текст. Обсуждение теоретических вопросов генерации откликов приводится в параграфе 4.2.1. Формально отклик определяется как последовательность: трехзначный код, <SP>, строка текста, <CRLF> или многострочный текст (см. параграф 4.2.1). Поскольку (в нарушение данной спецификации) текст иногда не включается в отклик, получившим такой отклик клиентам следует быть готовыми к обработке только числового кода (возможно, после кода в отклик будет помещен символ пробела). Предполагается, что лишь команды EHLO, EXPN и HELP могут возвращать многострочные отклики при нормальных обстоятельствах, однако такие отклики допускаются для всех команд.

В формате ABNF отклик сервера имеет вид:

   Greeting       = ( "220 " (Domain / address-literal)
                  [ SP textstring ] CRLF ) /
                  ( "220-" (Domain / address-literal)
                  [ SP textstring ] CRLF
                  *( "220-" [ textstring ] CRLF )
                  "220" [ SP textstring ] CRLF )
   textstring     = 1*(%d09 / %d32-126) ; HT, SP, Printable US-ASCII
   Reply-line     = *( Reply-code "-" [ textstring ] CRLF )
                  Reply-code [ SP textstring ] CRLF
   Reply-code     = %x32-35 %x30-35 %x30-39

где Greeting появляется только в откликах с кодом 220, анонсирующих открытие сервером своей части соединения. Другие возможные варианты откликов сервера на открытие соединения следуют синтаксису Reply-line.

Серверам SMTP следует передавать только отклики с кодами, указанными в этой спецификации, сопровождая их текстом, указанным в примерах, когда это приемлемо.

Клиенты SMTP должны определять свои действия только на основе кода отклика, а не его текста (за исключением change of address 251 и 551, а при необходимости и 220, 221, 421). В общем случае клиент должны воспринимать любой текст и отклики без текста (хотя серверам не следует передавать откликов, содержащих только код). Пробел после кода отклика рассматривается как часть текста. По возможности клиенту SMTP следует проверять первую цифру кода отклика (индикация важности).

Приведенный ниже список кодов недопустимо рассматривать как неизменный. Хотя добавление новых кодов является редким и значимым событием (предпочтительно добавление новой информации в текстовую часть отклика), новые стандарты и проекты стандартов могут добавлять коды откликов. Следовательно, отправители SMTP должны быть готовы к обработке кодов, не указанных в данной спецификации. Такая обработка должна основываться на интерпретации только первой цифры кода.

При отсутствии согласованных с клиентом расширений для серверов SMTP недопустимо передавать отклики, в которых первая цифра кода отличается от 2, 3, 4 или 5. Клиентам при получении таких кодов следует трактовать их как признак неисправимой ошибки и прерывать почтовую транзакцию.

4.2.1. Важность кодов отклика и теоретические вопросы

Каждая из трех цифр кода отклика имеет свой уровень значимости. Первая цифра определяет успех, неудачу или незавершенность команды. Для простых клиентов SMTP или при получении неизвестного кода можно определить дальнейшие действия (продолжение, повтор, отказ и т. п.), ограничившись первой цифрой кода. Клиенты SMTP, которые хотят получить более точную информацию о происходящем (ошибка почтовой системы, некорректный синтаксис и т. п.), могут использовать вторую цифру кода. Третья цифра и дополнительная информация в отклике служат для предоставления наиболее подробных сведений.

Первая цифра кода может принимать 4 значения:

2yz – позитивный отклик о завершении

Запрошенная операция успешно завершена и могут вводиться новые команды.

3yz – позитивный промежуточный отклик

Команда была воспринята, но запрошенные действия пока не выполнены и сервер ждет дополнительной информации. Клиенту SMTP следует передать другую команду, содержащую требуемые данные. Отклики этой группы используются в командах с последовательным выполнением (например, DATA).

4yz – негативный отклик о временных проблемах

Команда не принята и запрошенная операция не выполнена. Однако условия, не позволяющие выполнить команду, носят временный характер и операция может быть запрошена вновь. Отправителю следует вернуться к началу последовательности команд (если таковая была). Понятие «временный» является недостаточно строгим и взаимодействующие стороны (клиент и сервер SMTP) должны одинаково интерпретировать его. Для каждого отклика этой группы время может различаться, но клиенту SMTP следует продолжать попытки. Различия между временными и постоянными проблемами (коды 5yz) достаточно условны и отклики 4yz обычно возвращаются в тех случаях, когда возможен позитивный результат при повторе без изменения формы команды и свойств отправителя или получателя (т. е., команда просто может быть повторена без изменений).

5yz — негативный отклик о постоянных проблемах

Команда не принята и запрошенная операция не выполнена. Клиенту SMTP не следует просто повторять команду, поскольку она заведомо не будет выполнена. Некоторые «постоянные» проблемы могут быть решены корректировкой команд, поэтому пользователь (человек) может запросить у клиента SMTP повтора операции после корректировки команд или их порядка (например, после проверки корректности ввода или изменения параметров учетной записи).

Нет ничего дурного в том, что протокол FTP [34] использует сходную архитектуру откликов и коды SMTP основаны на модели FTP. Однако в SMTP используется модель «команда — отклик», тогда как командный протокол FTP является асинхронным; кроме того, принятая в FTP группа кодов 1yz не используется в модели SMTP.

Вторая цифра отклика показывает категорию ошибки:

x0z Синтаксис: отклик связан с синтаксической ошибкой (команда синтаксически корректна, но отклик не может быть отнесен к другим категориям, нереализованная команда, излишняя команда и т. п.).

x1z Информация: отклик на запрос информации (например, справка или состояние).

x2z Соединение: отклики, относящиеся к каналу передачи.

x3z Не задан.

x4z Не задан.

x5z Почтовая система: отклики показывают состояние принимающей почтовой системы по отношению к запрошенной передаче или другим действиям почтовой системы.

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

Например, команды типа NOOP, при успешном завершении которых клиент SMTP не получает новой информации, будут возвращать код 250. Отклик 502 возвращается при запросе нереализованной команды, а отклик 504 – для реализованных команд с неподдерживаемыми параметрами.

Текст отклика может содержать более одной строки и в таких случаях текст должен маркироваться так, чтобы клиент SMTP мог узнать о завершении текста. Это требует использования для многострочных откликов специального формата.

Формат многострочных откликов требует, чтобы каждая строка (кроме последней) начиналась кодом отклика, после которого следует дефис (-), а далее — текст. В последней строке вместо дефиса используется пробел — <SP>, после которого может следовать текст, и <CRLF>. Как указано выше, серверам следует передавать символ <SP>, если далее не будет текста, но клиент должен быть готов к отсутствию символа пробела.

Ниже приведен пример многострочного отклика:

250-Первая строка
250-Вторая строка
250-234 Текст, начинающийся с числа
250 Последняя строка

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

4.2.2. Коды откликов (по группам)

500

Syntax error, command unrecognized

Синтаксическая ошибка, команда не распознана (это может говорить о слишком длинной команде).

501

Syntax error in parameters or arguments

Синтаксическая ошибка в параметрах или аргументах.

502

Command not implemented

Команда не реализована (см. параграф 4.2.4).

503

Bad sequence of commands

Некорректный порядок команд.

504

Command parameter not implemented

Параметр команды не реализован.

211

System status, or system help reply

Отклик с системной справкой или состоянием системы.
214 Help message Информация о работе с сервером или отдельных командах.

220

<domain> Service ready

Служба для указанного домена готова.

221

<domain> Service closing transmission channel

Закрывается канал передачи для указанного домена.

421

<domain> Service not available, closing transmission channel

Для указанного домена обслуживание невозможно и канал связи закрывается. Это может быть откликом на любую команду, если известно, что сервис должен быть отключен.

250

Requested mail action okay, completed

Операция благополучно завершена.

251

User not local; will forward to <forward-path>

Нелокальный пользователь – почта будет пересылаться по прямому пути (см. параграф 3.4).

252

Cannot VRFY user, but will accept message and attempt delivery

Не удается проверить почтовый ящик, но сообщение принято и сервер попытается его доставить (см. параграф 3.5.3).

455

Server unable to accommodate parameters

Сервер не может принять параметры.

555

MAIL FROM/RCPT TO parameters not recognized or not implemented

Параметры команды MAIL FROM или RCPT TO не удалось распознать или их поддержка не реализована.

450

Requested mail action not taken: mailbox unavailable

Запрошенная операция невозможна – почтовый ящик недоступен (например, занят или временно заблокирован в соответствии с политикой).

550

Requested mail action not taken: mailbox unavailable

Запрошенная операция невозможна – почтовый ящик недоступен (например, почтовый ящик не найден, к нему нет доступа или команда отвергнута в соответствии с заданной политикой).

451

Requested action aborted: error in processing

Запрошенная операция прервана в результате ошибки.

551

User not local; please try <forward-path>

Нелокальный пользователь – попытайтесь использовать прямой путь (см. параграф 3.4).

452

Requested action not taken: insufficient system storage

Запрошенная операция не выполнена по причине нехватки пространства (на диске).

552

Requested mail action aborted: exceeded storage allocation

Запрошенная операция прервана по причине превышения выделенного (дискового) пространства.

553

Requested action not taken: mailbox name not allowed

Запрошенная операция не выполнена – недопустимый почтовый ящик (например, синтаксическая ошибка в имени ящика).

354

Start mail input; end with <CRLF>.<CRLF>

Начало ввода данных. Завершение по <CRLF>.<CRLF>

554

Transaction failed или No SMTP service here Отказ транзакции или отсутствие поддержки сервиса SMTP (при попытке соединения)

4.2.3. Коды откликов в порядке номеров

211

System status, or system help reply

Отклик с системной справкой или состоянием системы.
214 Help message Информация о работе с сервером или отдельных командах.

220

<domain> Service ready

Служба для указанного домена готова.

221

<domain> Service closing transmission channel

Закрывается канал передачи для указанного домена.

250

Requested mail action okay, completed

Операция благополучно завершена.

251

User not local; will forward to <forward-path>

Нелокальный пользователь – почта будет пересылаться по прямому пути (см. параграф 3.4).

252

Cannot VRFY user, but will accept message and attempt delivery

Не удается проверить почтовый ящик, но сообщение принято и сервер попытается его доставить (см. параграф 3.5.3).

354

Start mail input; end with <CRLF>.<CRLF>

Начало ввода данных. Завершение по <CRLF>.<CRLF>.

421

<domain> Service not available, closing transmission channel

Для указанного домена обслуживание невозможно и канал связи закрывается. Это может быть откликом на любую команду, если известно, что сервис должен быть отключен.

450

Requested mail action not taken: mailbox unavailable

Запрошенная операция невозможна – почтовый ящик недоступен (например, занят или временно заблокирован в соответствии с политикой).

451

Requested action aborted: error in processing

Запрошенная операция прервана в результате ошибки.

452

Requested action not taken: insufficient system storage

Запрошенная операция не выполнена по причине нехватки пространства (на диске).

455

Server unable to accommodate parameters

Сервер не может принять параметры.

500

Syntax error, command unrecognized

Синтаксическая ошибка, команда не распознана (это может говорить о слишком длинной команде).

501

Syntax error in parameters or arguments

Синтаксическая ошибка в параметрах или аргументах.

502

Command not implemented

Команда не реализована (см. параграф 4.2.4).

503

Bad sequence of commands

Некорректный порядок команд.

504

Command parameter not implemented

Параметр команды не реализован.

550

Requested mail action not taken: mailbox unavailable

Запрошенная операция невозможна – почтовый ящик недоступен (например, почтовый ящик не найден, к нему нет доступа или команда отвергнута в соответствии с заданной политикой).

551

User not local; please try <forward-path>

Нелокальный пользователь – попытайтесь использовать прямой путь (см. параграф 3.4).

552

Requested mail action aborted: exceeded storage allocation

Запрошенная операция прервана по причине превышения выделенного (дискового) пространства.

553

Requested action not taken: mailbox name not allowed

Запрошенная операция не выполнена – недопустимый почтовый ящик (например, синтаксическая ошибка в имени ящика).

554

Transaction failed или No SMTP service here Отказ транзакции или отсутствие поддержки сервиса SMTP (при попытке соединения).

555

MAIL FROM/RCPT TO parameters not recognized or not implemented

Параметры команды MAIL FROM или RCPT TO не удалось распознать или их поддержка не реализована.

4.2.4. Отклик 502

У разработчиков часто возникают вопросы об использовании отклика 502 (Command not implemented – команда не реализована). Код 502 следует использовать в тех случаях, когда сервер SMTP распознал команду, но не умеет ее выполнять. Если команда не распознана, следует возвращать код 500. Для систем SMTP с расширенными функциями в откликах на команду EHLO недопустимо указывать команды, приводящие к отклику 502 или 500.

4.2.5. Коды откликов после DATA и последующих <CRLF>.<CRLF>

Когда сервер SMTP возвращает позитивный отклик (код 2yz) после завершения команды DATA с последовательностью <CRLF>.<CRLF>, этот сервер принимает на себя ответственность за следующие операции:

  • доставка сообщения (если почтовый ящик получателя существует);
  • при неудачной попытке доставки в результате временных проблем предпринимается разумное число повторных попыток с перерывами (см. параграф 4.5.4);
  • при неудаче вследствие долгосрочных проблем или после исчерпания заданного числа попыток в случае временных проблем исходному отправителю сообщения посылается уведомление (по адресу из команды MAIL).

Когда сервер SMTP возвращает отклик о временных проблемах (4yz) после команды DATA с завершающей последовательностью <CRLF>.<CRLF>, недопустимо предпринимать какие-то последующие попытки доставки этого сообщения. Клиент SMTP сохраняет за собой ответственность за доставку этого сообщения и может возвратить его пользователю или снова поставить в очередь на доставку (см. параграф 4.5.4.1).

Пользователю, отправившему сообщение, следует предоставить возможность интерпретировать характер проблем (временные или постоянные), передав ему сообщение по электронной почте или иным способом. Если клиент SMTP смог решить проблему доставки самостоятельно, уведомление пользователю не передается.

Когда сервер SMTP возвращает информацию о долгосрочных проблемах (код 5yz) после выполнения команды DATA с завершающей последовательностью <CRLF>.<CRLF>, недопустимо предпринимать какие-либо дополнительные попытки доставки сообщения. Как и для случая временных проблем, ответственность за доставку сообщения сохраняется за клиентом SMTP, но клиенту не следует пытаться повторить доставку тому же серверу без просмотра сообщения пользователем и внесения соответствующих изменений.

4.3. Порядок следования команд и откликов

4.3.1. Обзор

Связь между отправителем и получателем в процессе представляет собой диалог, контролируемый отправителем. Отправитель вводит команды, а получатель возвращает отклики на них. Если не согласованы другие условия с использованием расширенного сервиса, отправитель должен получить отклик на переданную команду прежде, чем посылать следующую. Одним из важных откликов является приветствие при организации соединения. Обычно получатель передает отклик 220 Service ready при завершении организации соединения. Отправителю следует дождаться этого отклика и только потом передавать следующие команды.

Примечание. Все отклики-приветствия включают официальное имя хоста (FQDN), на котором работает сервер, в качестве первого слова после кода. В некоторых случаях у хоста может не быть собственного имени. Обсуждение альтернативных имен для таких ситуаций приводится в параграфе 4.1.3.

Ниже приведены 3 примера приветствий:

220 ISIF.USC.EDU Service ready
220 mail.example.com SuperSMTP v 6.1.2 Service ready
220 [10.0.0.1] Clueless host service ready

В приведенной ниже таблице даны варианты откликов при удачном и неудачном завершении каждой команды. Следует строго придерживаться этих кодов. Получатель может изменять текст отклика, но смысл отклика и действия в ответ на него определяются числовым кодом и последовательностью введенных ранее команд и должны быть одинаковы.

4.3.2. Последовательности команда — отклик

Для каждой команды указаны обычные позитивные отклики. Используемые перед позитивными откликами префиксы включают I (промежуточный), S (успех) и E (ошибка). Поскольку некоторые серверы могут генерировать иные отклики в соответствующих обстоятельствах и с учетом возможности появления новых кодов, клиентам SMTP следует (по возможности) интерпретировать только первую цифру кода. Кроме того, клиент должен быть готов к работе с неизвестными кодами, также интерпретируя в них только первую цифру. За исключением расширений, использующих механизмы, описанные в параграфе 2.2, для серверов SMTP недопустима передача кодов, содержащих что-либо сверх 3 цифр или использующих цифры, не входящие в разрешенный диапазон 2 — 5 (включительно).

Описанные здесь варианты откликов на команды (в принципе, и сами коды) могут дополняться или изменяться при использовании расширений SMTP, предлагаемых сервером и понятных (запрашиваемых) клиентом. Однако, если целью является более четкая грануляция кодов, а не определение кодов для совершенно новых случаев, следует использовать систему, описанную в RFC 3463 [25], чтобы не изобретать новых кодов.

В дополнение к перечисленным в таблице кодам любые команды SMTP могут возвращать три приведенных ниже кода в соответствующих нештатных ситуациях:

500 — для случая command line too long (слишком длинная команда) или при получении непонятной команды. Отметим, что отклик command not recognized (неизвестная команда) в ответ на команду из обязательного набора является нарушением данной спецификации. Аналогично, генерация сообщения command too long в ответ на команду, длина которой не превышает 512 будет нарушением требований параграфа 4.5.3.1.4.

501 Syntax error in command or arguments (синтаксическая ошибка в команде или аргументах). Для поддержки будущих расширений командам, включенным в данную спецификацию, как команды без аргументов (DATA, RSET, QUIT), следует возвращать отклик 501 при получении команды с аргументами, если иное не согласовано в анонсированном EHLO расширении.

421 Service shutting down and closing transmission channel — сервис отключен с разрывом коммуникационного канала.

В нормальных условиях в ответ на команды могут возвращаться следующие отклики:

Команда Успех (S) Неудача (E)
Организация соединения 220 554
EHLO или HELO 250 50420, 550, 50221
MAIL 250 552, 451, 452, 550, 553, 503, 455, 555
RCPT 250, 25122 550, 551, 552, 553, 450, 451, 452, 503, 455, 555
DATA (промежуточный отклик 354) 250 552, 554, 451, 452, 450, 550 (отказ в соответствии с политикой)
DATA 503,55
RSET 250
VRFY 250, 251, 252 550, 551, 553, 502, 504
EXPN 250, 252 550, 500, 502, 504
HELP 211, 214 502, 504
NOOP 250
QUIT 221

4.4. Трассировочная информация

Когда сервер SMTP получает сообщение для доставки или дальнейшей обработки, он должен вставить трассировочную информацию (time stamp или Received) в начало содержимого, как описано в параграфе 4.1.1.4.

Трассировочная строка должна иметь следующую структуру:

  • В поле FROM, которое должно обеспечиваться в среде SMTP, следует включать (1) имя хоста-отправителя, представленное в команде EHLO, и (2) IP-адрес отправителя, определенный из соединения TCP.
  • Поле ID может включать @, как предложено в RFC 822, но это необязательно.
  • Поле FOR (если оно присутствует) должно содержать список элементов <path>, даже при использовании множества команд RCPT. Это может влиять на безопасность системы, поэтому нежелательно включать такие списки (см. параграф 7.2).

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

По мере расширения сети Internet просмотр строк Received становится все более важным средством диагностики почтовых систем, особенно для обнаружения медленно работающих трансляторов. Серверам SMTP, которые создают поля Received, следует явно задавать временной сдвиг (например, -0800), а не использовать имена часовых поясов. По возможности следует указывать локальное время (с учетом пояса), а не UT23. Такая информация дает больше сведений о локальных условиях. Если требуется использовать UT, получателю достаточно использовать простую арифметику для получения нужного значения. Использование формата UT приводит к потере информации о часовом поясе сервера. Если желательно указывать имя часового пояса, его следует давать как комментарий.

Когда сервер SMTP обеспечивает «окончательную доставку» сообщения, он вставляет строку обратного пути (return-path) в начало почтовых данных. Использование return-path является обязательным и почтовые системы должны поддерживать это. Строка обратного пути сохраняет значение параметра <reverse-path> из команды MAIL. Окончательная доставка сообщения все еще сохраняет его в среде SMTP. Обычно сообщение доставляется в почтовый ящик пользователя или почтовое хранилище, но в некоторых случаях сообщение может подвергаться дополнительной обработке или передаваться другими почтовыми системами.

Адрес почтового ящика в пути возврата может отличаться от адреса отправителя. Например, сообщения об ошибках могут доставляться не отправителю, а направляться по специальному адресу для обработки. При использовании списков рассылки такой подход является общепринятым и весьма полезным, поскольку сообщения об ошибках направляются администратору списка, а не отправителю исходного письма.

В приведенном выше тексте предполагается, что окончательные почтовые данные будут начинаться со строки обратного пути, за которой будет следовать одна или несколько строк с временными метками. После этих строк будет следовать оставшаяся часть почтовых данных — почтовый заголовок и тело сообщения (RFC 5322 [4]).

В некоторых случаях серверу SMTP сложно определить обеспечивает ли он окончательную доставку, поскольку пересылка и другие операции могут происходить после восприятия сообщения для доставки. Поэтому все последующие почтовые системы (трансляторы, шлюзы, системы пересылки) могут удалять строку обратного пути и перестраивать команду MAIL, обеспечивая в доставленном сообщении единственную строку обратного пути.

Генерирующей сообщение системе SMTP не следует передавать сообщений, в заголовок которых уже включено поле Return-path. Для серверов SMTP, обеспечивающих трансляцию, недопустимо проверять данные сообщения и, особенно, наличие поля заголовка Return-path. Сервер SMTP, обеспечивающий окончательную доставку, может удалять имеющийся заголовок Return-path перед добавлением своего.

Основным назначением Return-path является указание адреса, по которому следует доставлять сообщения об ошибках. Для однозначности следует включать в сообщение единственный вариант обратного пути. Системам, использующим синтаксис RFC 822 с отличным от SMTP транспортом, следует указывать однозначный адрес, связанный с транспортным конвертом, по которому должна возвращаться информация об ошибках (например, о невозможности доставки).

Историческое замечание. Приведенные в RFC 822 сведения, отвергающие использование заголовка Return-path (или адреса возврата из команды MAIL в конверте) для доставки информации об ошибках, неприменимы в среде Internet. Адрес обратного пути (копируемый в Return-path) должен использоваться для доставки всех сообщений об ошибках в процессе доставки.

В частности:

  • Шлюзам из SMTP в другие среды следует вставлять обратный путь, если у них нет информации о том, что другая среда также использует в адресах доменные имена Internet и поддерживает отдельный конверт с адресом отправителя.
  • Шлюзам из других сред в SMTP следует удалять из заголовка строку обратного пути и копировать эту информацию в конверт SMTP или объединять ее с присутствующей в конверте информацией из другой транспортной системы для построения обратного пути для команды MAIL в конверте SMTP.

Сервер должен принимать специальные меры в случаях, когда обработка принятых почтовых данных успешна лишь отчасти. Это может произойти, если после приема нескольких адресов получателей и почтовых данных для них сервер SMTP обнаружит, что возможна доставка только некоторым из указанных адресатов. В таких случаях на команду DATA должен возвращаться отклик OK. Однако сервер SMTP должен подготовить и передать уведомление о невозможности доставки отправителю сообщения.

Должно передаваться одно уведомление со списком всех адресатов, которым невозможно передать сообщение, или отдельные уведомления для каждого из таких адресатов. Из соображений экономии следует, по возможности, использовать первый вариант. Отметим, что основная разница между обработкой псевдонимов (параграф 3.9.1) и пересылкой (данный параграф) состоит в изменении в данном случае обратного адреса. Все уведомления о невозможности доставки передаются с использованием команды MAIL (даже в тех случаях, когда проблема возникла при обработке устаревших команд SEND, SOML или SAML) и должны содержать пустое поле обратного пути (см. параграф 3.6).

Временные метки и пути возврата формально определяются следующим образом (определения FWS и CFWS даны в RFC 5322 [4]):

   Return-path-line  = "Return-Path:" FWS Reverse-path <CRLF>
   Time-stamp-line  = "Received:" FWS Stamp <CRLF>
   Stamp          = From-domain By-domain Opt-info [CFWS] ";" FWS date-time
                  ; date-time определено в RFC 5322 [4], но формы «obs-», особенно для лет,
                  ; обозначенных 2 цифрами, запрещены в SMTP и их использование недопустимо.
   From-domain    = "FROM" FWS Extended-Domain
   By-domain      = CFWS "BY" FWS Extended-Domain
   Extended-Domain  = Domain / ( Domain FWS "(" TCP-info ")" ) 
                      / ( address-literal FWS "(" TCP-info ")" )
   TCP-info       = address-literal / ( Domain FWS address-literal )
                  ; сервер берет информацию из соединения TCP, а не из клиентской команды EHLO.
   Opt-info       = [Via] [With] [ID] [For] [Additional-Registered-Clauses]
   Via            = CFWS "VIA" FWS Link
   With           = CFWS "WITH" FWS Protocol
   ID             = CFWS "ID" FWS ( Atom / msg-id )
                  ; msg-id определено в RFC 5322 [4]
   For            = CFWS "FOR" FWS ( Path / Mailbox )
   Additional-Registered-Clauses  = CFWS Atom FWS String
                                  ; В этом месте могут добавляться определения из новых
                                  ; стандартов, зарегистрированные в IANA. Серверам SMTP 
                                  ; не следует использовать незарегистрированные имена.
                ; См. раздел 8.
   Link           = "TCP" / Addtl-Link
   Addtl-Link     = Atom
                  ; Дополнительные стандартные имена каналов, зарегистрированные IANA. Via -
                  ; предварительное значение для транспорта, отличного от Internet. Серверам 
                  ; SMTP не следует использовать незарегистрированные имена.
   Protocol       = "ESMTP" / "SMTP" / Attdl-Protocol
   Attdl-Protocol = Atom
                  ; Дополнительные стандартные имена для протоколов, зарегистрированных IANA
         ; в реестре mail parameters [9]. Серверам SMTP не следует использовать
                  ; незарегистрированные имена.

 

4.5. Другие вопросы реализации

4.5.1. Минимальная реализация

Для обеспечения работы SMTP должна быть обеспечена по крайней мере минимальная функциональность. Ниже перечислены команды, которые каждая реализация должна поддерживать в соответствии с данной спецификацией:

EHLO
HELO
MAIL
RCPT
DATA
RSET
NOOP
QUIT
VRFY

Любые системы, которые включают сервер SMTP, поддерживающий трансляцию или доставку почты, должны поддерживать зарезервированный почтовый ящик postmaster, как независимое от регистра символов локальное имя. Без такого адреса можно обойтись, если сервер всегда возвращает отклик 554 на открытие соединений (см. параграф 3.1). Требование принимать почту для адресата postmaster, ведет к тому, что команды RCPT, указывающие адрес postmaster в любом из доменов, для которых сервер SMTP обеспечивает почтовое обслуживание, а также специальный случай команды RCPT TO:<Postmaster> (без указания домена), должны поддерживаться сервером.

Предполагается, что системы SMTP будут прилагать все разумные усилия для восприятия почты в адрес Postmaster от любой другой системы в Internet. В экстремальных случаях (например, при атаках на службы — DoS) или при нарушениях системы безопасности сервер SMTP может блокировать почту, направленную по адресу Postmaster. Однако, продолжительность такой блокировки следует максимально ограничивать, во избежание блокировки сообщений, которые не являются частью атаки.

4.5.2. Прозрачность

Без принятия некоторых специальных мер последовательность <CRLF>.<CRLF> будет восприниматься как завершение почтовых данных и не может включаться пользователем в текст. Обычно пользователи даже не знают о таких «запрещенных» последовательностях. Для прозрачной передачи подготовленного пользователем текста служат следующие процедуры:

  • Перед отправкой строки почтового текста клиент SMTP проверяет первый символ строки. Если таким символом является точка, клиент просто добавляет к еще одну точку в начале строки.
  • Сервер SMTP, проверяет полученную строку. Если она содержит только точку, это трактуется как завершение данных. Если после точки в начале строки следуют дополнительные символы, эта точка просто удаляется.

Почтовые данные могут включать любые из 128 символов ASCII. Все символы доставляются в почтовый ящик получателя, включая пробелы, табуляторы и другие управляющие символы. Если канал передачи поддерживает поток данных в форме 8-битовых байтов (октетов), 7-битовые коды ASCII передаются с выравниванием по правому краю октета и нулевым значением старшего бита. Трансляторы SMTP используют специальную трактовку 8-битовых символов (см. 3.6).

В некоторых системах может требоваться передача данных в том виде, как они были приняты и сохранены. Это может быть актуально для хостов, использующих отличный от ASCII локальный набор символов, если они сохраняют данные в записях, а не в строках, или при использовании специальных символьных последовательностей в качестве ограничителей (delimiters) внутри почтовых ящиков. Если такие преобразования требуются, они должны быть обратимыми, особенно для почтовых трансляторов.

4.5.3. Размеры и тайм-ауты

4.5.3.1. Ограничения размеров

Существуют некоторые объекты, для которых требуется ограничение размера. Каждая реализация должна быть способна принимать объекты, размеры которых не выходят за эти ограничения. Следует (по возможности) избегать передачи объектов большего размера. Однако некоторые почтовые системы Internet создают такие адреса в формате X.400 (RFC 2156 [35]), которые могут потребовать большего размера объектов. Клиенты могут пытаться передать такие объекты, но они должны быть готовы к отказу серверов от обслуживания слишком больших объектов. Для снижения вероятности возникновения проблем в реализациях следует использовать методы, не ограничивающие размеры объектов.

Расширения SMTP могут включать поддержку символов, размер которых превышает 1 октет. По этой причине задаваемые в этом параграфе ограничения устанавливаются в октетах, а не в символах.

4.5.3.1.1. Локальная часть

Максимальный размер имени пользователя или локальной части адреса составляет 64 октета.

4.5.3.1.2. Домен

Максимальный размер доменного имени составляет 255 октетов.

4.5.3.1.3. Путь

Максимальная длина прямого и обратного пути составляет 256 октетов (включая разделители и пунктуацию).

4.5.3.1.4. Строка команды

Максимальная длина командной строки с учетом завершающей последовательности <CRLF> составляет 512 октетов. Расширения SMTP могут разрешать более длинные команды.

4.5.3.1.5. Строка отклика

Максимальная длина строки отклика с учетом кода и <CRLF> составляет 512 октетов. Дополнительную информацию можно передать, используя многострочный отклик.

4.5.3.1.6. Строка текста

Максимальная длина строки текста с учетом <CRLF> составляет 1000 октетов (без учета добавляемую для обеспечения прозрачности точки в начале). Расширения SMTP могут использовать более длинные строки.

4.5.3.1.7. Содержимое письма

Ограничение максимального размера содержимого сообщения (включая заголовки и тело) должно быть не менее 64K октетов. После введения стандартов Internet на multimedia-почту (RFC 2045 [21]) размеры почтовых сообщений Internet многократно возросли и по возможности следует избегать ограничения размера сообщений. Системам SMTP, которые не могут отказаться от ограничения размеров следует реализовать сервисное расширение SIZE (RFC 1870 [10]), а клиентам SMTP, передающим большие сообщения, следует по возможности использовать это расширение.

4.5.3.1.8. Буфер адресатов

Минимальное число буферизуемых получателей должно составлять 100. Отказ от приема сообщений (для избыточных получателей) при числе команд RCPT менее 100 является нарушением данной спецификации. Для транслирующих серверов SMTP недопустимо, а доставляющим серверам не следует проверять число адресатов в заголовке и отвергать сообщения на основе общего числа получателей. Сервер, в котором ограничивается число получателей, должен использовать разумный выбор отклоняемых сообщений (скорее сразу отклонить адресатов, выходящих за пределы допустимого числа, нежели потом отбрасывать принятые сначала адреса). Клиентам, которым требуется доставка сообщения, включающего более 100 команд RCPT, следует быть готовыми к передаче блоками по 100 адресов в один прием.

4.5.3.1.9. Трактовка выхода за пределы

Ошибки, связанные с выходом за допустимые пределы, приводят к передаче соответствующих откликов:

500 Line too long – слишком длинная строка
501 Path too long – слишком длинный путь
452 Too many recipients – слишком много получателей (см. ниже)
552 Too much mail data – слишком много почтовых данных.
4.5.3.1.10. Слишком много получателей

В RFC 821 [1] некорректно указано, что сервер SMTP в случаях превышения числа команд RCPT (too many recipients) генерирует отклик с кодом 552. Корректным кодом для таких откликов является 452. Клиентам следует трактовать код 552 в таких случаях как временную проблему, а не постоянную, чтобы описанная ниже логика могла работать.

Когда соответствующий спецификации SMTP сервер сталкивается с такой проблемой, он имеет по крайней мере 100 принятых команд RCPT в своем буфере получателей. Если сервер способен принять сообщение, из клиентской очереди будет удалено по крайней мере 100 адресов. Когда клиент предпримет новую попытку передачи адресов, для которых был получен отклик 452, сервер SMTP сможет поместить в буфер получателей по крайней мере 100 адресов. Каждая повторная попытка будет обеспечивать передачу сообщения по крайней мере сотне адресатов.

Если сервер SMTP имеет предел для числа команд RCPT и этот предел превышен, сервер должен использовать отклик с кодом 452 (но клиенту следует быть готовым и к получению кода 552, как было указано выше). Если ограничения сервера заданы правилами, он может использовать отклик с кодом 5yz. В частности, если задача состоит в том, чтобы запретить передачу сообщений с числом получателей, превышающим заданное для сайта значение, а не просто ограничить число адресатов для данной почтовой транзакции, разумно будет возвращать отклик 503 на любую команду DATA, полученную после отклика 452 (или 552), или просто возвращать код 503 после команды DATA без предшествующего негативного отклика.

4.5.3.2. Тайм-ауты

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

На основе опыта работы трансляторов с высокой нагрузкой значения тайм-аутов определены приведенные ниже значения, которые следует использовать.

4.5.3.2.1. Стартовое сообщение 220: 5 минут

Клиентский процесс SMTP должен отличать сбои в соединениях TCP от задержки получения стартового приветствия с кодом 220. Многие серверы SMTP воспринимают соединение TCP, но задерживают передачу отклика 220, пока в системе не освободится достаточное для обработки почты количество ресурсов.

4.5.3.2.2. Команда MAIL: 5 минут
4.5.3.2.3. Команда RCPT: 5 минут

Если обработка списков рассылки и псевдонимов не откладывается до приема сообщения, требуется увеличение тайм-аута.

4.5.3.2.4. Инициирование команды DATA: 2 минуты

Этот тайм-аут определяет время ожидания отклика 354 Start Input на команду DATA.

4.5.3.2.5. Блок данных: 3 минуты

Время ожидания завершения каждого вызова TCPSEND для передачи блока данных.

4.5.3.2.6. Прерывание команды DATA: 10 минут

Время ожидания отклика 250 OK. Когда получатель принимает завершающую сообщение точку, он обычно начинает обработку полученных данных для доставки сообщения в почтовый ящик пользователя. Ложные тайм-ауты в это время крайне нежелательны и обычно приводят к доставке многочисленных копий, поскольку сообщение может быть уже послано и сервер принял на себя ответственность за его доставку (см. параграф 6.1).

4.5.3.2.7. Тайм-аут сервера: 5 минут

Серверам SMTP следует использовать тайм-аут не менее 5 минут при ожидании от клиента следующей команды.

4.5.4. Стратегии повтора

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

Любая стратегия организации очередей должна включать тайм-ауты для всех операций, задаваемые независимо для каждой команды. При любых обстоятельствах недопустимо возвращать сообщения об ошибках в ответ на сообщения об ошибках.

4.5.4.1. Стратегия передачи

В рамках общей модели клиент SMTP представляет собой один или несколько процессов, которые периодически пытаются передавать исходящую почту. В типичной системе программы подготовки почтовых сообщений имеют тот или иной способ запроса немедленной обработки исходящей почты; почта, которая не может быть отправлена незамедлительно, должна помещаться в очередь, и отправитель будет периодически пытаться ее отослать адресатам. Запись почтовой очереди будет включать не только само сообщение, но и конверт для его доставки.

Отправитель должен делать паузу перед повторной попыткой отправить почту адресату после неудачи. В общем случае интервал ожидания следует делать не менее 30 минут, однако более изощренные подходы с переменным временем ожидания будут давать преимущества в тех случаях, когда клиент SMTP может определить причину неудачи.

Попытки продолжаются до тех пор, пока сообщение не будет доставлено или пока не истечет заданное на попытки повтора время (обычно, не менее 4 — 5 дней). Может оказаться целесообразным выбор меньшего числа попыток передачи уведомлений о невозможности доставки и аналогичных сообщений об ошибках при сохранении обычного числа попыток для остальной почты. Параметры повтора должны быть настраиваемыми.

Клиенту следует сохранять список хостов, которым не удалось отправить почту, и соответствующие значения тайм-аутов для соединений вместо использования «тупых» попыток повтора.

Опыт показывает, что ошибки обычно носят временный характер (отсутствие связи с системой адресата или нарушение работы этой системы) и рекомендуется делать две попытки повтора в течение первого часа хранения письма в очереди, а далее повторять попытки передачи каждые 2 – 3 часа.

Клиент SMTP может сократить задержку перед повтором, согласовав такое совращение с сервером SMTP. Например, при получении почты с какого-то адреса очевидна возможность передачи по этому адресу почты из очереди (если она есть). Применяя такой подход, приложение в большинстве случаев может обойтись без явного использования функций «передать сообщения из очереди сейчас» типа ETRN (RFC 1985 [36]).

Возможна дальнейшая оптимизация стратегии передачи путем использования множества адресов на хосте (см. ниже), ускоряющего доставку почты за счет повышения расхода ресурсов сервера.

Клиент SMTP может иметь большую очередь сообщений для каждого из недоступных хостов. Если все такие сообщения включать в каждую попытку повтора, это будет порождать значительный избыточный трафик в Internet, а почтовая система будет недоступна в течение длительного периода. Отметим, что клиент SMTP в общем случае может констатировать неудачную попытку только по истечении тайм-аута (несколько минут) и даже минутная задержка на соединение будет приводить к очень большим задержкам, если в очереди скопились десятки или даже сотни недоставленных сообщений для одного хоста.

В то же время, клиентам SMTP следует с большой осторожностью использовать кэшированные негативные отклики от серверов. В экстремальном случае, если команда EHLO вводится много раз в течение одного соединения SMTP, сервер может возвращать разные отклики. Очень важно подчеркнуть, что отклики 5yz на команду MAIL недопустимо кэшировать.

Когда сообщение доставляется множеству адресатов и сервер SMTP, на который копируется сообщение для передачи, совпадает для множества получателей, следует передавать единственную копию сообщения. Т. е., клиенту SMTP следует использовать последовательность команд MAIL, RCPT, RCPT,… RCPT, DATA вместо последовательности MAIL, RCPT, DATA, …, MAIL, RCPT, DATA. Однако при большом количестве адресатов может быть превышено допустимое число повторов команды RCPT на одну команду MAIL. Описанный метод повышения эффективности следует реализовать.

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

4.5.4.2. Стратегия приема

Серверу SMTP следует пытаться сохранить постоянное прослушивание порта SMTP (в соответствии с реестром IANA порт 25). Это требуется для поддержки множества входящих TCP-соединений для SMTP. Некоторые ограничения возможны, но серверы, неспособные одновременно обслуживать множество транзакций SMTP, являются нарушением данной спецификации.

Как было сказано выше, сервер SMTP при получении почты от какого-либо из хостов может активизировать свой механизм очередей SMTP для попытки повторной передачи почты, хранимой для этого хоста.

4.5.5. Сообщения с пустым полем обратного пути

Некоторые типы уведомлений, требуемые существующими или предложенными стандартами, передаются с пустым полем обратного пути. К числу таких сообщений относятся уведомления об ошибках при доставке (см. параграф 3.7), другие типы сообщений DSN (Delivery Status Notifications – уведомления о состоянии доставки RFC 3461 [32]) и сообщения MDN (Message Disposition Notifications – уведомления о диспозиции сообщений RFC 3798 [37]). Все типы указанных сообщений являются уведомлениями о предыдущем сообщении и посылаются по обратному пути из заголовка письма, с которым связано данное уведомление. Невозможность доставки зачастую связана с проблемами в почтовой системе на хосте адресата, поэтому некоторые АДП настраиваются на пересылку таких уведомлений кому-нибудь, кто будет способен исправить проблему с почтой (например, с использованием псевдонима postmaster).

Все остальные типы сообщений (т. е., любые сообщения, для которых проекты стандартов RFC не требуют использовать пустой путь возврата) следует посылать с корректным, непустым полем обратного пути.

Разработчикам автоматизированных почтовых систем следует быть аккуратными и обеспечивать корректную обработку разных типов сообщений с пустым путем возврата. В частности, таким системам не следует отвечать на сообщения без обратного пути и не следует добавлять непустой путь возврата или менять пустой обратный путь на непустой при пересылке таких сообщений.

5. Преобразование адресов и обработка почты

5.1. Обнаружение целевого хоста

После того, как клиент SMTP лексически идентифицирует домен, для которого предназначена передаваемая на обработку почта (см. параграфы 2.3.5 и 3.6), должно выполняться обращение к серверу доменных имен (DNS lookup) для преобразования доменного имени (RFC 1035 [2]). Предполагается, что в адресах используются полные имена (FQDN) – механизм определения FQDN по частичному имени или локальному псевдониму выходит за пределы данной спецификации. В силу сложившейся практики, серверам SMTP, используемым для начального представления сообщений, не следует выполнять преобразований неполных имен (серверы представления сообщений [18] имеют более мощные механизмы таких преобразований), а для транслирующих серверов SMTP такие преобразования недопустимы.

При поиске сначала предпринимается попытка найти локальную запись MX, связанную с именем. Если взамен этого будет найдена запись CNAME, полученное в результате имя обрабатывается как исходное. Если сервер имен сообщает об отсутствии искомого домена, должно генерироваться сообщение об ошибке. При возврате сообщения о временной ошибке письмо должно помещаться в очередь для последующего повтора попытки передачи (см. параграф 4.5.4.1). Если возвращается пустой список записей MX, адрес трактуется, как связанный с неявной записью MX RR, имеющей уровень предпочтения 0 и указывающей на данный хост. Если записи MX присутствуют, но ни одна из них не может быть использована, или неявная запись MX не может быть использована, должно генерироваться сообщение об ошибке.

Если для данного имени найдена одна или несколько записей MX, для системы SMTP недопустимо использовать какие-либо адресные записи, связанные с этим именем, пока они не найдены с использованием записей MX; приведенное выше правило неявных записей MX применимо только в случаях отсутствия реальных MX. Если записи MX присутствуют, но ни одна из них не может быть использована, должно генерироваться сообщение об ошибке.

Когда найдено доменное имя, связанное с MX RR, и полученное соответствующее поле данных, этот отклик должен включать доменное имя. При запросе по этому имени должна возвращаться по крайней мере одна адресная запись (например, A или AAAA), которая дает IP-адрес сервера SMTP для отправки тому сообщения.

Все прочие отклики, включая значения, возвращающие при запросе запись CNAME, выходят за пределы рассмотрения данного стандарта. Запрет меток, которые преобразуются в записи CNAME более подробно рассматривается в параграфе 10.3 RFC 2181 [38].

После успешного поиска доменного имени в DNS преобразование может дать не один адрес, а несколько, в результате наличия множества записей MX и/или поддержки хостом нескольких адресов (multihoming). Для обеспечения надежной доставки почты клиент SMTP должен быть способен пытаться (включая повторы) использовать все адреса в соответствии с их порядком в списке, пока доставка не завершится успехом. Однако может существовать конфигурационное ограничение числа используемых альтернативных адресов. В таких случаях клиенту SMTP следует предпринимать попытки по крайней мере для двух адресов.

Для ранжирования адресов хостов используется два типа данных – множественные записи MX и многодомные хосты.

Записи MX содержат информацию о предпочтениях, которая должна использоваться при сортировке списка, если число записей превышает 1 (см. ниже). Меньшие значения MX указывают на более предпочтительные адреса доставки. При наличии нескольких адресов с одинаковыми значениями MX нет явных причин для предпочтения того или иного адреса и отправитель SMTP должен выбирать порядок таких адресов случайным образом для распределения нагрузки между разными почтовыми серверами одной организации.

Хост получателя (возможно с предпочтительной записью MX) может оказаться многодомным – в таких случаях доменное имя будет преобразовываться в список адресов IP. Ответственность за упорядочивание этого списка лежит на интерфейсе преобразователя имен (domain name resolver), который должен упорядочивать список в порядке снижения предпочтений, а отправитель SMTP должен пытаться использовать адреса в предложенном порядке.

Хотя поддержка попыток доставки с использованием множества адресов требуется от реализации, возможность таких попыток для конкретной инсталляции может быть ограничена или отключена совсем. Вопрос о целесообразности использования разных адресов многодомных хостов остается спорным. Основным аргументом в пользу таких попыток является повышение вероятности своевременной доставки сообщений, а в некоторых случаях – просто обеспечение возможности доставки. Противники такого подхода считают, что он ведет к излишнему расходу ресурсов. Отметим, что использование ресурсов сильно зависит от выбранной стратегии передачи, как было показано в параграфе 4.5.4.1.

Если сервер SMTP принимает сообщение, для адресата которого данный сервер означен в записи MX, этот сервер может транслировать сообщение (потенциально, после получения переписанных адресов для MAIL FROM и/или RCPT TO), обеспечивая его окончательную доставку, или передать его дальше, используя тот или иной механизм, не относящийся к транспортной среде SMTP. Естественно, для второго случая сначала должен быть проверен список записей MX.

Если сервер определяет, что ему следует транслировать сообщение без переписывания заголовков, он должен отсортировать записи MX для определения нужной. Высший приоритет для передачи сообщения будет иметь запись с минимальным значением MX. Хост-транслятор должен проверить список на предмет наличия в нем имен или адресов, известных для данной транзакции. Если найдена соответствующая запись, все остальные записи, для которых уровень предпочтения не выше найденного, должны исключаться из рассмотрения. Если таких записей нет, это говорит об ошибке и сервер должен вернуть сообщение, как недоставляемое. С оставшимися в списке записями следует повторять попытки доставки сообщения в порядке снижения приоритета записи.

5.2. IPv6 и записи MX

В современной сети Internet клиенты и серверы SMTP могут использоваться на хостах IPv4, IPv6 или смешанных, которые поддерживают обе версии протокола IP. Домены хостов, на которые указывают записи MX, могут, следовательно, включать записи A RR (IPv4), AAAA RR (IPv6) и комбинации таких записей. Хотя в RFC 3974 [39] рассмотрен некоторый опыт использования в смешанных средах, этого опыта недостаточно для стандартизации, а некоторые из содержащихся в документе рекомендаций не вполне совместимы с настоящей спецификацией. Предпринимаемые действия могут зависеть от локальных условий (таких, как производительность участвующих в процессах сетей) и требуемых преобразований или быть обычными (например, клиентам, поддерживающим только IPv6, не нужно пытаться отыскать записи A RR или обращаться к серверам, которые поддерживают только IPv4). Разработчикам реализаций SMTP, которые могут работать в IPv6 или смешанных средах, следует изучить упомянутые выше процедуры, особенно комментарии по поводу многодомных хостов, и, предпочтительно, обеспечить механизмы, облегчающие тонкую настройку рабочей среды и взаимодействие почтовых систем IPv4 и IPv6 с учетом локальных условий.

6. Обнаружение и решение проблем

6.1. Гарантированная доставка и отклики по электронной почте

Когда получатель SMTP принимает порцию почты (передав отклик 250 OK в ответ на команду DATA), он принимает на себя ответственность за доставку или трансляцию сообщения. К этой ответственности следует относиться серьезно. Недопустима потеря сообщений по незначительным причинам, типа последующего «падения» хоста или предсказуемой нехватки ресурсов. Некоторые серьезные причины потери сообщений рассмотрены в следующем параграфе и параграфе 7.8.

Если после восприятия сообщения обнаруживается невозможность его доставки, получатель SMTP должен подготовить и передать уведомление об этом. При передаче уведомления должен использоваться пустой (<>) путь возврата в конверте. Получателем такого уведомления должен быть адрес из обратного пути в конверте (или строке Return-Path:). Если обратный путь пустой («<>»), для сервера SMTP недопустима передача уведомления. Обычно, ничто не запрещает на локальном уровне (в той же среде, к которой относится получатель SMTP) принимать решение о протоколировании или иной фиксации сведений о пустом пути возврата. Если адресом является явный маршрут source route, из него должен выделяться последний интервал (final hop).

В качестве примера предположим, что нужно передать уведомление для сообщения, принятого по команде:

MAIL FROM:<@a,@b:user@d>

Уведомление должно передаваться с помощью команды:

RCPT TO:<user@d>

Некоторые проблемы с доставкой после того, как система SMTP восприняла сообщение, неизбежны. Например, у принимающего сервера SMTP может не быть возможности проверки всех адресов доставки в командах RCPT по причине некритических (soft) ошибок в системе доменных имен, поскольку адресатом является список рассылки (см. описание RCPT), или сервер действует как транслятор и не имеет непосредственного доступа к системе доставки.

Во избежание дублирования сообщений в результате тайм-аутов, получатель SMTP должен пытаться минимизировать время отклика на индикатор завершения данных <CRLF>.<CRLF>. Подробное обсуждение этого вопроса приводится в RFC 1047 [40].

6.2. Нежелательная и незапрошенная почта, почтовые атаки

Практичность и предсказуемость почтовой системы Internet требует, чтобы сообщения, которые могут быть доставлены, доставлялись на практике независимо от синтаксических ошибок и других отказов, связанных с сообщениями, а также независимо от содержимого почты. Если почта не может быть доставлена и не может быть отвергнута сервером SMTP в транзакции SMTP, эта почта должна быть возвращена (bounced) с уведомлением о невозможности доставки, как описано выше. В современном мире, когда многие операторы серверов SMTP убедились в том, что количество нежелательной почты большого размера во много раз превышает объем желаемой почты и когда восприятие сообщения может вызвать дополнительный нежелательный трафик, связанный с верификацией адреса, приведенный выше принцип утрачивает практический смысл.

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

Рациональным путем усиления принципа обеспечения доставки, если таковая возможна, является отказ от доставки сообщений, имеющих некорректный адрес возврата. Однако опыт показывает, что пользователей больше устраивает вариант, когда доставляются все сообщения, доставка которых возможна. Надежное определение некорректности адреса возврата может оказаться затруднительным и достаточно долгим процессом, особенно в тех случаях, когда предполагаемая почтовая система не доступна напрямую или не поддерживает полностью функциональность VRFY. Даже при выборе политики отбрасывания почты с некорректными обратными адресами, такую политику следует применять лишь в тех случаях, когда практически не остается сомнений в некорректности обратного адреса.

Если сообщение отвергается по причине неприемлемости его содержимого (критерии принятия такого решения выходят за пределы функциональности сервера SMTP, определенной в этом документе), уведомления об отказе от (bounce) не следует передавать, пока принимающая система не уверена в полезности таких уведомлений. Предпочтительным для таких ситуаций поведением (его следует принимать по умолчанию) является отказ от передачи уведомлений об отказе от доставки сообщений с неприемлемым содержанием.

6.3. Детектирование петель

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

6.4. Компенсация отклонений от стандартов

К несчастью приходится сталкиваться со множеством вариаций, творческих реализаций и откровенных нарушений стандартов для почтовых протоколов Internet – одни возникают часто, другие — реже. Дебаты по вопросам политики корректно реализованных получателей (серверов) или трансляторов SMTP относительно некорректно подготовленных сообщений (пытаться передать их в неизменном виде, отвергнуть или пытаться исправить для повышения вероятности успешной доставки и последующего ответа на них) начались почти одновременно с появлением структурированной почты и конца этому обсуждению не видно. Сторонники жесткой политики утверждают, что попытки исправления редко дают положительные результаты и отказ от передачи плохих сообщений является единственным способом избавиться от некорректно работающих почтовых программ. Сторонники исправления сообщений или доставки в неизменном виде считают, что пользователи предпочитают почту, которая работает во всех возможных ситуациях, и на этом направлении может существовать значительное давление рынка. На практике давление рынка может оказаться более сильным для отдельных производителей, нежели требования стандартов, независимо от наличия у фирсы реальных разработчиков.

Проблемы, связанные с некорректным форматом сообщений, обострились после введения специальных протоколов для чтения (загрузки) почты с серверов [POP2 [15], POP3 [16], IMAP2 [41], PCMAIL [42]). Эти протоколы поддерживают использование SMTP в качестве протокола передачи (представления сообщений) и серверов SMTP для трансляции почты на хосты клиентов этих протоколов (которые часто не имеют прямого постоянного подключения к Internet). Исторически многие из таких хостов не поддерживают часть механизмов и данных, используемых SMTP (и протоколом почтовых форматов RFC 822 [28]). Некоторые могут не сохранять значение текущего времени, другие не понимают часовых поясов, третьи не знают своего имени и, конечно, ни один из таких хостов не может удовлетворять тем требованиям, которые заложены в концепцию заверенных адресов RFC 822.

В ответ на появление «ущербных» клиентов SMTP многие системы SMTP сейчас дополнительно обрабатывают сообщения, полученные от таких клиентов в неполном или некорректном формате. Такая стратегия в общем случае приемлема, когда сервер может идентифицировать или аутентифицировать клиента и между клиентом и сервером существует предварительное соглашение. Такое решение значительно лучше по сравнению с исправлениями, которые могут вносить серверы доставки или трансляции для малознакомых или совсем неизвестных пользователей и клиентских машин. Многие из этих проблем решаются за счет использования отдельного протокола для представления сообщений (типа RFC 4409 [18]) взамен использования для этих целей исходных серверов SMTP.

Ниже перечислены изменения, которые могут быть при необходимости внесены в обрабатываемые сообщения отправляющими (исходными) серверами SMTP или при использовании серверов SMTP для представления почты:

  • добавление поля message-id при его отсутствии;
  • добавление даты, времени и часового пояса при их отсутствии;
  • корректировка адреса в соответствии с форматом FQDN.

Чем меньше информации сервер имеет от клиента, тем менее очевидны корректировки и больше осмотрительности и консерватизма следует использовать при рассмотрении вопроса о возможности и способах корректировки сообщений. Перечисленные выше изменения недопустимо выполнять на промежуточных трансляторах SMTP.

В любом случае корректно реализованные клиенты, предоставляющие корректную информацию будут иметь предпочтение при корректировке сообщений серверами SMTP. Во всех ситуациях рекомендуется тщательно документировать (в полях трассировки и/или комментариях в заголовке) вносимые сервером изменения.

7. Вопросы безопасности

7.1. Безопасность почты и обманки

Природа почты SMTP не обеспечивает безопасности, поскольку любой пользователь может напрямую взаимодействовать с принимающим или транслирующим сервером SMTP, создавать сообщения и обманывать простодушных получателей, полагающих, что это почта от кого-то другого. Создание таких сообщений, обманный характер которых не обнаруживается, – задача более сложная, но вполне посильная для людей с нужными знаниями и соответствующей мотивацией. Следовательно, по мере повышения уровня знаний в сфере почты Internet человек начинает понимать, что почта SMTP не может быть заверена на транспортном уровне, равно как не обеспечивается и проверка целостности почты. Реальная безопасность почты обеспечивается только сквозными методами, включающими контроля тела сообщения, использования цифровых подписей (см. RFC 1847 [43] и, например, PGP24 в RFC 4880 [44] или S/MIME25 в RFC 3851 [45]).

Различные сервисные расширения и конфигурационные опции, которые обеспечивают аутентификацию на транспортном уровне (например, от клиента к серверу SMTP), несколько улучшают ситуацию. Однако, в общем случае, это ограничивается аутентификацией одного сервера другим, вместо аутентификации всей цепочки трансляторов и пользователей или пользовательских машин на серверах. Следовательно, пока эти методы не дополнены аккуратной передачей ответственности в хорошо спроектированной среде с доверительными отношениями, унаследованная уязвимость транспортной среды SMTP (по сравнению с механизмами сквозного использования цифровых подписей) будет сохраняться.

Попытки затруднить пользователям подстановку в поле обратного пути в конверте и заголовке From корректного чужого адрес взамен адреса реального отправителя заведомо ошибочны — это затрудняет работу легитимных приложений, в которых почта передается одним пользователем по просьбе другого или отклики на ошибки (доставку) должны передаваться по специальному адресу (системы, которые обеспечивают пользователю удобные способы замены этих полей для каждого сообщения отдельно, должны будут пытаться создать основные и постоянные адреса почтовых ящиков для пользователей в соответствии с полями Sender в генерируемых сообщениях).

Эта спецификация не рассматривает вопросы аутентификации, связанные в протоколом SMTP, но полезная функциональность не может ущемляться в надежде на несущественную защиту против фальсифицированной почты.

7.2. Скрытые копии — BC

В передаваемых серверу SMTP командах RCPT могут присутствовать адреса, по тем или иным причинам не указанные в заголовке сообщения. Двумя основными случаями являются использование почтового адреса, как «детонатора» списка (один адрес преобразуется во множество адресов реальных получателей) и скрытых копий (blind copy – или bc). В тех случаях, когда используется более одной команды RCPT и во избежание подавления некоторых функций этих механизмов, клиентам и серверам SMTP не следует копировать весь набор аргументов команды RCPT в заголовки, как часть трассировочных полей, информационных полей или заголовков частного расширения. Поскольку на практике это правило часто нарушается и его выполнение не может быть обеспечено принудительно, передающие системы SMTP, которые знают об использовании bcc, могут счесть полезной передачу каждой скрытой копии в отдельной транзакции с единственной командой RCPT.

Не существует неразрывных отношений между обратным (из команд MAIL, SAML и т. п.) или прямым (RCPT) адресом в транзакции SMTP (конверте) и адресами в заголовке. Принимающим системам не следует пытаться найти такие соотношения и использовать их для изменения заголовков с целью доставки сообщения. Популярный заголовок Apparently-to (видимо для) является нарушением данного принципа и хорошо известным случаем непреднамеренного разглашения информации; не следует пользоваться этим заголовком.

7.3. VRFY, EXPN, Security

Как обсуждалось в параграфе 3.5, отдельные сайты могут заблокировать использование команд VRFY и EXPN из соображений безопасности (см. ниже). Как следует из сказанного выше, для реализаций, обеспечивающих возможность такой блокировки, недопустимо показывать, что они могут проверять адреса, не проверяя их фактически. Если сайт блокирует команды из соображений безопасности, сервер SMTP должен возвращать отклик 252, а не код, который может ввести в заблуждение относительно результатов верификации адреса.

Возврат кода 250 в ответ на команду VRFY после проверки лишь синтаксиса команды (а не указанного адреса), является нарушением этого правила. Естественно, что реализации, «поддерживающие» команду VRFY, которые всегда будут возвращать отклик 550 независимо от корректности адреса, также нарушают это правило.

В публичной сети Internet содержимое списков рассылки стало популярным источником информации об адресах для так называемых спамеров.

Использование команды EXPN для «сбора» адресов вынудило администраторов принять меры против недопустимого использования списков. Однако команды VRFY и EXPN остаются полезными инструментами для аутентифицированных пользователей и внутри административных доменов. Сайты, поддерживающие аутентификацию SMTP, могут выбрать вариант предоставления доступа к командам VRFY и EXPN только аутентифицированных пользователей. Разработчикам следует поддерживать команду EXPN, а сайтам следует быть осторожными при оценке возможности утечки информации.

Запрет команды VRFY обеспечивает какое-либо повышение уровня безопасности в зависимости от ряда других условий. Во многих случаях ту же информацию о валидности адресов можно получить и с помощью команд RCPT. С другой стороны, особенно для случаев, когда проверка корректности адреса для команд RCPT откладывается до момента получения команды DATA, использование RCPT может не дать никакой информации, тогда как VRFY с высокой вероятностью обеспечит проверку корректности адресов до генерации отклика (см. выше).

7.4. Ремаршрутизация почты на основе откликов 251 и 551

До того, как клиент использует отклики 251 или 551 на команду RCPT для автоматического обновления своего поведения в будущем (корректировка адресной книги пользователя), ему следует проверить подлинность передавшего отклик сервера. Отказ от такой проверки оставляет возможность для организации атак с участием человека (MITM26).

7.5. Разглашение информации в анонсах

Не прекращаются дебаты о преимуществах (отладка) и недостатках (раскрытие информации) анонсирования в откликах на команду HELP информации о типе сервера и номере версии (а в некоторых случаях и доменного имени). Полезность отладочной информации не вызывает сомнений. Те, кто выступает за сохранение ее доступности, говорят, что лучше будет сделать серверы SMTP более защищенными, чем надеяться на то, что сокрытие информации будет повышать уровень защиты. Сайтам рекомендуется принимать эту проблему во внимание, а разработчикам следует обеспечивать для серверов возможность предоставления информации о типе и номере версии другим хостам.

7.6. Разглашение информации в полях трассировки

В некоторых обстоятельствах (например, при доставке почты в локальной сети, хосты которой не подключены к Internet напрямую), поля трассировки (Received), вносимые в соответствии с данной спецификацией, могут содержать имена хостов и другую информацию, которую не следует разглашать. Обычно это не создает проблем, но для сайтов с высокими требованиями к вопросу разглашения имен это может иметь важное значение. Дополнительные операторы FOR также следует использовать с осторожностью или не использовать совсем в тех случаях, когда многочисленные получатели могут непреднамеренно передать информацию о скрытых получателях (bc) другим.

7.7. Разглашение информации при пересылке сообщений

Как обсуждалось в параграфе 3.4, использование откликов 251 или 551 для идентификации замены адреса, связанного с почтовым ящиком, может приводить к неумышленному разглашению информации. Сайты, для которых эти вопросы играют важную роль, должны соответствующим образом задавать конфигурацию своих серверов.

7.8. Сопротивление атакам

В последние годы наблюдается рост числа атак на серверы SMTP в форме попыток получения адресов для проведения несанкционированных рассылок или попыток срыва работы почтовой службы (например, атаки на службы прикладного уровня). Хотя изучение таких атак выходит за пределы настоящего стандарта, для обеспечения нормального функционирования от серверов требуется возможность детектирования таких атак и принятия мер по своей защите. Например, если сервер обнаруживает передачу большого числа команд RCPT TO, по большей части или полностью включающих некорректные адреса, разумным поведением для сервера будет завершение соединения с генерацией соответствующего количества откликов 5yz (обычно 550).

7.9. Свобода действий сервера SMTP

Несомненно, что сервер SMTP может отвергать почту по любым эксплуатационным или техническим причинам, связанным с сайтом сервера. Однако только кооперация между сайтами и инсталляциями делает возможным функционирование Internet. Если сайты будут слишком активно использовать право отказа от приема трафика, возможность доставки почты (одна из важных функций Internet) существенно понизится, поэтому следует осторожно и взвешенно принимать решения в части восприятия (отказа) и обработки трафика.

В последние годы использование функций трансляции на случайных сайтах стало применяться как способ сокрытия истинного происхождения почты. Некоторые сайты в результате стали предоставлять функции трансляции только известным или идентифицируемым отправителям и разработчикам следует обеспечивать в программах возможность такой фильтрации. Когда почта отвергается по тем или иным причинам, определяемым политикой сайта, следует использовать код 550 в откликах на команды EHLO (или HELO), MAIL или RCPT.

8. Регистрация в IANA

Агентство IANA поддерживает три реестра, связанных с данной спецификацией, каждый из которых был открыт для RFC 2821 или раньше. В этом документе расширен третий реестр, как описано ниже. Ссылки на реестры даны на момент публикации документа; IANA не гарантирует постоянную корректность указанных URL. Реестры включают:

  • Первый реестр (Simple Mail Transfer Protocol (SMTP) Service Extensions [46]) включает сервисные расширения SMTP и связанные с ними ключевые слова, а также (при необходимости) команды и их параметры. Как сказано в параграфе 2.2.2, ни одна из записей этого реестра не может начинаться с X. Записи могут создаваться только для расширений сервиса (и связанных с ними ключевых слов, параметров и команд), которые определены в стандартах или экспериментальных RFC, одобренных IESG для таких целей.
  • Второй реестр (Address Literal Tags [47]) содержит теги, идентифицирующие «дословные» формы записи доменных имен, отличные от адресов IPv4 (эта форма включена в RFC 821 и настоящую спецификацию). Первая запись этого реестра относится к IPv6 (включена в эту спецификацию). Для использования дополнительных вариантов «дословного» представления требуется стандартизация, которой в настоящее время нет ни для одного из них.
  • Третий реестр (Mail Transmission Types [46]), основанный RFC 821 и обновленный данной спецификацией, содержит идентификаторы каналов и протоколов, которые могут использоваться в субоператорах via и with трассировочных строк (заголовки Received:), описанных в параграфе 4.4. Идентификаторы каналов и протоколов в дополнение к указанным в этой спецификации могут регистрироваться только путем стандартизации или через экспериментальные расширения протоколов (RFC, одобренные IESG). Размер этого пространства имен для идентификации не ограничен, IESG поддерживает расширение пространства с учетом четкости документирования и отличия методов, нежели на основе предпочтительности самих методов.
    Добавлены подразделы VIA link types (типы каналов VIA) и WITH protocol types (типы протоколов WITH) для регистрации дополнительных пунктов (Additional-registered-clauses) в соответствии с описанным выше. Реестр будет включать имя пункта (clause), его описание, краткое описание синтаксиса связанной с пунктом строки, и ссылку на источник. По мере определения новых пунктов они могут, в принципе, задавать создание своих реестров, если значения String содержат зарезервированные или ключевые слова. Как идентификаторы каналов и протоколов, дополнительные пункты могут регистрироваться только путем стандартизации или разработки экспериментального протокола, документированного в RFC и одобренного IESG. Пространство имен дополнительных пунктов предназначено для идентификации и не ограничено по размеру. ESG поддерживает расширение пространства с учетом четкости документирования пунктов, реального применения или серьезных предпосылок для использования и отличия пунктов, нежели на основе предпочтительности свойств самих пунктов.

В дополнение к сказанному отметим, что при создании новых трассировочных полей заголовков (т. е. в дополнение к Return-path и Received) эти поля должны добавляться в реестр IANA, созданный BCP 90 (RFC 3864) [11] для использования с RFC 5322 [4].

9. Благодарности

Множество людей внесло вклад в подготовку RFC 2821 и отмечено в том документе. В настоящем документе редактор и сообщество должны поблагодарить Dawn Mann и Tony Hansen за помощь в мучительном процессе редактирования и преобразования документа из одного формата в другой.

Ни данный документ, ни RFC 2821 не увидели бы света без участия и проницательности Jon Postel. Его вклад включает и исходную спецификацию SMTP в RFC 821. Значительная часть текста RFC 821 сохранена в настоящем документе, наряду с исходными примерами, которые были слегка обновлены с учетом изменений в спецификации.

Многие люди внесли свои комментарии и предложения через списки рассылок или в письмах автору. Важные поправки и разъяснения предложили множество людей, включая Matti Aarnio, Glenn Anderson, Derek J. Balling, Alex van den Bogaerdt, Stephane Bortzmeyer, Vint Cerf, Jutta Degener, Steve Dorner, Lisa Dusseault, Frank Ellerman, Ned Freed, Randy Gellens, Sabahattin Gucukoglu, Philip Guenther, Arnt Gulbrandsen, Eric Hall, Richard O. Hammer, Tony Hansen, Peter J. Holzer, Kari Hurtta, Bryon Roche Kain, Valdis Kletnieks, Mathias Koerber, John Leslie, Bruce Lilly, Jeff Macdonald, Mark E. Mallett, Mark Martinec, S. Moonesamy, Lyndon Nerenberg, Chris Newman, Douglas Otis, Pete Resnick, Robert A. Rosenberg, Vince Sabio, Hector Santos, David F. Skoll, Paul Smith и Brett Watson.

Работа директоров направления — Lisa Dusseault, Ted Hardie и Chris Newman — помогла начать и завершить подготовку этой спецификации, выполнению этой задачи помог и специальный комитет — все они заслуживают благодарности. Членами этого комитета были (в алфавитном порядке) Dave Crocker, Cyrus Daboo, Tony Finch, Ned Freed, Randall Gellens, Tony Hansen, автор документа и Alexey Melnikov. Tony Hansen также выполнял функции руководства списками рассылок при рассмотрении этого документа, без его усилий не удалось бы беспристрастный и сбалансированный учет всех предложений; его терпеливость заслуживает отдельной благодарности.

10. Литература

10.1. Нормативные документы

[1] Postel, J., «Simple Mail Transfer Protocol», STD 10, RFC 821, August 1982.

[2] Mockapetris, P., «Domain names — implementation and specification», STD 13, RFC 1035, November 1987.

[3] Braden, R., «Requirements for Internet Hosts — Application and Support», STD 3, RFC 1123, October 1989.

[4] Resnick, P., «Internet Message Format», RFC 5322, October 2008.

[5] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, March 1997.

[6] American National Standards Institute (formerly United States of America Standards Institute), «USA Code for Information Interchange», ANSI X3.4-1968, 1968.

[8] ANSI X3.4-1968 has been replaced by newer versions with slight modifications, but the 1968 version remains definitive for the Internet.

[7] Crocker, D. and P. Overell, «Augmented BNF for Syntax Specifications: ABNF», STD 68, RFC 5234, January 2008.

[8] Hinden, R. and S. Deering, «IP Version 6 Addressing Architecture», RFC 4291, February 2006.

[9] Newman, C., «ESMTP and LMTP Transmission Types Registration», RFC 3848, July 2004.

[10] Klensin, J., Freed, N., and K. Moore, «SMTP Service Extension for Message Size Declaration», STD 10, RFC 1870, November 1995.

[11] Klyne, G., Nottingham, M., and J. Mogul, «Registration Procedures for Message Header Fields», BCP 90, RFC 3864, September 2004.

10.2. Дополнительная литература

[12] Partridge, C., «Mail routing and the domain system», RFC 974, January 1986.

[13] Klensin, J., Freed, N., Rose, M., Stefferud, E., and D. Crocker, «SMTP Service Extensions», STD 10, RFC 1869, November 1995.

[14] Klensin, J., «Simple Mail Transfer Protocol», RFC 2821, April 2001.

[15] Butler, M., Postel, J., Chase, D., Goldberger, J., and J. Reynolds, «Post Office Protocol: Version 2», RFC 937, February 1985.

[16] Myers, J. and M. Rose, «Post Office Protocol — Version 3», STD 53, RFC 1939, May 1996.

[17] Crispin, M., «INTERNET MESSAGE ACCESS PROTOCOL — VERSION 4rev1», RFC 3501, March 2003.

[18] Gellens, R. and J. Klensin, «Message Submission for Mail», RFC 4409, April 2006.

[19] Freed, N., «SMTP Service Extension for Command Pipelining», STD 60, RFC 2920, September 2000.

[20] Vaudreuil, G., «SMTP Service Extensions for Transmission of Large and Binary MIME Messages», RFC 3030, December 2000.

[21] Freed, N. and N. Borenstein, «Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies», RFC 2045, November 1996.

[22] Klensin, J., Freed, N., Rose, M., Stefferud, E., and D. Crocker, «SMTP Service Extension for 8bit-MIMEtransport», RFC 1652, July 1994.

[23] Moore, K., «MIME (Multipurpose Internet Mail Extensions) Part Three: Message Header Extensions for Non-ASCII Text», RFC 2047, November 1996.

[24] Freed, N. and K. Moore, «MIME Parameter Value and Encoded Word Extensions: Character Sets, Languages, and Continuations», RFC 2231, November 1997.

[25] Vaudreuil, G., «Enhanced Mail System Status Codes», RFC 3463, January 2003.

[26] Hansen, T. and J. Klensin, «A Registry for SMTP Enhanced Mail System Status Codes», BCP 138, RFC 5248, June 2008.

[27] Freed, N., «Behavior of and Requirements for Internet Firewalls», RFC 2979, October 2000.

[28] Crocker, D., «Standard for the format of ARPA Internet text messages», STD 11, RFC 822, August 1982.

[29] Wong, M. and W. Schlitt, «Sender Policy Framework (SPF) for Authorizing Use of Domains in E-Mail, Version 1», RFC 4408, April 2006.

[30] Fenton, J., «Analysis of Threats Motivating DomainKeys Identified Mail (DKIM)», RFC 4686, September 2006.

[31] Allman, E., Callas, J., Delany, M., Libbey, M., Fenton, J., and M. Thomas, «DomainKeys Identified Mail (DKIM) Signatures», RFC 4871, May 2007.

[32] Moore, K., «Simple Mail Transfer Protocol (SMTP) Service Extension for Delivery Status Notifications (DSNs)», RFC 3461, January 2003.

[33] Moore, K. and G. Vaudreuil, «An Extensible Message Format for Delivery Status Notifications», RFC 3464, January 2003.

[34] Postel, J. and J. Reynolds, «File Transfer Protocol», STD 9, RFC 959, October 1985.

[35] Kille, S., «MIXER (Mime Internet X.400 Enhanced Relay): Mapping between X.400 and RFC 822/MIME», RFC 2156, January 1998.

[36] De Winter, J., «SMTP Service Extension for Remote Message Queue Starting», RFC 1985, August 1996.

[37] Hansen, T. and G. Vaudreuil, «Message Disposition Notification», RFC 3798, May 2004.

[38] Elz, R. and R. Bush, «Clarifications to the DNS Specification», RFC 2181, July 1997.

[39] Nakamura, M. and J. Hagino, «SMTP Operational Experience in Mixed IPv4/v6 Environments», RFC 3974, January 2005.

[40] Partridge, C., «Duplicate messages and SMTP», RFC 1047, February 1988.

[41] Crispin, M., «Interactive Mail Access Protocol: Version 2», RFC 1176, August 1990.

[42] Lambert, M., «PCMAIL: A distributed mail system for personal computers», RFC 1056, June 1988.

[43] Galvin, J., Murphy, S., Crocker, S., and N. Freed, «Security Multiparts for MIME: Multipart/Signed and Multipart/Encrypted», RFC 1847, October 1995.

[44] Callas, J., Donnerhacke, L., Finney, H., Shaw, D., and R. Thayer, «OpenPGP Message Format», RFC 4880, November 2007.

[45] Ramsdell, B., «Secure/Multipurpose Internet Mail Extensions (S/MIME) Version 3.1 Message Specification», RFC 3851, July 2004.

[46] Internet Assigned Number Authority (IANA), «IANA Mail Parameters», 2007, <http://www.iana.org/assignments/mail-parameters>.

[47] Internet Assigned Number Authority (IANA), «Address Literal Tags», 2007, <http://www.iana.org/assignments/address-literal-tags>.

Приложение A. Транспортный сервис TCP

Соединения TCP поддерживают передачу 8-битовых байтов, а данные SMTP представляют собой 7-битовые символы ASCII. Каждый символ передается в 8-битовом байте с нулевым значением старшего бита. Сервисные расширения могут изменять это правило и разрешать передачу 8-битовых байтов для содержимого сообщений или, если приняты специальные меры для этого, команд и откликов SMTP.

Приложение B. Генерация команд SMTP из полей заголовка RFC 822

Некоторые системы используют раздел заголовков (и только его) RFC 822 в протоколах представления почты, а в остальных случаях генерируют команды SMTP на основе заголовков RFC 822, когда такие сообщения передаются АДП (MTA) от агентов ППА (MUA). Поскольку протокол взаимодействия АДП – ППА является частным и не задается стандартами Internet, в таких случаях могут возникать проблемы. Например, повторяющиеся проблемы могут возникать при обработке копий bcc и перераспределении списков, когда информация, потенциально относящаяся к почтовому конверту, не отделяется в процессе обработки от информации из заголовков и не хранится отдельно от нее.

Агентам ППА рекомендуется предоставлять своему первому АДП (submission client) конверт отдельно от сообщения. Однако, если конверты не поддерживаются, следует генерировать команды SMTP, используя приведенные правила:

  1. Каждый адрес получателя из полей заголовка TO, CC, BCC следует копировать в команду RCPT (генерируя, при необходимости, нужное число копий сообщения для помещения в очередь или доставки). Сюда включаются все адреса, перечисленные в «группе» RFC 822. Все поля BCC следует удалять из заголовков. После завершения такой обработки оставшиеся поля заголовков следует проверить, чтобы убедиться, что осталось хотя бы одно поле TO, CC или BCC. При отсутствии следует поместить в заголовок поле BCC без дополнительной информации, как указано в работе [4].
  2. Адрес возврата в команде MAIL следует (по возможности) получать из системной идентификации представляющего почту (локального) пользователя или из поля From:. При доступности системной идентификации, эти данные следует также копировать в поле заголовка Sender, если информация отличается от адреса в поле From (все имеющиеся поля Sender следует удалить). Система может позволять представляющим почту пользователям переписывать адрес возврата в конверте, но можно ограничить доступ к этому только привилегированными пользователями. Это не предотвращает подмены почтовых адресов, но осложняет такую подмену (см. параграф 7.1).

При таком использовании агентов АДП они несут ответственность за корректность передаваемого сообщения. Механизм проверки корректности и обработка (или возврат) сообщений, некорректность которых обнаружена по прибытии, являются частью интерфейса АДП – ППА (MUA-MTA) и не рассматриваются в данной спецификации.

Протокол представления почты, основанный только на стандарте RFC 822, недопустимо использовать на шлюзах из других (не SMTP) почтовых систем в среду SMTP. Дополнительные данные для конструирования заголовков требуется получать из некоторых источников в другой среде (дополнительные заголовки или конверт).

Попытки передавать сообщения через шлюзы, используя только поля заголовка To и Cc будут приводить к возникновению почтовых петель и другим нарушениям в работе почтовой системы Internet. Эти проблемы будут возникать особенно часто в случаях отправки сообщений через списки рассылки Internet и при распределении почты в чужие среды с использованием информации из конверта. Когда при пересылке таких сообщений учитываются только заголовки, возникновение почтовых петель обратно в среду Internet (и на почтовые списки) почти неизбежно.

Приложение C. Маршруты Source Route

Исторически поле <reverse-path> содержало в source routing список промежуточных хостов и имя почтового ящика отправителя. Исторически, первым в списке <reverse-path> указывался хост, подавший команду MAIL; сегодня не следует использовать маршруты source route в обратном пути. Подобно этому поле <forward-path> может быть списком хостов source routing и адреса получателя. Однако, в общем случае, в поле <forward-path> следует включать только почтовый ящик и доменное имя получателя, отдавая решение задачи маршрутизации почты на откуп системе DNS. Использование явных маршрутов осуждается (см. Приложение F.2) — хотя серверы и должны быть готовы к получению и обработке таких маршрутов (см. 3.3 и Приложение F.2), клиентам не следует передавать явные маршруты и этот параграф включен в спецификацию только для обеспечения преемственности. Данная спецификация несколько отличается от RFC 821 для предотвращения действий серверов, приводящих к путанице последующие серверы и клиентов, которые не ожидают полной реализации source route.

Для целей трансляции прямой путь может быть маршрутом source route в форме @ONE,@TWO:JOE@THREE, где ONE, TWO, THREE должны быть полными доменными именами. Такая форма используется для того, чтобы можно было отличить адреса от маршрутов. Почтовый ящик (в данном случае, JOE@THREE) представляет собой абсолютный адрес, а маршрут — информацию для доставки. Эти понятия не следует путать.

При использовании source route требования RFC 821 и приведенный ниже текст вступают в противоречие в части механизма создания и обновления прямого пути. Сервер SMTP, достигнутый по маршруту source route (например, его доменное имя появляется первым в списке прямого пути), должен удалить свое доменное имя из прямых путей, где это имя появляется, до пересылки сообщения и может удалить всю остальную информацию source route. В соответствии с данной спецификацией серверу не следует менять обратный путь.

Отметим, что прямой и обратный пути появляются в командах и откликах SMTP, но не являются необходимыми в сообщении (т. е., нет необходимости включения таких путей и особенно описанного здесь синтаксиса в поля To:, From:, CC: и т. п.). И наоборот, для серверов SMTP недопустимо получать информацию на основе этих полей при окончательной доставке сообщения.

Когда, несмотря на приведенные выше рекомендации, список хостов присутствует, этот список является «обратным» маршрутом source route и показывает, что почта транслировалась через каждый хост в списке (первым в списке указан последний по времени транслятор). Этот список используется как source route для возврата отправителю уведомлений о невозможности доставки. Если в нарушение приведенных здесь рекомендаций хост-транслятор добавляет себя в начало списка, он должен использовать имя, которое известно в транспортной среде, куда транслируется почта, а не в среде, откуда почта поступила (если эти имена различаются). Отметим, что такие ситуации могут с легкостью возникать из случаев, когда некоторые транслирующие хосты добавляют свои имена в обратный путь source route, а другие не делают этого, создавая разрывы в маршрутном списке. Это другая причина, по которой серверам при необходимости возврата сообщения следует полностью игнорировать source route и просто использовать домен, указанный в Mailbox.

Приложение D. Сценарии

В этом приложении приведено несколько примеров полных сценариев сеансов SMTP. Знаком C: обозначается отправитель (клиент SMTP), а знаком S: — сервер SMTP.

D.1. Сценарий типовой транзакции SMTP

Рассматриваемый ниже пример показывает передачу сообщения, отправленного Смитом (Smith) с хоста bar.com адресатам Jones, Green, Brown на foo.com. Предполагается, что bar.com контактирует с foo.com напрямую. Почта для Jones и Brown принимается, а Green не имеет почтового ящика на foo.com.

      S: 220 foo.com Simple Mail Transfer Service Ready
      C: EHLO bar.com
      S: 250-foo.com greets bar.com
      S: 250-8BITMIME
      S: 250-SIZE
      S: 250-DSN
      S: 250 HELP
      C: MAIL FROM:<Smith@bar.com>
      S: 250 OK
      C: RCPT TO:<Jones@foo.com>
      S: 250 OK
      C: RCPT TO:<Green@foo.com>
      S: 550 No such user here
      C: RCPT TO:<Brown@foo.com>
      S: 250 OK
      C: DATA
      S: 354 Start mail input; end with <CRLF>.<CRLF>
      C: Blah blah blah...
      C: ...etc. etc. etc.
      C: .
      S: 250 OK
      C: QUIT
      S: 221 foo.com Service closing transmission channel

D.2. Сценарий прерванной транзакции SMTP

      S: 220 foo.com Simple Mail Transfer Service Ready
      C: EHLO bar.com
      S: 250-foo.com greets bar.com
      S: 250-8BITMIME
      S: 250-SIZE
      S: 250-DSN
      S: 250 HELP
      C: MAIL FROM:<Smith@bar.com>
      S: 250 OK
      C: RCPT TO:<Jones@foo.com>
      S: 250 OK
      C: RCPT TO:<Green@foo.com>
      S: 550 No such user here
      C: RSET
      S: 250 OK
      C: QUIT
      S: 221 foo.com Service closing transmission channel

D.3. Сценарий с трансляцией

Этап 1 — Отправитель транслятор.

Хост-отправитель запрашивает у DNS данные для XYZ.COM (адрес получателя) и получает записи DNS MX, указывающие xyz.com, как наиболее предпочтительный хост, а foo.com — как наименее предпочтительный. Отправитель пытается соединиться с xyz.com, но терпит неудачу. Тогда он организует соединение с foo.com, сценарий которого показан ниже:

      S: 220 foo.com Simple Mail Transfer Service Ready
      C: EHLO bar.com
      S: 250-foo.com greets bar.com
      S: 250-8BITMIME
      S: 250-SIZE
      S: 250-DSN
      S: 250 HELP
      C: MAIL FROM:<JQP@bar.com>
      S: 250 OK
      C: RCPT TO:<Jones@XYZ.COM>
      S: 250 OK
      C: DATA
      S: 354 Start mail input; end with <CRLF>.<CRLF>
      C: Date: Thu, 21 May 1998 05:33:29 -0700
      C: From: John Q. Public <JQP@bar.com>
      C: Subject: The Next Meeting of the Board
      C: To: Jones@xyz.com
      C:
      C: Bill:
      C: The next meeting of the board of directors will be
      C: on Tuesday.
      C: John.
      C: .
      S: 250 OK
      C: QUIT
      S: 221 foo.com Service closing transmission channel

Этап 2 — Транслятор → хост получателя

Хост foo.com, получивший сообщение, запрашивает у DNS данные для xyz.com. Он получает такой же набор записей MX, но не может использовать ни свой адрес, ни любой адрес из списка, который менее предпочтителен, по сравнению с xyz.com. Тогда транслятор организует соединение с xyz.com:

           S: 220 xyz.com Simple Mail Transfer Service Ready
           C: EHLO foo.com
           S: 250 xyz.com is on the air
           C: MAIL FROM:<JQP@bar.com>
           S: 250 OK
           C: RCPT TO:<Jones@XYZ.COM>
           S: 250 OK
           C: DATA
           S: 354 Start mail input; end with <CRLF>.<CRLF>
           C: Received: from bar.com by foo.com ; Thu, 21 May 1998
           C:     05:33:29 -0700
           C: Date: Thu, 21 May 1998 05:33:22 -0700
           C: From: John Q. Public <JQP@bar.com>
           C: Subject:  The Next Meeting of the Board
           C: To: Jones@xyz.com
           C:
           C: Bill:
           C: The next meeting of the board of directors will be
           C: on Tuesday.
           C:                         John.
           C: .
           S: 250 OK
           C: QUIT
           S: 221 foo.com Service closing transmission channel

 

D.4. Сценарий проверки и передачи

      S: 220 foo.com Simple Mail Transfer Service Ready
      C: EHLO bar.com
      S: 250-foo.com greets bar.com
      S: 250-8BITMIME
      S: 250-SIZE
      S: 250-DSN
      S: 250-VRFY
      S: 250 HELP
      C: VRFY Crispin
      S: 250 Mark Crispin <Admin.MRC@foo.com>
      C: MAIL FROM:<EAK@bar.com>
      S: 250 OK
      C: RCPT TO:<Admin.MRC@foo.com>
      S: 250 OK
      C: DATA
      S: 354 Start mail input; end with <CRLF>.<CRLF>
      C: Blah blah blah...
      C: ...etc. etc. etc.
      C: .
      S: 250 OK
      C: QUIT
      S: 221 foo.com Service closing transmission channel

Приложение E. Другие вопросы, связанные со шлюзами

В общем случае, шлюзам между Internet и другими почтовыми системами следует пытаться сохранить семантику при передаче сообщения через границу между двумя почтовыми системами. Шлюзы, которые пытаются сделать «вырезки» путем отображения (например, передача информации из конверта одной среды в заголовок или тело сообщения в другой среде), в общем случае не могут обеспечить требуемого уровня передачи информации. Системы, транслирующие между средами, которые не могут поддерживать одновременно конверты и заголовки почты Internet, должны понимать, что в таких случаях потеря некоторой информации практически неизбежна.

Приложение F. Отмененные возможности RFC 821

Некоторые возможности RFC 821 признаны проблематичными и их не следует использовать в почте Internet.

F.1. Команда TURN

Эта команда, описанная в RFC 821, затрагивает важные аспекты безопасности, поскольку в отсутствие жесткой аутентификации для хостов, запрашивающих смену ролей клиента и сервера, такую команду можно с легкостью использовать для переадресации почты. Использование этой команды осуждается и системам SMTP не следует применять ее без аутентификации клиента сервером.

F.2. Задаваемая отправителем маршрутизация

RFC 821 использует концепцию явного задания маршрута отправителем для доставки почты с одного хоста на другой через промежуточные трансляторы. Необходимость использования такой маршрутизации в обычной почте отпала после появления в DNS записей MX. Существенный вклад в отказ от такой маршрутизации внес документ RFC 1123, в соответствии с которым после символа @ в адресе должно указываться полное доменное имя (FQDN). Следовательно, единственной причиной поддержки source route является взаимодействие со старыми клиентами SMTP или агентами MUA, а также отладка почтовых систем. Однако такая маршрутизация может быть полезна при возникновении серьезных проблем временного характера (типа релевантности записей DNS).

Серверы SMTP должны продолжать восприятие синтаксиса source route в соответствии с данной спецификацией и RFC 1123. При необходимости серверы могут игнорировать явные маршруты, используя из адреса только доменное имя. При использовании source route сообщение должно пересылаться в первый указанный в адресе домен. В частности, для серверов недопустимо сокращение маршрута source route.

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

F.3. Команда HELO

Как было указано в параграфах 3.1 и 4.1.1, следует отдавать предпочтение команде EHLO, нежели устаревшей команде HELO. Серверы должны принимать и обрабатывать команды HELO для поддержки старых клиентов.

F.4. #-литералы

В RFC 821 указана возможность задания адресов Internet с помощью десятичного представления номера хоста с префиксом #. На практике с появлением TCP/IP актуальность такого представления была утрачена. В настоящее время этот вариант осуждается и недопустим для использования.

F.5. Даты и годы

При включении клиентами и серверами SMTP значений даты в сообщения (например, в поля трассировки) должно использоваться 4-значное представление года. Двухзначное представление осуждается, а трехзначное никогда не допускалось в почтовых системах Internet.

F.6. Дополнительные команды прямой передачи

В дополнение к спецификации механизма доставки сообщений в почтовые ящики пользователей, RFC 821 обеспечивает добавочные команды для прямой доставки сообщений на консоль пользователя. Эти команды (SEND, SAML, SOML) использовались в реализациях достаточно редко, а изменения в технологии рабочих станций и появление других протоколов могут привести к полному забвению этих команд даже при их поддержке в программах.

Клиентам не следует предоставлять услуги SEND, SAML или SOML, но серверы их могут реализовать. При реализации этих служб сервером должна использоваться модель, приведенная в спецификации RFC 821, а имена команд должны публиковаться в отклике на команду EHLO.

Адрес автора

John C. Klensin

1770 Massachusetts Ave, Suite 322

Cambridge, MA 02140

USA

EMail: john+smtp@jck.com


Перевод на русский язык

Николай Малых

nmalykh@protokols.ru


Полное заявление авторских прав

Copyright (C) The IETF Trust (2008).

К этому документу применимы права, лицензии и ограничения, указанные в BCP 78, и, за исключением указанного там, авторы сохраняют свои права.

Этот документ и содержащаяся в нем информация представлены «как есть» и автор, организация, которую он/она представляет или которая выступает спонсором (если таковой имеется), Internet Society и IETF отказываются от каких-либо гарантий (явных или подразумеваемых), включая (но не ограничиваясь) любые гарантии того, что использование представленной здесь информации не будет нарушать чьих-либо прав, и любые предполагаемые гарантии коммерческого использования или применимости для тех или иных задач.

Интеллектуальная собственность

IETF не принимает какой-либо позиции в отношении действительности или объема каких-либо прав интеллектуальной собственности (Intellectual Property Rights или IPR) или иных прав, которые, как может быть заявлено, относятся к реализации или использованию описанной в этом документе технологии, или степени, в которой любая лицензия, по которой права могут или не могут быть доступны, не заявляется также применение каких-либо усилий для определения таких прав. Сведения о процедурах IETF в отношении прав в документах RFC можно найти в BCP 78 и BCP 79.

Копии раскрытия IPR, предоставленные секретариату IETF, и любые гарантии доступности лицензий, а также результаты попыток получить общую лицензию или право на использование таких прав собственности разработчиками или пользователями этой спецификации, можно получить из сетевого репозитория IETF IPR по ссылке http://www.ietf.org/ipr.

IETF предлагает любой заинтересованной стороне обратить внимание на авторские права, патенты или использование патентов, а также иные права собственности, которые могут потребоваться для реализации этого стандарта. Информацию следует направлять в IETF по адресу ietf-ipr@ietf.org.


1Simple Mail Transfer Protocol — простой протокол передачи электронной почты.

2SMTP mail relayin.

3mail submission.

4Post Office Protocol — протокол «почтового отделения».

5Relay.

6Gateway.

7Message submission server.

8Service extensions model.

9Однако для совместимости со старыми реализациями клиенты и серверы SMTP по-прежнему должны поддерживать команды HELO.

10fully-qualified domain name.

11 Английского алфавита. Прим. перев.

12Недопустимый порядок следования команд.

13Дата, тема, кому, копия, от кого.

14Это список рассылки, а не пользователь.

15Невозможно проверить членов списка.

16Это имя пользователя, а не список рассылки.

17О невозможности доставки почты. Прим. перев.

18Gateway, gateway SMTP.

19Перевод строки без возврата каретки. Прим. перев.

20Соответствующая спецификации реализация будет возвращать такой код только в совершенно непонятных случаях.

21Разрешен только для старых серверов, которые не поддерживают EHLO.

22См. параграф 3.4, в котором обсуждается использование откликов 251 и 551

23Универсальное время. Прим. перев.

24Pretty Good Privacy.

25Secure/Multipurpose Internet Mail Extensions.

26a man in the middle — «человек посередине».

Рубрика: RFC | Оставить комментарий

RFC 5342 IANA Considerations and IETF Protocol Usage for IEEE 802 Parameters

Заменен RFC 7042.

Рубрика: RFC | Оставить комментарий

RFC 5325 Licklider Transmission Protocol — Motivation

Network Working Group                                        S. Burleigh
Request for Comments: 5325                NASA/Jet Propulsion Laboratory
Category: Informational                                       M. Ramadas
                                                            ISTRAC, ISRO
                                                              S. Farrell
                                                  Trinity College Dublin
                                                          September 2008

Протокол LTP — мотивация

Licklider Transmission Protocol — Motivation

PDF

Статус документа

В этом документе определен экспериментальный протокол для сообщества Internet. Документ не задает каких-либо стандартов Internet и служит приглашением к дискуссии в целях развития и совершенствования протокола.

Примечание IESG

Данный RFC не рассматривается в качестве кандидата на роль стандарта Internet. Документ является согласованным результатом работы исследовательской группы DTN1 Комитета по исследованиям Internet (IRTF). Дополнительную информацию о процедурах можно найти в RFC 3932.

Аннотация

В этом документе рассмотрены мотивы разработки протокола LTP2, предназначенного для обеспечения за счет повторов надежной передачи по каналам с экстремально большими значениями времени кругового обхода (RTT) для сообщений и/или частыми разрывами связи. Поскольку связь через межпланетное пространство является наиболее характерным примером такого сорта сред, протокол LTP, прежде всего, предназначен для обеспечения надежной дальней связи в межпланетном пространстве. Однако этот протокол может применяться и в других средах.

В межпланетной сети Internet, использующей Bundle Protocol, который был разработан исследовательской группой DTN, протокол LTP предназначен для работы в качестве надежного протокола уровня конвергенции между парами смежных узлов межпланетной сети, связанных по радиоканалам (RF) с одним интервалом. LTP выполняет автоматический повтор запросов (ARQ) на передачу данных за счет использования селективных подтверждений доставки. Этот механизм учитывает состояние и не требует какого-либо дополнительного согласования.

Данный документ является результатом работы исследовательской группы DTN и согласован с членами этой группы. Публикация документа как RFC не встретила возражений.

1. Введение

Протокол быстрой передачи LTP разработан для обеспечения надежной передачи данных по каналам с экстремально большими значениями времени кругового обхода и/или частыми разрывами связи. Связь в межпланетном пространстве является наиболее типичным примером таких сред и протокол LTP предназначен, прежде всего, для поддержки надежной дальней связи через межпланетные радиоканалы. В частности, протокол LTP предназначен для обеспечения надежного протокола уровня конвергенции, работающего «под» протоколом DTN [DTN] Bundle [BP], в разворачиваемых DTN средах, где каналы данных характеризуются очень большим временем кругового обхода.

В этом документе рассмотрены мотивы создания протокола LTP, возможности и функции протокола, а также его общее устройство. Этот документ является частью серии RFC, описывающих протокол LTP. Два других документа содержат спецификацию протокола [LTPSPEC] и описание протокольных расширений [LTPEXT].

Протокол назван в честь пионера ARPA/Internet — JCR Licklider.

2. Постановка задачи

2.1. Рабочая среда IPN

Существует множество фундаментальных различий между средами наземных коммуникаций (такими, которые используются в Internet) и рабочими средами, которые могут применяться в межпланетных сетях (IPN3) [IPN].

Наиболее существенным различием при коммуникациях между точками, расположенными на Земле, и межпланетных коммуникациях является время кругового обхода. Причины такого различия имеют как физическую, так и экономическую природу.

Основной причиной задержки является конечная скорость распространения сигналов. Задержка при прохождении сигнала от Земли до Европы (спутник Юпитера) и обратно составляет от 66 до 100 минут.

Менее очевидными и более динамичными являются задержки, вносимые затмениями. Связи между планетами должна осуществляться посредством лучевой передачи, которая обычно возможна только при отсутствии препятствий между взаимодействующими объектами. Во время сеанса связи возможно возникновение пауз, связанных с перекрытием луча (затмением), в течение которых доставка сообщений становится не возможной и требуется помещать сообщения в очередь для последующей передачи.

Время кругового обхода и затмения могут быть рассчитаны на основе эфемерид взаимодействующих объектов. Дополнительная и менее предсказуемая задержка вносится перерывами в передаче данных, обусловленными экономическими причинами.

Межпланетная связь требует использования специализированного и дорогостоящего оборудования — гигантских антенн, высокочувствительных приемников и т. п.

Для дальней космической связи, даже не относящейся к сфере деятельности NASA, в настоящее время используется поддерживаемая NASA сеть DSN4 [DSN]. Коммуникационные ресурсы в настоящее время полностью расписаны и такое состояние сохраниться в обозримом будущем. Следовательно, радиообмен через DSN требуется планировать заблаговременно и выделяемые ресурсы весьма ограничены.

Постоянная полная загрузка означает, что на время кругового обхода для пакетов оказывает влияние не только задержка распространения сигналов и затмения, но и задержки, связанные с планированием и очередями, вносимыми системой управления наземными ресурсами. Пакеты, передаваемые по заданному адресу могут быть задержаны до следующего сеанса связи и величина задержки может измеряться часами, днями и даже неделями.

Такие условия работы вносят множество дополнительных ограничений для протоколов, способных обеспечивать надежную связь по каналам дальней космической связи.

  • Большое время кругового обхода означает существенную задержку между передачей блока данных и приемом подтверждения доставки от получателя. Если LTP будет откладывать передачу последующих блоков данных до того момента, когда будет подтверждена доставка всех отправленных ранее блоков, дорогостоящие ресурсы каналов дальней космической связи (используемая полоса) будут практически полностью потеряны. Требуется организация множества параллельных «сеансов» передачи данных для предотвращения неполного использования канала связи.

  • Подобно любому другому транспорту с гарантированной доставкой, использующему ARQ, протокол LTP учитывает состояния соединений. Для обеспечения гарантий получения переданного блока данных LTP должен сохранять возможность повторной передачи любой части блока данных, который еще не был получен. Для реализации такой возможности протокол должен отслеживать доставку каждой части переданных блоков данных, чтобы иметь информацию о тех частях блока, которые уже доставлены и которые еще не доставлены, а также дополнительную информацию, которая может потребоваться для повторной передачи любой части блока данных.

  • В сетях IPN время кругового обхода может быть столь большим, а продолжительность сеансов столь малой, что согласование параметров (таких, как выбор скорости передачи) может требовать времени, превышающего продолжительность сеанса связи. Даже при непрерывной связи согласование параметров до начала передачи данных приводит к неэффективному использованию дорогих канальных ресурсов.

  • Другое отличие LTP от протокола TCP заключается в том, что соединения TCP являются двухсторонними (блоки данных приложений могут передаваться по одному каналу в обоих направлениях), а сеансы LTP являются односторонними. Это связано с тем, что поток данных, передаваемых при межпланетных полетах, является однонаправленным по своей природе (большое время кругового обхода делает интерактивное взаимодействие неоправданно дорогим, поэтому космические аппараты достаточно автономны и поток команд с Земли весьма мал). Двухсторонний обмен данными в тех случаях, когда это возможно, организуется за счет создания двух односторонних соединений в противоположных направлениях с разными скоростями.

  • Кроме того, расчет интервалов тайм-аута для сред, в которых обычно используется LTP, существенно отличается от расчета этих параметров в Internet. Поскольку одновременно может существовать множество параллельных сессий, задержка передачи в любой отдельной сессии в ожидании тайм-аута не снижает производительности соединения в целом. Интервалы тайм-аутов, которые могут быть недопустимыми для TCP, в LTP могут даже не снижать эффективность использования полосы канала.
    Однако полудуплексная двухсторонняя передача данных в LTP делает невозможным использование статистического анализа времени кругового обхода для предсказания значений этого параметра. Время кругового обхода для переданного сегмента N может оказаться на несколько порядков больше аналогичного параметра для сегмента N-1 просто по тому, что между передачей этих сегментов наблюдался период отсутствия связи. Поэтому требуется иной механизм расчета интервалов тайм-аута.

2.2. Почему не TCP или SCTP?

Такие характеристики сред, как большие задержки со значительными вариациями, прерывающаяся связность и сравнительно высокая частота ошибок, делают невозможным использование обычного протокола TCP для сквозной передачи данных в IPN. Используя уравнение для расчета пропускной способности TCP из работы [TFRC], мы можем определить частоту случаев потери (p), при которой может быть достигнута заданная полоса пропускания в установившемся состоянии. Предполагая, что минимальное значение RTT при связи между Землей и Марсом равно 8 минутам (при минимальном расстоянии между планетами на прохождение света между планетами в одном направлении требуется 4 минуты), размер пакета составляет 1500 байтов, а получатель подтверждает каждый второй пакет, и игнорируя пренебрежимо малые компоненты высоких порядков в p (т. е., второй дополнительный член в знаменателе уравнения для пропускной способности TCP), мы получим значения частоты потерь, допустимой для достижения требуемой пропускной способности, показанные в таблице.

 

Пропускная способность

Допустимая частота потерь (p)

10 Мбит/с

4,68*10-12

1 Мбит/с

4,68*10-10

100 кбит/с

4,68*10-8

10 кбит/с

4,68*10-6

 

Отметим, что несмотря на трактовку множества потерь в течение одного периода RTT трактуется как одна потеря при расчете пропускной способности TCP с помощью уравнения [TFRC], приведенные в таблице значения вероятности потерь являются недостижимыми для каналов в дальний космос.

В контексте нашего обсуждения более жесткий расчет пропускной способности TCP, используемый для скоростных каналов (HighSpeed TCP) [HSTCP], просто не рассматривался.

Характерной особенностью TCP является трехэтапное согласование на начальном этапе каждого нового соединения, после которого выполняется механизм замедленного старта. Эти операции создают дополнительные препятствия в работе, поскольку затраты времени на трехэтапное согласование и замедленный старт могут оказаться чрезмерными в средах с большими задержками.

Протокол SCTP5 [SCTP] может мультиплексировать блоки6 (объект данных приложения) для организации множества сессий в одном соединении (в SCTP это называется ассоциацией), как это делается в LTP, но в SCTP также затрачивается множество периодов кругового обхода до того, как начнется передача данных приложений. Очевидно, что такое решение не подходит для использования в средах IPN.

3. Обзор протокола

3.1. Штатная работа

Ниже описана обычная последовательность событий для сеансов передачи LTP.

Работа начинается с момента, когда экземпляр клиента запрашивает у машины LTP передачу блока данных удаленному клиенту.

LTP рассматривает каждый блок данных, как состоящий из двух частей — «красной», при доставке которой используются подтверждения и повторы передачи (при необходимости), и «зеленой», для которой предпринимаются попытки доставить без обеспечения гарантий. Размер каждой из частей может быть нулевым, т. е., любой юлок данных может трактоваться целиком, как «красный» или «зеленый». В первом случае попытки передачи блока повторяются, пока не будет получено подтверждение успешной доставки всего блока, а во втором просто предпринимается попытка передать данные без гарантии доставки. Таким образом, LTP может работать, подобно протоколу TCP и UDP одновременно в рамках одной сессии.

Отметим, что при передаче в режиме «красный-зеленый», «красная» часть не имеет какой-либо семантики для уровня важности или приоритета данных в «зеленой» части блока. «Красная» часть просто содержит данные, для которых пользователь запросил надежную передачу и без которых возможно (но не обязательно) данные «зеленой» части становятся бесполезными. Например, «красная» часть может содержать заголовок прикладного уровня или другие метаданные.

Экземпляр клиента использует программный интерфейс LTP для идентификации LTP экземпляра удаленного клиента, которому нужно передать данные, местоположение передаваемых данных, общий размер передаваемой информации и размер данных в начальной части блока, которые передаются в качестве «красных». Передающая машина начинает сеанс передачи этого блока и уведомляет экземпляр клиента о начале сеанса. Отметим, что параметры коммуникационного сеанса LTP не согласуются, а просто заявляются в одностороннем порядке на уровне управления приложением; передающая машина не согласует начало сеанса с машиной удаленного клиента.

После этого передающая машина инициирует первоначальную передачу, помещая в очередь столько сегментов данных, сколько требуется для передачи блока целиком, с учетом ограничений на размер сегмента, вносимых нижележащим коммуникационным уровнем. Последний сегмент «красной» части блока маркируется, как EORP7; этот маркер говорит о завершении «красной части» и служит контрольной точкой (идентифицируется уникальным порядковым номером), показывающей, что приемная машина должна отправить подтверждение доставки при получении этого сегмента. Последний сегмент блока маркируется, как EOB8; этот маркер говорит принимающей машине о возможности расчета размера блока путем суммирования смещения и размера данных в сегменте.

Протокол LTP рассчитан на работу непосредственно «поверх» протокола канального уровня, но может также в некоторых случаях (например, при разработке программ или при использовании в частных ЛВС) работать «поверх» протокола UDP. В любом случае протокольный уровень, расположенный непосредственно под уровнем LTP мы будем называть локальным канальным уровнем9.

На следующем этапе выделяется полоса для очереди, в которую помещены сегменты данных блока, помещенные в очередь сегменты, их размеры передаются локальному протоколу канального уровня (это может быть UDP/IP) через поддерживаемый этим протоколом интерфейс API для передачи машине LTP обслуживающей удаленный экземпляр клиента.

Таймер запускается в момент EORP, поэтому при отсутствии отклика он может быть автоматически запущен снова.

Каждый модуль данных локального протокола канального уровня (кадр канального уровня или дейтаграмма UDP) должен содержать целое число сегментов LTP и локальный протокол канального уровня никогда не должен доставлять неполные сегменты LTP приемной машине LTP. Когда в качестве локального протокола канального уровня используется UDP, следует использовать расширение LTP для аутентификации [LTPEXT], чтобы гарантировать целостность данных в тех случаях. От использования этого расширения можно отказаться, если на всем пути обеспечивается пренебрежимо малая вероятность повреждения пакетов (как в некоторых приватных ЛВС) или последствиями повреждения данных в процессе передачи и/или обработки можно пренебречь (как в некоторых случаях при разработке приложений). Когда расширение LTP для аутентификации не используется, протокол LTP требует от локального протокола канального уровня контроля целостности всех принятых сегментов. В частности, локальный протокол канального уровня должен детектировать и отбрасывать принятые поврежденные сегменты.

Принятые сегменты, которые не были отброшены, передаются приемной машине LTP через интерфейс API, поддерживаемый локальным протоколом канального уровня.

При получении первого сегмента данных для блока принимающая машина запускает сеанс приема для этого блока и уведомляет локальный экземпляр соответствующего клиентского сервиса о начале сеанса. В обычных условиях все сегменты исходной передачи принимаются без ошибок. Следовательно, на получение сегмента данных EORP приемная машина отвечает (a) помещением в очередь для отправки передающей машине сегмента отчета, показывающего завершение приема, и (b) доставкой крайней части блока локальному экземпляру клиентского сервиса; на получение каждого сегмента зеленой части приемная машина реагирует незамедлительной доставкой принятых данных локальному экземпляру клиентского сервиса.

Все факты доставки данных и протокольные события передаются локальному экземпляру клиентского сервиса с использованием программного интерфейса реализации LTP.

Отметим, что по причине однонаправленности потока данных LTP подтверждения LTP (отчеты о получении) не могут прицепляться к сегментам данных TCP и передаются в отдельном типе сегментов.

На следующем этапе помещенный в очередь сегмент отчета незамедлительно отправляется передающей машине и запускается таймер, по завершении отсчета которого отчетный сегмент передается повторно, если не будет получен отклик.

Передающая машина получает сегмент отчета, выключает таймер EORP, помещает в очередь для передачи приемной машине сегмент подтверждения приема отчета и уведомляет локальный экземпляр клиентского сервера об успешной передаче красной части блока. На этом сеанс передачи красной части завершается.

На следующем этапе помещенный в очередь сегмент подтверждения отчета незамедлительно передается приемной машине.

Приемная машина получает сегмент подтверждения отчета и выключает для этого сегмента таймер повтора. Сеанс приема красной части и передача блока на этом завершается.

3.1.1. Сигналы о состоянии канала

Организация межпланетного канала может повлечь за собой изменения аппаратной конфигурации на основе предполагаемого состояния удаленного коммуникационного устройства. Такие изменения могут включать, например:

  • ориентацию приемной антенны;

  • подстройку транспондера на выбранные частоты передачи и/или приема;

  • точная подстройка питания транспондера в последний момент и отключение питания по окончании сеанса.

Мы, следовательно, предполагаем, что операционная среда, в которой работает протокол LTP, способна передавать протоколу LTP информацию о состоянии канала, говорящую протоколу с какой из удаленных машин LTP следует взаимодействовать локальной машине LTP. Операционная среда сама по себе должна иметь такую информацию для корректной настройки оборудования коммуникационного канала.

3.1.2. Отложенная передача

Информация о состоянии канала также уведомляет LTP о невозможности передачи сегментов. В межпланетной связи ни в какой момент нельзя быть уверенным в наличии двухсторонней связи. В LTP всегда возможна генерация исходящего, который невозможно передать незамедлительно, — в ответ на прием сегмента, по тайм-ауту или запросу клиентского сервиса. Эти сегменты должны помещаться в очередь для последующей передачи, когда канал будет организован, о чем укажет информация о состоянии канала.

Концептуально каждый исходящий сегмент LTP добавляется в конец одной или двух очередей (формируя набор очередей) трафика, привязанного к машине LTP, которая является получателем сегмента. Одна из таких очередей является «внутренней операционной очередью» данного набора, другая — очередью данных приложения. Извлечение сегмента из очереди всегда означает его доставку нижележащей коммуникационной системе для незамедлительной передачи. Когда внутренняя операционная очередь не пуста, наиболее старый сегмент в этой очереди является следующим сегментом, который будет извлечен из очереди для передачи адресату. В остальных случаях следующим сегментом для извлечения из очереди и передачи является наиболее старый сегмент очереди данных приложений.

Создание и размещение сегмента в очереди и последующая реальная передача этого сегмента, в принципе, совершенно не синхронизированы.

В случае, когда (a) коммуникационный канал к адресату активен, (b) очередь, в которую помещается данный исходящий сегмент, пуста и (c) эта очередь является внутренней операционной или последняя пуста, сегмент будет передаваться незамедлительно после его создания. Передача вновь созданных сегментов во всех других случаях откладывается.

Концептуально отмена постановки в очередь (de-queuing) сегментов из очередей трафика, привязанных к данному получателю, инициируется при получении сигнала о состоянии канала, указывающего, что базовая коммуникационная система передает данные этому адресату (т. е. канал к получателю активен). Это прекращается после получения сигнала о том, что базовая коммуникационная система больше не передает данных этому получателю (т. е. канал к адресату больше не активен).

3.1.3. Таймеры

LTP опирается на точный расчет ожидаемого времени прибытия сегментов с отчетами и подтверждениями для того, чтобы знать, когда нужен упреждающий повтор передачи. Если расчетное время оказалось немного раньше, в результате могут возникнуть издержки от ненужного повтора передачи. С другой стороны, расчетное время прибытия может на несколько секунд позже безопасно и единственным «наказанием» за более поздний тайм-аут и повтор передачи будет незначительная задержка доставки данных и освобождения ресурсов сессии.

Поскольку статистику, основанную на истории интервалов кругового обхода, невозможно безопасно использовать для предсказания времени кругового обхода LTP, мы должны предположить, что время кругового обхода по крайней мере приблизительно детерминировано (т. е. достаточно точная оценка значения RTT может быть выполнена индивидуально в реальном масштабе времени на основе доступной информации).

Расчет выполняется в два этапа, описанных ниже.

  • Первое приближение RTT рассчитывается простым удвоением времени прохождения светового луча к получателю с добавлением произвольного значения предполагаемой дополнительной задержки (например, в очередях или при обработке в оконечных точках). Для операций в глубоком космосе такая добавка обычно составит несколько (немного) секунд. Хотя такая добавка представляется аномальной с точки зрения стандартов Internet, она невелика по сравнению со временем прохождения света туда и обратно. Мы предпочли риск запоздалого повтора передачи, который просто задержит доставку одного блока на сравнительно небольшое время, слишком раннему повтору, ведущему к неоправданному расходу пропускной способности и общему снижению производительности.

  • Затем для учета дополнительных задержек, вносимых перебоями в связи, таймеры динамически приостанавливаются на те периоды, когда относящиеся к делу удаленные машины LTP заведомо не способны передавать отклики. Предполагается, что состояние удаленных систем определяется на основе сигналов о состоянии канала от работающего оборудования.

Приведенное ниже обсуждение служит базой для расчетов ожидаемого времени прибытия LTP.

Общее время, требуемое для одного «кругового обхода» (передача и прием исходного сегмента, а затем передача и прием сегмента подтверждения) состоит из перечисленных ниже компонент.

  • Протокольное время обработки. Время, затрачиваемое на выдачу исходного сегмента, его прием, генерацию и выдачу сегмента подтверждения, а также прием сегмента подтверждения.

  • Задержка в выходных очередях. Задержка у отправителя исходного сегмента на ожидание в очереди на передачу и задержка у отправителя подтверждения на ожидание в очереди на передачу.

  • Время на передачу. Время на выдачу (отправку) всех битов исходного сегмента и время на выдачу всех битов сегмента подтверждения (это важно лишь при очень низкой скорости передачи).

  • Время кругового обхода со скоростью света. Время распространения сигнала со скоростью света в обоих направлениях.

  • Задержка во входных очередях. Задержка во входной очереди у получателя исходного сегмента и задержка во входной очереди у получателя сегмента подтверждения.

  • Задержка на передачу исходного сегмента или сегмента подтверждения по причине потери связи, т. е. в результате прекращения активности у отправителя любого из сегментов по причине затенения, запланированного выхода из зоны видимости и т. п.

В этом контексте, где могут возникать ошибки продолжительностью в секунды и даже минуты, протокольное время обработки на каждой из сторон сессии считается пренебрежимо малым.

Задержка во входной очереди также считается пренебрежимо малой, поскольку даже на мелких космических станциях скорость обработки LTP значительно выше скорости передачи данных.

Применяется два механизма снижения задержки в выходных очередях до пренебрежимо малых значений.

  • Ожидаемое время прибытия сегмента подтверждения не рассчитывается, пока базовая система связи не уведомит LTP о начале передачи исходного сегмента. Все задержки в выходной очереди для исходного сегмента к этому моменту уже состоялись.

  • Модель отложенной передачи LTP минимизирует задержку доставки сегментов подтверждений (отчеты и подтверждения) базовой коммуникационной системе. Таким образом, сегменты подтверждения (концептуально) добавляются в конец внутренней очереди операций, а не в очередь данных приложения, поэтому они имеют более высокий приоритет передачи по сравнению с другими исходящими сегментами, т. е. они всегда должны извлекаться из очереди для первостепенной передачи. Это ограничивает задержку в выходной очереди для данного сегмента подтверждения до времени, требуемого для извлечения из очереди и отправки всех ранее созданных сегментов подтверждения, которые еще находятся в очереди на передачу. Поскольку сегменты подтверждения передаются нечасто, и обычно малы, задержка данного сегмента подтверждения в выходной очереди будет, вероятно, минимальной.

Отсрочка расчета ожидаемого времени прибытия сегмента подтверждения до момента, когда исходный сегмент передается в канал (излучается) обеспечивает дополнительный эффект отказа от рассмотрения любой задержки передачи исходного сегмента в результате потери связи на стороне отправителя этого сегмента.

Задержка при передаче на каждой стороне сессии — это просто размер сегмента, поделенный на скорость передачи. Она несущественна за исключением ситуаций, когда скорость передачи предельно мала (например, 10 бит/с) и применение LTP может оказаться нецелесообразным по иным причинам (например, издержки, связанные с заголовком LTP, могут быть слишком велики при такой скорости). Поэтому задержкой на излучение обычно пренебрегают.

Предполагается, что время распространения сигнала в одном направлении с точностью до секунды известно всегда (например, обеспечивается рабочей средой).

Поэтому начальное ожидаемое время прибытия для каждого сегмента подтверждения обычно рассчитывается путем добавления к текущему времени излучения исходного сегмента удвоенного времени прохождения сигнала в одном направлении и 2*N секунд запаса для учета задержки в очередях и при обработке и длительности излучения на обеих сторонах. Параметр N устанавливается системой управления и значение 2 секунды представляется разумным по умолчанию.

Остается одна неизвестная величина — дополнительное время кругового обхода, вносимое потерей связности у получателя сегмента подтверждения. Для его учета снова будем полагаться на сигналы состояния внешнего канала. Всякий раз, когда прерывание передачи на удаленной машине LTP указывается сигналом состояния канала, останавливаются таймеры обратного отсчета для всех сегментов подтверждения, ожидаемых данной машиной. По сигналу восстановления передачи отсчет таймеров возобновляется (фактически) добавляя к каждому ожидаемому времени прибытия интервала простоя, когда таймеры не работали.

3.2. Повтор передачи

Потеря или повреждение переданного сегмента может привести к отклонению работы LTP от обычной последовательности событий, описанной выше.

Потеря одного или нескольких сегментов данных красной части, отличных от сегмента EORP, вызывает повторную передачу данных — приемная машина возвращает отчет, указывающий все полученные непрерывные диапазоны красной части (в предположении, что не были получены описанные ниже дискреционные контрольные точки). Отчет о получении обычно передается в одном отчетном сегменте, содержащем уникальный порядковый номер отчета и охват красной части данных. Например, если данные красной части охватывали блок со смещениями [0:1000] и были получены все данные, кроме диапазона [500:600], сегмент отчета будет содержать уникальный номер (скажем, 100), а охват [0:1000] будет указан двумя записями — (0:500) и (600:1000). Максимальный размер сегмента отчета, как и всех сегментов LTP, ограничивается значением MTU в канале данных. Если было потеряно много дискретных сегментов одного большого блока и/или значение MTU в канале данных достаточно мало, может потребоваться создание множества сегментов отчета. В таких случаях LTP создает нужное число сегментов данных и делит область охвата красной части между сегментами отчетов так, что каждый из них может сохранять самостоятельность. Например, при генерации трех отчетных сегментов для красной части [0:1000000] они могут иметь вид: RS 19 с охватом [0:300000], RS 20 с охватом [300000:950000] и RS 21 с охватом [950000:1000000]. Во всех случаях таймер запускается при отправке каждого сегмента отчета о получении данных.

При получении каждого отчетного сегмента передающая машина выполняет указанные ниже действия.

  • Выключение таймера для контрольной точки, указанной полученным сегментом отчета (при наличии).

  • Размещение в очереди подтверждения приема отчетного сегмента для отключения таймера повтора на приемной стороне). Этот сегмент передается при ближайшей возможности.

  • Если прием данных, указанный в сегменте отчета, говорит о том, что не все охваченные данные были получены, обычно инициируется повторная передача путем добавления в очередь всех не принятых сегментов. Последний из таких сегментов помечается как контрольная точка и содержит порядковый номер сегмента отчета, для которого выполняется повтор передачи. Эти сегменты также отправляются при ближайшей возможности, но лишь после сегментов, ранее помещенных в очередь для передачи приемной стороне. Запускается таймер для контрольной точки, чтобы повторить передачу, если не будет получен соответствующий сегмент отчета.

  • Если прием данных, указанный в сегменте отчета, говорит о том, что все охваченные данные были получены, а объединение всех указанных в отчетах приемов данных в этой сессии говорит о получении всей красной части блока, передающая машина уведомляет локального клиента о получении всей красной части блока и окончании красной части сессии.

При получении сегмента подтверждения отчета приемная сторона выключает таймер для этого сегмента.

При получении сегмента контрольной точки с отличным от 0 порядковым номером приемная машина выполняет указанные ниже действия.

  • Возвращение отчета о приеме, содержащего нужное количество отчетных сегментов для информирования о всех принятых данных в сфере охвата упомянутого сегмента отчета и запуск таймера для каждого сегмента.

  • Если к этому моменту получены все данные красной части блока, приемная машина доставляет полученный красный блок локальному экземпляру клиентского сервиса и при получении сегментов подтверждения приема, подтверждающих все включенные в отчет сегменты прием красной части сессии и передача блока завершается. В противном случае продолжаются циклы повторной передачи данных.

Потеря сегмента контрольной точки или отчетного сегмента, созданного в ответ, вызывает тайм-аут и в таких случаях передающая машина обычно повторяет сегмент контрольной точки. Точно так же потеря сегмента отчета или соответствующего сегмента подтверждения отчета ведет к тайм-ауту и приемная машина обычно повторяет сегмент отчета.

Отметим, что избыточный сегмент отчета (т. е. уже полученный и обработанный отправителем) передается повторно в результате потери соответствующего сегмента подтверждения отчета, вызывает, например, передачу другого сегмента подтверждения отчета, а в остальных случаях игнорируется. Если какой-либо из сегментов данных, повторно переданных в ответ на исходное получение сегмента отчета, теряется, дальнейший повтор этих сегментов будет запрашиваться отчетом о получении, созданном в ответ на получение последний повторно переданных данных, помеченных как контрольная точка. Таким образом, ненужные повторы подавляются.

Отметим также, что ответственность за отклики на потерю сегмента в LTP разделена между отправителем и получателем блока. Отправитель повторно передает сегменты контрольных точек в ответ на тайм-аут для контрольной точки и повторно передает недостающие данные в ответ на получение отчета, указывающего неполный прием, а получатель повторно передает сегменты отчетов при возникновении тайм-аута. Можно было сделать ответственным за все повторы лишь отправителя и в этом случае получатель не будет ожидать сегментов подтверждения отчета и повторять отчетные сегменты. Однако с таким подходом связаны два недостатка.

Во-первых, по причине ограничений на размер сегмента, которые могут быть внесены базовой коммуникационной службой, (по меньшей мере, удаленно) возможно, что отклик на любую отдельную контрольную точку может содержать множество отчетных сегментов. Потребуется дополнительный механизм на стороне отправителя для обнаружения и надлежащего реагирования на потерю некоторого подмножества этих отчетов о приеме. Предложенное в документе решение представляется более простым.

Во-вторых, получающей блок машине нужен способ определения момента, когда сессия может быть закрыта. При отсутствии явного подтверждения финального отчета (что влечет за собой повторную отчета в случае потери подтверждения отчета) вариантами могут быть (a) немедленное завершение сеанса после передачи сегмента отчета, который подтверждает полноту приема или (b) завершение сеанса при получении явного указания от отправителя. В случае (a) потеря финального отчетного сегмента будет вызывать повторную передачу контрольной точки отправителем, но сессия уже будет закрыта к моменту прибытия переданной повторно контрольной точки. Контрольную точку можно резонно счесть первым сегментом данных нового блока, большая которого потеряна в пути и это приведет к избыточному повтору передачи целого блока. В случае (b) явный сегмент прерывания сессии и ответное подтверждение получателя (требуется для отключения таймера сегмента завершения, который, в свою очередь, нужен на случай потери или повреждения завершающего сегмента в пути) несколько усложняют протокол, занимают избыточную полосу и замедляют освобождение ресурсов, использованных для состояния сессии на стороне отправителя. Здесь снова предложенный в документе вариант проще и эффективней.

3.3. Ускоренный повтор передачи

Повтор передачи сегмента данных происходит лишь при получении отчетного сегмента, указывающего неполный прием данных. Сегменты отчетов обычно передаются только в конце исходной передачи красного блока или в конце повторной передачи. Для некоторых приложений может быть желательным инициирование повторной передачи сегмента данных непосредственно в процессе передачи исходного красного блока, чтобы восстановить пропущенные сегменты быстрее. Это можно реализовать двумя способами, как описано ниже.

  • Любой сегмент данных красной части до EORP можно дополнительно пометить как контрольную точку. Получение каждой такой дискреционной точки будет вызывать отправку приемной машиной сегмента отчета.

  • В любой момент исходной передачи красной части блока (т. е. до получения любого сегмента данных зеленой части блока) принимающая машина может в одностороннем порядке передать дополнительные отчеты о получении. Отметим, что режим Immediate протокола CFDP является примером таких асинхронных отчетов о получении [CFDP]. Отчеты о получении создаются для ускорения повторной передачи точно так же, как обычные отчеты о получении.

3.4. Прерывание сессии

Сеанс передачи может быть прерван передающей или приемной машиной в ответ на запрос экземпляра локального клиента или при отказе операции LTP, как указано выше.

Прерывающая сеанс машина удаляет все сегменты из очереди сессии и уведомляет локальный экземпляр соответствующего клиентского сервиса о прерывании сессии. Если никаких сегментов в этой сессии еще не было передано или получено от соответствующей машины LTP, в этот момент прерывающая сессию машина просто закрывает все связанные с сессией состояния и на этом прерывание сессии завершается.

В остальных случаях в очередь помещается сегмент прерывания сессии. При следующей возможности помещенный в очередь сегмент прерывания передается машине LTP, обслуживающей экземпляр удаленного клиента. Для сегмента запускается таймер, чтобы иметь возможность автоматического повтора при отсутствии отклика.

Соответствующая машина принимает сегмент прерывания, помещает в очередь для прерывающей машины сегмент подтверждения, удаляет из очереди все другие сегменты указанной сессии, уведомляет локальный экземпляр клиента об отмене блока и закрывает запись состояния для этой сессии.

При следующей возможности помещенный в очередь сегмент подтверждения сегмента прерывания незамедлительно передается прерывающей сессию машине.

Прерывающая сеанс машина получает уведомление о разрыве сессии, выключает таймер сегмента прерывания и закрывает все записи состояния для сессии.

Потеря сегмента прерывания или соответствующего отклика на этот сегмент приводит к тайм-ауту. В этом случае прерывающая сессию машина повторно передает сегмент прерывания.

4. Вопросы безопасности

Существует явный риск того, что сторонний приемник может прослушивать передачи LTP по спутниковым и другим широковещательным радиоканалам. Такие приемники могут также при желании манипулировать сегментами LTP.

Поэтому имеется потребность в защите конфиденциальности и целостности, а также предотвращении DoS10-атак.

В частности, проблемы DoS более существенны для LTP по сравнению с типичными протоколами Internet, поскольку LTP по своей природе сохраняет состояния достаточно долго и использует продолжительное время ожидания. Кроме того, сброс узлов LTP для восстановления при атаке может быть достаточно сложен. Таким образом, любой злоумышленник, способный влиять на передачу LTP, может организовать серьезную DoS-атаку на приемник LTP.

Рассмотрим, например, наземную ситуацию, где LTP применяется в сети редко расположенных сенсоров. Здесь можно организовать DoS-атаки, в результате которых узлы потеряют критически важную информацию, такую как обновления расписания связи. В таких случаях одна успешная DoS-атака может полностью отключить узел от сети и потребовать его сброса при физическом посещении.

Даже при использовании LTP в глубоком космосе нужно учитывать организуемые с Земли атаки, в частности возможность вставки сообщений в текущий сеанс (обычно без просмотра байтов в предшествующих сообщениях сессии). Такие атаки вероятны при наличии сбоев межсетевых экранов на различных узлах сети или в результате применения троянских программ на легитимных хостах. Многие атаки со вставкой сообщений зависят от возможности атакующего корректно «предсказать» состояния узлов LTP, но опыт показывает, что сделать такие предсказания проще, чем это кажется [DDJ].

Ниже рассматриваются уровни, на которых могут быть реализованы механизмы защиты для повышения безопасности LTP, и связанные с этим компромиссы.

Уровень приложений (выше LTP)

Механизмы безопасности вышележащих уровней явно защищают данные LTP, но оставляют открытыми заголовки LTP. Это слабо защищает (или не защищает совсем) от DoS-атак на LTP, но вполне может сохранить целостность данных и обеспечить их конфиденциальность.

Уровень LTP

Заголовок аутентификации (подобно IPsec [AH]) может помочь в защите от атак с воспроизведением (replay) и других поддельных пакетов. Однако злоумышленнику все еще доступны заголовки LTP, передаваемые через эфир. Такой подход также требует той или иной инфраструктуры управления ключами для обеспечения строгой проверки подлинности, что не всегда приемлемо. Заголовок аутентификации может ослабить многие DoS-атаки.

Можно задать защиту конфиденциальности для данных LTP и некоторых полей заголовков. Однако это представляется менее привлекательным, поскольку (a) защиту конфиденциальности можно более эффективно организовать на уровнях выше или ниже LTP, (b) управление ключами для такой защиты сложнее (в контексте больших задержек), нежели для защиты целостности и (c) требования к машинам LTP пытаться расшифровывать входящие сегменты само по себе открывает возможность для DoS-атак.

Кроме того, на уровне LTP можно применять различные решения для снижения вероятности успешных DoS-атак. В частности, можно потребовать случайного выбора некоторых полей заголовков (например, номеров сессий).

Уровень канала данных (ниже LTP)

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

В свете сказанного LTP включает в себя механизмы защиты, перечисленные ниже.

Необязательный механизм LTP Authentication является расширением сегмента LTP с идентификатором шифра и необязательным идентификатором ключа перед содержимым сегмента, а также значением аутентификации (код аутентификации или цифровая подпись) после содержимого сегмента. Идентификатор шифра служит для указания размера и формата значения аутентификации. Механизм аутентификации служит для защиты целостности сегмента, а в зависимости от выбранного шифра и метода управления ключами может служить для контроля подлинности сегмента.

Необязательный механизм LTP является расширением сегмента LTP со случайным числовым значением cookie перед содержимым сегмента. За счет увеличения числа байтов в сегменте, которое не может быть точно предсказано поддельным источником данных, и требования отбрасывать сегменты, в которых нет корректного значения этих байтов, механизм cookie усложняет организацию DoS-атак на машины LTP.

Упомянутые механизмы подробно описаны в документе расширений LTP [LTPEXT].

В дополнение к этому порядковые номера в контрольных точках и отчетах LTP должны иметь случайные целочисленные значения, а разработчикам рекомендуется также выбирать случайные номера для сессий. Это повышает уровень защищенности от DoS-атак. Рекомендации по выбору случайных значений приведены в [PRNG].

5. Взаимодействие с IANA

См. одноименные разделы в документах [LTPSPEC] и [LTPEXT].

6. Благодарности

Большое спасибо Tim Ray, Vint Cerf, Bob Durst, Kevin Fall, Adrian Hooke, Keith Scott, Leigh Torgerson, Eric Travis, and Howie Weiss за их вклад в разработку протокола и архитектуры устойчивых к задержкам сетей (DTN).

Часть описанного здесь исследования была выполнена в Jet Propulsion Laboratory, California Institute of Technology по контракту с National Aeronautics and Space Administration (DOD Contract DAA-B07-00-CC201, DARPA AO H912; JPL Task Plan No. 80-5045, DARPA AO H870; NASA Contract NAS7-1407).

Спасибо также Shawn Ostermann, Hans Kruse и Dovel Myers из Ohio University за их предложения и советы при выборе решений. Эта работа была выполнена, когда Manikantan Ramadas был аспирантом EECS Dept., Ohio University в Internetworking Research Group Laboratory.

Часть этой работы была выполнена в Trinity College Dublin в рамках контракта SeNDT, финансируемого исследовательским инновационным фондом Enterprise Ireland.

7. Литература

7.1. Информационные ссылки

[LTPSPEC] Ramadas, M., Burleigh, S., and S. Farrell, «Licklider Transmission Protocol — Specification», RFC 5326, September 2008.

[LTPEXT] Farrell, S., Ramadas, M., and S. Burleigh, «Licklider Transmission Protocol — Security Extensions», RFC 5327, September 2008.

[AH] Kent, S., «IP Authentication Header», RFC 4302, December 2005.

[BP] Scott, K. and S. Burleigh, «Bundle Protocol Specification», RFC 5050, November 2007.

[CFDP] CCSDS File Delivery Protocol (CFDP). Recommendation for Space Data System Standards, CCSDS 727.0-B-2 BLUE BOOK Issue 1, October 2002.

[DDJ] I. Goldberg and E. Wagner, «Randomness and the Netscape Browser», Dr. Dobb’s Journal, 1996, (pages 66-70).

[DSN] Deep Space Mission Systems Telecommunications Link Design Handbook (810-005) web-page, «http://eis.jpl.nasa.gov/deepspace/dsndocs/810-005/«

[DTN] K. Fall, «A Delay-Tolerant Network Architecture for Challenged Internets», In Proceedings of ACM SIGCOMM 2003, Karlsruhe, Germany, Aug 2003.

[IPN] InterPlanetary Internet Special Interest Group web page, «http://www.ipnsig.org«.

[TFRC] Handley, M., Floyd, S., Padhye, J., and J. Widmer, «TCP Friendly Rate Control (TFRC): Protocol Specification», RFC 3448, January 2003.

[HSTCP] Floyd, S., «HighSpeed TCP for Large Congestion Windows», RFC 3649, December 2003.

[SCTP] Stewart, R., Ed., «Stream Control Transmission Protocol», RFC 4960, September 2007.

[PRNG] Eastlake, D., 3rd, Schiller, J., and S. Crocker, «Randomness Requirements for Security», BCP 106, RFC 4086, June 2005.

Адреса авторов

Scott C. Burleigh

Jet Propulsion Laboratory

4800 Oak Grove Drive

M/S: 301-485B

Pasadena, CA 91109-8099

Telephone: +1 (818) 393-3353

Fax: +1 (818) 354-1075

EMail: Scott.Burleigh@jpl.nasa.gov

Manikantan Ramadas

ISRO Telemetry Tracking and Command Network (ISTRAC)

Indian Space Research Organization (ISRO)

Plot # 12 & 13, 3rd Main, 2nd Phase

Peenya Industrial Area

Bangalore 560097

India

Telephone: +91 80 2364 2602

EMail: mramadas@gmail.com

Stephen Farrell

Computer Science Department

Trinity College Dublin

Ireland

Telephone: +353-1-896-1761

EMail: stephen.farrell@cs.tcd.ie

Перевод на русский язык

Николай Малых

nmalykh@gmail.com

Полное заявление авторских прав

Copyright (C) The IETF Trust (2008).

К этому документу применимы права, лицензии и ограничения, указанные в BCP 78, и, за исключением указанного там, авторы сохраняют свои права.

Этот документ и содержащаяся в нем информация представлены «как есть» и автор, организация, которую он/она представляет или которая выступает спонсором (если таковой имеется), Internet Society и IETF отказываются от каких-либо гарантий (явных или подразумеваемых), включая (но не ограничиваясь) любые гарантии того, что использование представленной здесь информации не будет нарушать чьих-либо прав, и любые предполагаемые гарантии коммерческого использования или применимости для тех или иных задач.

Интеллектуальная собственность

IETF не принимает какой-либо позиции в отношении действительности или объема каких-либо прав интеллектуальной собственности (Intellectual Property Rights или IPR) или иных прав, которые, как может быть заявлено, относятся к реализации или использованию описанной в этом документе технологии, или степени, в которой любая лицензия, по которой права могут или не могут быть доступны, не заявляется также применение каких-либо усилий для определения таких прав. Сведения о процедурах IETF в отношении прав в документах RFC можно найти в BCP 78 и BCP 79.

Копии раскрытия IPR, предоставленные секретариату IETF, и любые гарантии доступности лицензий, а также результаты попыток получить общую лицензию или право на использование таких прав собственности разработчиками или пользователями этой спецификации, можно получить из сетевого репозитория IETF IPR по ссылке http://www.ietf.org/ipr.

IETF предлагает любой заинтересованной стороне обратить внимание на авторские права, патенты или использование патентов, а также иные права собственности, которые могут потребоваться для реализации этого стандарта. Информацию следует направлять в IETF по адресу ietf-ipr@ietf.org.


1Delay Tolerant Networking — устойчивая к задержкам сеть.

2Licklider Transmission Protocol — протокол ускоренной передачи.

3Interplanetary Internet.

4Deep Space Network — сеть глубокого космоса.

5Stream Control Transmission Protocol — протокол управления потоковой передачей.

6В оригинале используется термин chunk. Прим. перев.

7End of red-part — конец «красной» части.

8End of block — конец блока.

9Local data-link layer.

10Denial of Service — атака, нацеленная на отказ в обслуживании.

Рубрика: RFC | Комментарии к записи RFC 5325 Licklider Transmission Protocol — Motivation отключены

RFC 5348 TCP Friendly Rate Control (TFRC): Protocol Specification

Network Working Group                                       S. Floyd
Request for Comments: 5348                                      ICIR
Obsoletes: 3448                                           M. Handley
Updates: 4342                              University College London
                                                           J. Padhye
                                                           Microsoft
                                                           J. Widmer
                                                              DoCoMo
                                                      September 2008

 

Дружественный к TCP контроль скорости (TFRC) — спецификация протокола

TCP Friendly Rate Control (TFRC): Protocol Specification

PDF

Статус документа

В этом документе содержится проект стандартного протокола Internet для сообщества Internet и приглашение к дискуссии в целях развития и совершенствования протокола. Информацию о текущем состоянии стандартизации протокола можно найти в текущей версии документа Internet Official Protocol Standards (STD 1). Документ может распространяться без ограничений.

Аннотация

В этом документе приведена спецификация протокола TFRC1, который представляет собой механизм контроля насыщения для потоков с индивидуальной адресацией в среде Internet, обеспечивающей доставку по-возможности2. Этот механизм обеспечивает достаточно беспристрастное деление полосы с конкурирующими потоками TCP, но отличается значительно меньшими временными вариациями пропускной способности по сравнению с TCP, что делает этот механизм более подходящим для таких приложений, как телефония или потоковая передача, где важна постоянная скорость потока данных.

Данный документ отменяет действие RFC 3448 и является обновлением RFC 4342.

1. Введение

В этом документе содержится спецификация TFRC — механизма контроля насыщения, предназначенного для потоков с индивидуальной адресацией в среде Internet при одновременной передаче с трафиком TCP [FHPW00]. Вместо задания полного протокола в данном документе просто дается спецификация механизма контроля насыщения, который может использоваться в транспортных протоколах типа DCCP (Datagram Congestion Control Protocol) [RFC4340] для приложений, включающих сквозной контроль насыщения на прикладном уровне, или в контексте контроля насыщения на оконечных точках [BRS99]. В документе не рассматриваются форматы пакетов и вопросы надежности доставки. Связанные с реализацией механизма вопросы рассмотрены кратко в главе 8.

Механизм TFRC разработан для обеспечения разумной беспристрастности распределения полосы при конкуренции с потоками TCP. Разумная беспристрастность означает, что скорость передачи отличается от скорости потока TCP при таких же условиях не более, чем вдвое. Однако TFRC обеспечивает существенно меньшие временные вариации пропускной способности по сравнению с TCP, что делает этот механизм более подходящим для телефонии и потоковых приложений, где относительное постоянство скорости передачи играет важную роль.

Платой за более стабильную пропускную способность по сравнению с TCP в условиях конкуренции за полосу является более медленная реакция TFRC на изменение доступной полосы пропускания. Таким образом, TFRC следует использовать лишь в тех случаях, когда приложениям требуется стабильная пропускная способность и, в частности, предотвращение двухкратного снижения скорости передачи, принятого в TCP в ответ на отбрасывание одного пакета. Для приложений, которым просто нужно передать данные за возможно кратчайшее время, рекомендуется использовать TCP или, в тех случаях, когда надежность не требуется, механизм контроля насыщения AIMD3 с параметрами, близкими к тем, которые применяются в TCP.

Механизм TFRC разработан для приложений, которые используют пакеты фиксированного размера и меняют скорость передачи таких пакетов в ответ на возникновение перегрузок (насыщения). TFRC может также использоваться, возможно с менее оптимальной производительностью, в приложениях, не использующих фиксированный размер сегмента и меняющих его в соответствии с потребностями приложения (например, видео-приложения).

Для некоторых приложений (например, звуковых) требуется обеспечение фиксированного интервала времени между передачей последовательных пакетов и варьирование размера сегментов (вместо изменения скорости передачи пакетов) в ответ на возникновение перегрузки. Механизм контроля насыщения, предложенный в этом документе, для таких приложений не подходит, однако эту задачу решает механизм TFRC-PS4, являющийся вариантом TFRC для приложений с фиксированной частотой передачи и изменением размера пакетов при возникновении насыщения. Спецификация TFRC-PS содержится в [RFC4828].

Механизм TFRC основан на работе принимающей стороны с расчетом параметров контроля насыщения (частоты фактов потери пакетов) на стороне получателя, а не отправителя. Такой способ хорош для приложений, в которых отправителем является большой сервер, обслуживающий множество одновременных соединений, а получатели имеют достаточно памяти и процессорных ресурсов для выполнения требуемых расчетов. Кроме того, реализованный на приемной стороне механизм лучше подходит для контроля насыщения в системах с групповой адресацией. Однако возможна реализация TFRC на серверной стороне, как в профиле CCID-35 протокола DCCP [RFC4342].

Этот документ отменяет действие RFC 3448. В транспортном протоколе DCCP6 [RFC4340] профили CCID-3 [RFC4342] и CCID-4 [CCID-4] задают использование TFRC в соответствии с RFC 3448. Разработчикам CCID-3 и CCID-4 следует использовать этот документ взамен RFC 3448 для спецификации TFRC.

Нормативная часть спецификации TFRC приведена в главах 3 — 6. В главе 7 рассматриваются реализации механизма на серверах, в главе 8 — вопросы реализации механизма, а в главе 9 рассмотрены отличия от RFC 3448.

2. Терминология

Ключевые слова необходимо (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не следует (SHALL NOT), следует (SHOULD), не нужно (SHOULD NOT), рекомендуется (RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе интерпретируются в соответствии с [RFC2119].

В Приложении A приводится список использованных в документе технических терминов.

3. Механизм протокола

Для контроля насыщения TFRC напрямую использует уравнение пропускной способности для разрешенной скорости передачи, как функции от частоты фактов потери пакетов и времени кругового обхода. Для беспристрастной конкуренции с TCP, механизм TFRC использует принятое в TCP уравнение для пропускной способности, выражающее скорость передачи TCP, как функцию от частоты фактов потери пакетов, времени кругового обхода и размера сегментов. Определим факт потери, как случай утраты одного или более маркированного пакета из окна данных; маркированными считаются пакеты, помеченные явным индикатором насыщения ECN7 [RFC3168].

В общем виде механизм контроля насыщения TFRC можно описать следующим образом:

  • Получатель определяет частоту фактов потери пакетов и передает эту информацию отправителю.
  • Отправитель использует эти сообщения от получателя для определения времени кругового обхода (RTT8).
  • Значения частоты фактов потери и RTT передаются в уравнение пропускной способности TFRC и результирующая скорость передачи ограничена значением не более удвоенной скорости приема.
  • Отправитель подстраивает скорость передачи в соответствии с допустимой скоростью передачи X.

Динамика TFRC чувствительна к способам проведения измерений и применения результатов. В этом документе приводятся рекомендации по конкретному механизму. Возможно использование иных механизмов, но при этом следует понимать, как этот механизм будет воздействовать на динамику TFRC.

3.1. Уравнение для пропускной способности TCP

Любое реалистичное выражение пропускной способности TCP, как функции RTT и вероятности потери пакетов, следует рассматривать, как подходящее для использования с TFRC. Однако следует отметить, что используемое для пропускной способности TCP уравнение должно отражать поведение повторов передачи по тайм-ауту, поскольку это поведение доминирует при определении пропускной способности TCP в условиях высокой вероятности потерь. Отметим также, что допущения, принятые относительно вероятности потерь в уравнении для пропускной способности, зависят от реального механизма определения вероятности потерь. Хотя это допущение не вполне соответствует приведенному ниже уравнению для пропускной способности и описанным механизмам измерения, оно достаточно хорошо подходит на практике.

Уравнение пропускной способности, которое в настоящее время требуется использовать в TFRC, является слегка упрощенным вариантом уравнения для Reno TCP из работы [PFTK98]. В идеальном случае уравнение для пропускной способности следовало бы создавать на основе SACK9 TCP, однако тесты и эксперименты показывают, что различия между двумя уравнениями достаточно малы [FF99] (Приложение B).

Уравнение для средней скорости передачи TCP (в байтах в секунду) X_Bps имеет вид:

                               s
  X_Bps = ----------------------------------------------------------
          R*sqrt(2*b*p/3) + (t_RTO * (3*sqrt(3*b*p/8)*p*(1+32*p^2)))

где:

X_Bps — средняя скорость передачи TCP (байт/сек); параметр X_Bps идентичен X_calc в RFC 3448;

s — размер сегмента (байт) с учетом заголовков транспортного уровня и IP;

R — время кругового обхода в секундах;

p — вероятность потерь (0 — 1.0) — доля потерянных пакетов в от общего числа переданных пакетов;

t_RTO — тайм-аут повторной передачи TCP в секундах;

b — максимальное число пакетов, подтверждаемых одним пакетом TCP ACK.

Выбор значения тайм-аута повторной передачи TCP — t_RTO.

Реализациям следует использовать значение t_RTO = 4*R. Возможно использование более точного метода расчета t_RTO. Реализации могут также выбирать в качестве t_RTO значение max(4*R, 1 секунда) в соответствии с рекомендуемым для значения RTO минимумом [RFC2988].

Выбор параметра b для отложенных подтверждений.

Некоторые современные реализации TCP используют отложенные подтверждения, передавая один пакет подтверждения для каждой пары принятых пакетов данных. Однако TCP также позволяет передавать подтверждения для каждого принятого пакета данных. Для пересмотренных механизмов контроля насыщения TCP [RFC2581bis] в настоящее время задает алгоритм отложенных подтверждений, который следует использовать. Однако [RFC2581bis] рекомендует увеличивать размер окна насыщения при предотвращении перегрузки по одному сегменту за период RTT даже при использовании отложенных подтверждений, в соответствии с уравнением пропускной способности TCP для случая b = 1. На основе экспериментальных данных [RFC2581bis] позволяет увеличивать окно насыщения в процессе замедленного старта, что также соответствует уравнению пропускной способности TCP для случая b = 1. Таким образом, использование b = 1 согласуется с [RFC2581bis]. Рекомендуется устанавливать значение b = 1.

При t_RTO=4*R и b=1 уравнение для пропускной способности X_Bps (скорость передачи TCP в байтах за секунду) может быть упрощено до:

                                s
   X_Bps = -----------------------------------------------
           R * (sqrt(2*p/3) + 12*sqrt(3*p/8)*p*(1+32*p^2))

В будущем обновленные варианты этого документа могут использовать иные уравнения для TCP взамен приведенного здесь. Требование к таким уравнениям заключается в том, что они должны давать разумное приближение скорости передачи TCP для соответствия с механизмом контроля насыщения TCP.

Пропускную способность можно также выразить в X_pps (пакет/сек)

X_pps = X_Bps/s

Параметры s (размер сегмента), p (вероятность потерь) и R (RTT) должны измеряться или рассчитываться реализацией TFRC. Измерение s описано в параграфе 4.1, измерение R — в параграфе 4.3, а измерение p — в разделе 5. В оставшейся части документа скорости передачи данных измеряются байтами в секунду, если явно не указано иное.

3.2. Содержимое пакетов

Прежде, чем описывать функциональность отправителя и получателя, рассмотрим содержимое пакетов данных, передаваемых отправителем, и пакетов обратной связи, передаваемых получателем. Мы не будем задавать формат пакетов, поскольку TFRC будет использоваться с протоколом транспортного уровня, который и определяет этот формат.

3.2.1. Пакеты данных

Каждый пакет данных, передаваемый отправителем, содержит следующую информацию:

  • Порядковый номер. Этот номер должен увеличиваться на 1 с каждым переданным пакетом. Поле должно быть достаточно большим, чтобы в списке недавних пакетов получателя не появлялись разные пакеты с одинаковым порядковым номером.
  • Временная метка момента передачи. Будем обозначать ts_i временную метку пакета с порядковым номером i. Разрешение для временных меток в общем случае следует измерять в миллисекундах.Эти временные метки используются получателем для определения потерь пакетов, которые следует отнести к одному событию (факту потери). Метки получатель возвращает отправителю в качестве «эхо» для того, чтобы тот мог оценить время кругового обхода (это нужно для отправителей, не сохраняющих временных меток переданных пакетов).Отметим, что существует альтернативный вариант использования временных меток, когда значение метки инкрементируется каждую четверть периода кругового обхода; такие метки могут служить для отнесения потерь пакетов к одному факту потери в контексте протокола, где это понятно как отправителю, так и получателю, а отправитель сохраняет временные метки переданных пакетов.
  • Оценка времени кругового обхода отправителем. Оценка, передаваемая в пакете i обозначается R_i. Оценка времени кругового обхода используется получателем вместе с временными метками для определения множества потерь пакетов, относящихся к одному событию.Если отправитель передает передает грубые «временные метки», которые увеличиваются каждую четверть периода кругового обхода, как описано выше, такому отправителю не нужно передавать свою оценку времени кругового обхода.

3.2.2. Пакеты обратной связи

Каждый пакет обратной связи, передаваемый получателем данных, содержит следующую информацию:

  • Временная метка последнего принятого пакета (t_recvdata). Если последний принятый пакет имеет номер i, то t_recvdata = ts_i. Эта временная метка используется отправителем для оценки времени кругового обхода и требуется только в тех случаях, когда отправитель не сохраняет временные метки переданных пакетов данных.
  • Интервал времени между приемом последнего пакета и генерацией данного пакета обратной связи. Будем обозначать этот интервал t_delay.
  • Оценка получателем скорости приема данных в предыдущем периоде кругового обхода. Будем обозначать этот интервал X_recv.
  • Текущее значение вероятности потери по оценке получателя (p).

4. Протокол отправителя данных

Отправитель шлет получателю поток пакетов данных с определенной скоростью. При получении пакета обратной связи от получателя, отправитель данных меняет скорость передачи на основе информации, содержащейся в таком пакете. Если отправитель не получает пакетов обратной связи в течение четырех интервалов кругового обхода, он снижает скорость передачи вдвое. Для контроля времени используется таймер обратной связи10.

Для протокола на передающей стороне зададим следующие этапы:

  • измерение среднего размера передаваемого сегмента;
  • инициализация отправителя;
  • реакция отправителя на получение пакета обратной связи;
  • поведение отправителя по завершении отсчета таймера обратной связи;
  • предотвращение осцилляций (опционально);
  • планирование передачи пакетов и допустимых пиков.

4.1. Измерение размера сегмента

Отправитель TFRC использует размер сегмента s в уравнении пропускной способности, при установке максимальной скорости приема, минимальной и начальной скорости передачи, а также значения таймера обратной связи. Получатель TFRC может использовать средний размер сегмента s при инициализации истории потерь. Как указано в параграфе 6.3.1, если получатель TFRC не знает размера сегмента, используемого отправителем, он может использовать взамен при инициализации истории потерь среднее число принимаемых в секунду пакетов.

Размер сегмента s обычно известен приложению, но возможны два исключения:

  1. Размер сегментов меняется естественным образом в зависимости от данных. В этом случае, хотя размер сегментов меняется, его вариации не отражаются на скорости передачи. Отправитель TFRC может рассчитать размер сегмента или использовать максимальное значение размера сегмента s.
  2. Для контроля насыщения приложение может менять размер сегментов, а не скорость их передачи. Это обычная практика для аудио-приложений, в которых пакеты данных передаются с фиксированным интервалом, требуемым для представления каждого пакета. Для таких приложений требуется совершенно иной способ измерения параметров.

Для первого класса приложений, где размер сегментов меняется в зависимости от данных, отправителю следует оценить размер сегмента s, как среднее значение в течение четырех последних интервалов между фактами потери. При желании отправитель может оценивать среднее значение размера за более продолжительный период.

Второй класс приложений рассматривается отдельно в документе, посвященном TFRC-PS [RFC4828]. В оставшейся части этого раздела предполагается, что отправитель может оценить размер сегмента и контроль насыщения осуществляется за счет управления числом пакетов, передаваемых за секунду.

4.2. Инициализация отправителя

Начальные значения X (допустимая скорость передачи, в байт/сек) и tld11 (время последнего удвоения в процессе замедленного старта, в секундах) являются неопределенными, пока не будут установлены, как описано ниже. Если отправитель готов передавать данные, когда у него еще нет результатов измерения периода кругового обхода, в качестве X используется скорость s байт/с для сегмента размером s, для таймера обратной связи устанавливается значение 2 секунды, а для tld — 0 или -1 (если это подходит). При получении первого результата измерения времени кругового обхода (например, после первого пакета обратной связи, обмена SYN-пакетами на этапе организации соединения или из предшествующего соединения [RFC2140]), в качестве tld используется текущее значение времени кругового обхода, для X устанавливается значение initial_rate, определенное, как W_init/R для W_init в соответствии с [RFC3390]:

initial_rate = W_init/R
W_init = min(4*MSS, max(2*MSS, 4380))

При расчете W_init вместо максимального размера сегмента (MSS12) отправителю TFRC следует использовать максимальный размер сегмента, который используется в начальный период кругового обхода, если это значение известно отправителю TFRC в момент инициализации X.

При отклике на начальный пакет обратной связи эта процедура заменяет этап 4), описанный ниже в параграфе 4.3.

В Приложении B объясняются причины для установки начального значения таймера обратной связи TFRC 2 секунды, взамен значения 3 секунды, рекомендуемого для таймера повтора передачи TCP [RFC2988].

4.3. Поведение отправителя при получении пакета обратной связи

Отправитель знает текущее значение допустимой скорости передачи X и поддерживает оценку текущего времени кругового обхода R. Отправитель также поддерживает параметр X_recv_set, включающий несколько недавних значений X_recv (обычно два).

Инициализация. X_recv_set инициализируется одним значением Infinity13. Возможна инициализация X_recv_set взамен Infinity достаточно большим числом (например, наибольшим целым числом в системе).

При получении отправителем пакета обратной связи в момент t_now (текущее время в секундах) должны быть выполнены следующие операции.

  1. Расчет нового значения периода кругового обхода по формуле:
    R_sample = (t_now - t_recvdata) - t_delay

    Как было указано в параграфе 3.2.2, значение t_delay показывает время, затраченное на приемной стороне.

  2. Обновление оценки времени кругового обхода:
          If no feedback has been received before {
              R = R_sample;
          } Else {
              R = q*R + (1-q)*R_sample;
          }

    Точное значение постоянной q не имеет существенного значения для TFRC, но по умолчанию рекомендуется использовать значение 0,9.

  3. Обновление значения тайм-аута:
    RTO = max(4*R, 2*s/X)
  4. Обновление значения допустимой скорости передачи с использованием переменных t_mbi и recv_limit:t_mbi — максимальный интервал снижения скорости 64 секунды.recv_limit — предельное значение скорости передачи, рассчитанной из X_recv_set.Эта процедура также использует процедуры Maximize X_recv_set() и Update X_recv_set(), определенные ниже.Псевдокод процедуры обновления значения допустимой скорости имеет вид:
          If (если весь интервал, закрываемый пакетом обратной связи, характеризуется 
                ограниченной передаче данных) {
              If (пакет обратной связи говорит о новом факте потерь или росте частоты
                           потерь p) {
                  уменьшить вдвое элементы X_recv_set;
                  X_recv = 0.85 * X_recv;
                  Maximize X_recv_set();
                  recv_limit = max(X_recv_set);
              } Else {
                  Maximize X_recv_set();
                  recv_limit = 2 * max (X_recv_set);
              }
          } Else {                      // типичное поведение
              Update X_recv_set();
              recv_limit = 2 * max (X_recv_set);
          }
          If (p > 0) {          // фаза предотвращения перегрузки
              рассчитать X_Bps с использованием уравнения пропускной способности TCP
              X = max(min(X_Bps, recv_limit), s/t_mbi);
          } Else if (t_now - tld >= R) {
              // начальная процедура замедленного старта
              X = max(min(2*X, recv_limit), initial_rate);
              tld = t_now;
          }
  5. При использовании механизма подавления осцилляций рассчитывается мгновенная скорость передачи X_inst в соответствии с параграфом 4.5.
  6. Таймер обратной связи сбрасывается и устанавливается на RTO секунд.

Процедура максимизации X_recv_set сохраняет наибольший элемент X_recv_set и новое значение X_recv:

      Maximize X_recv_set():
          добавить X_recv к X_recv_set;
          удалить начальное значение Infinity из X_recv_set, если оно еще не удалено;
          установить текущее время в качестве временной метки наибольшего элемента;
          удалить все элементы, кроме наибольшего.

Процедура обновления X_recv_set сохраняет набор значений X_recv с временными метками из двух последних периодов кругового обхода.

      Update X_recv_set():
          добавить X_recv к X_recv_set;
          Удалить из X_recv_set значения, не относящиеся к двум последним периодам RTT.

Определение интервала ограниченной передачи данных.

Определим для сервера интервал ограниченной передачи данных, как любой промежуток времени, в течение которого сервер не передавал того количества данных, которое позволяет допустимая скорость. Вопрос идентификации «интервалов ограниченной передачи» рассматривается в параграфе при обсуждении вопросов реализации. Термин «интервал ограниченной передачи используется в первом условии «if» этапа 4), когда решается вопрос предотвращения снижения отправителем скорости передачи в результате приема сообщения обратной связи о скорости приема в период ограниченной передачи данных.

В качестве примера рассмотрим отправителя, который передает данный с максимально дозволенной скоростью, но при этом пакеты передаются не поодиночке, а парами. Такой отправитель часть времени работает в режиме ограниченной передачи, поскольку пакеты не отправляются сразу по мере готовности. Однако, в соответствии с приведенным выше определением, при рассмотрении интервала, в течение которого отправитель передал пару пакетов, этот интервал нельзя отнести к интервалу ограниченной передачи данных, поскольку отправитель ограничивает передачу только в течение части интервала.

Если пакет обратной связи говорит, что скорость X_recv равна 0 (т. е., первый пакет обратной связи), отправитель не рассматривает весь интервал, покрываемый этим пакетом, как интервал с ограниченной передачей данных.

X_recv_set и первый пакет обратной связи.

Поскольку X_recv_set инициализируется с одним элементом Infinity, для recv_limit устанавливается значение Infinity на два первых интервала кругового обхода в соединении. В результате скорость передачи не ограничивается скоростью приема в течение данного периода. Это позволяет избежать проблем, связанных с ограничением скорости передачи данных по значению X_recv из первого пакета обратной связи.

Интервал, покрываемый пакетом обратной связи.

Как отправитель может определить период, к которому относится пакет обратной связи? Этот вопрос более детально рассматривается в параграфе 8.2. В общем случае, получатель будет передавать один пакет обратной связи за период кругового обхода, поэтому обычно отправитель может определить точный период, покрываемый текущим пакетом обратной связи из предыдущего пакета такого типа. Однако в случаях потери предыдущего пакета обратной связи или при более ранней передаче такого пакета в результате обнаружения пакета с маркером ECN отправителю потребуется оценка интервала, покрываемого пакетом обратной связи. Как указано в параграфе 6.2, каждый переданный получателем пакет обратной связи покрывает период кругового обхода в R_m (оценка, поддерживаемая получателем) секунд до отправки пакета обратной связи.

Отклик на потери в период ограниченной передачи.

В TFRC после начальной процедуры замедленного старта отправитель всегда обновляет расчетное значение скорости передачи X_Bps (после того, как будет получен пакет обратной связи) и допустимая скорость передачи X всегда ограничена значением X_Bps. Однако в периоды ограниченной передачи, когда реальная скорость обычно ниже X_Bps, скорость передачи остается ограниченной значением recv_limit, получаемым из X_recv_set. Если отправитель ограничивает передачу данных (возможно с изменением скорости от одного периода кругового обхода к другому) и наблюдаются потери данных, мы уменьшаем значение элемента X_recv_set для снижения допустимой скорости передачи.

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

Начальная процедура замедленного старта.

Отметим, что p=0 говорит о том, что отправитель еще не знает о фактах потерь и находится в начальной фазе замедленного старта. В этой фазе отправитель может приблизительно удваивать скорость передачи в каждый период кругового обхода, пока не начнутся потери. Параметр initial_rate term в п. 4) определяет минимальную дозволенную скорость передачи в течение замедленного старта.

Отметим, что в тех случаях, когда отправитель ограничивает передачу во время замедленного старта или полоса соединения ограничена, отправитель может не иметь возможности удваивать скорость передачи в каждый период кругового обхода; скорость передачи ограничена большим из двух значений — удвоенная скорость приема в предыдущий период кругового обхода или initial_rate. Это напоминает поведение TCP, где скорость передачи ограничена скоростью входящих пакетов подтверждений, а также размером окна насыщения. Таким образом при замедленном старте TCP в более агрессивном случае, когда получатель подтверждает каждый пакет, скорость передачи TCP ограничена удвоенной скоростью приема пакетов подтверждения.

Минимальная дозволенная скорость передачи.

Параметр s/t_mbi при p > 0 обеспечивает отправителю возможность передачи по крайней мере одного пакета каждые 64 секунды.

4.4. Завершение отсчета таймера обратной связи

В этом параграфе описано поведение отправителя при завершении отсчета таймера обратной связи. Отсчет этого таймера может завершиться в результате продолжительного бездействия или по причине отбрасывания пакетов обратной связи в сети.

В этом параграфе используется переменная recover_rate. Если отправитель TFRC бездействует с момента запуска таймера обратной связи, допустимая скорость передачи не устанавливается ниже recover_rate. В этой спецификации для recover_rate устанавливается значение initial_rate (см. параграф 4.2). В будущих вариантах спецификации могут быть заданы другие значения recover_rate.

При завершении отсчета таймера обратной связи отправитель должен:

  1. Снизить дозволенную скорость передачи вдвое.Если в момент завершения отсчета таймера у отправителя имелось хотя бы одно измерение RTT, допустимая скорость передачи снижается путем изменения X_recv_set в соответствии с приведенным ниже псевдокодом (включая п. 2)). В общем случае скорость передачи ограничена значением не более двух X_recv. Изменение X_recv_set ограничивает скорость передачи, но позволяет отправителю выполнять процедуру замедленного старта с удвоением скорости передачи в каждый период RTT, если пакеты обратной связи не говорят о потерях.Если отправитель бездействовал с момента запуска таймера обратной связи и X_recv < recover_rate, дозволенная скорость передачи не снижается вдвое и X_recv_set не меняется. Это предотвращает снижение дозволенной скорости до значений меньше половины recover_rate в результате бездействия.В общем случае допустимая скорость передачи снижается вдвое в ответ на завершение отсчета таймера обратной связи. Детали приведенного ниже псевдокода зависят от состояния отправителя — процесс замедленного старта, предотвращение перегрузки с ограничением по X_recv или предотвращение перегрузки с ограничением на основе уравнения пропускной способности.
          X_recv = max (X_recv_set);
          If (у отправителя нет значения RTT, не было получено пакетов
              обратной связи и не наблюдалось бездействия с момента 
              запуска таймера обратной связи) {
              // У отправителя пока нет значений X_Bps и recover_rate.
              // Дозволенная скорость снижается вдвое.
              X = max(X/2, s/t_mbi);
          } Else if (((p>0 && X_recv < recover_rate) or (p==0 && X < 2 * recover_rate)) 
                 и отправитель бездействовал с момента запуска таймера обратной связи) {
              // Не снижать вдвое дозволенную скорость передачи.
              Ничего не делать
          } Else if (p==0) {
              // Еще нет значения X_Bps.
              // Снизить вдвое дозволенную скорость передачи.
              X = max(X/2, s/t_mbi);
          } Else if (X_Bps > 2*X_recv)) {
              // Значение 2*X_recv уже ограничивает скорость передачи.
              // Снизить вдвое дозволенную скорость передачи.
              Update_Limits(X_recv;)
          } Else {
              // Скорость передачи ограничена X_Bps, а не X_recv.
              // Снизить вдвое дозволенную скорость передачи.
              Update_Limits(X_Bps/2);
          }

    Значение s/t_mbi ограничивает снижение скорости (по крайней мере 1 пакет за 64 секунды).

    Процедура Update_Limits() использует переменную timer_limit для ограничения скорости передачи, рассчитанной по завершению отсчета таймера обратной связи, как показано ниже:

          Update_Limits(timer_limit):
              If (timer_limit < s/t_mbi)
                  timer_limit = s/t_mbi;
              Заменить содержимое X_recv_set одним элементом timer_limit/2;
              Пересчитать X в соответствии с п. 4) параграфа 4.3;
  2. Запустить таймер обратной связи на max(4*R, 2*s/X) секунд.

Если отправитель ограничивал передачу, но не простаивал с момента запуска таймера обратной связи, возможно завершение отсчета таймера в результате потери пакетов обратной связи в сети. В таких случаях таймер обратной связи является механизмом детектирования таких потерь, подобно таймеру повтора передачи в TCP.

Отметим, что при остановке передачи данных отправителем, получатель прекращает передачу пакетов обратной связи. При завершении отсчета таймера обратной связи у отправителя последний может использовать описанную выше процедуру для ограничения скорости передачи. Если отправитель возобновляет передачу, для ограничения скорости будет использоваться X_recv_set и процедура замедленного старта, пока скорость передачи не достигнет значения X_Bps.

Снижение отправителем TFRC скорости передачи по таймеру обратной связи похоже на уменьшение размера окна насыщения TCP по истечении каждых RTO периода бездействия для TCP с поддержкой Congestion Window Validation [RFC2861].

4.5. Предотвращение осцилляций

Для снижения осцилляций скорости и задержек в очередях в средах с низким уровнем статистического мультиплексирования при высокой нагрузке отправителю рекомендуется снизить скорость передачи данных при увеличении задержки в очереди (и, следовательно, RTT). Для реализации этого отправитель поддерживает оценку среднего значения RTT за достаточно большой период (R_sqmean) и меняет свою скорость передачи в зависимости от того, как квадратный корень из R_sample (недавнее значение RTT) отличается от среднего (R_sqmean). Среднее значение R_sqmean определяется следующим образом:

        Если ранее не было получено пакетов обратной связи
            R_sqmean = sqrt(R_sample);
        иначе
            R_sqmean = q2*R_sqmean + (1-q2)*sqrt(R_sample);

Таким образом, R_sqmean изменяется пропорционально квадратному корню измеренного значения RTT. Константу q2 следует устанавливать по аналогии с q; по умолчанию рекомендуется использовать значение q2=0,9.

При sqrt(R_sample) > R_sqmean текущее время кругового обхода превышает среднее значение, что говорит о возможном увеличении задержки в очереди. В таких случаях скорость передачи снижается для минимизации осцилляций задержки в очередях.

Отправитель получает базовое значение дозволенной скорости передачи X, как описано в п. 4) параграфа 4.3. После этого рассчитывается новое мгновенное значение скорости передачи:

      X_inst = X * R_sqmean/sqrt(R_sample);
      If (X_inst < s/t_mbi)
          X_inst = s/t_mbi;

Благодаря использованию квадратного корня в общем случае мгновенная скорость передачи X_inst незначительно отличается от дозволенной скорости X. Например, в некой экстремальной ситуации, когда текущее значение RTT (R_sample) вдвое превышает среднее значение, sqrt(R_sample) будет отличаться от R_sqmean приблизительно в 1, 44 раза и дозволенная скорость будет снижаться путем умножения на коэффициент приблизительно равный 0,7.

Отметим, что такое изменение поведения для предотвращения осцилляций требуется не во всех случаях, особенно в тех случаях, когда уровень статистического мультиплексирования в сети достаточно велик. Отметим также, что подавление осцилляций может вызывать проблемы для соединений, на которых время кругового обхода слабо связано с задержкой в очередях (например, в беспроводных средах при частых изменениях маршрутизации). Однако такую возможность следует реализовать поскольку она улучшает поведение TFRC в некоторых средах с низким уровнем статистического мультиплексирования. Работа этого механизма проиллюстрирована в параграфе 3.1.3 документа [FHPW00]. Если подавление осцилляций не поддерживается, реализации следует использовать очень малое значение весового коэффициента q при определении среднего времени кругового обхода.

4.6. Планирование передачи пакетов

Поскольку TFRC работает на основе скорости, а операционные системы обычно не способны точно планировать события, необходимо с осторожностью относиться к передаче данных, чтобы поддерживалось корректное среднее значение скорости, несмотря на грубое или нерегулярное планирование в операционной системе. Для поддержки корректного среднего значения скорости передачи отправитель TFRC может передавать некоторые пакеты раньше номинального времени.

В дополнение к этому планирование передачи пакетов управляет допустимыми пиками передачи после периодов бездействия и ограниченной передачи. Отправитель TFRC может накапливать «кредиты на передачу» за прошлые периоды бездействия; это позволяет отправителю TFRC передавать данные с пиковой скоростью после периодов бездействия или ограничения передачи. TCP, для сравнения, может передать в одном пике число пакетов, передаваемое за период кругового обхода, но не более того. Например, пиковое число пакетов может быть передано TCP при получении пакетов ACK, подтверждающих окно данных, или когда отправитель внезапно получает окно данных для передачи после задержки приблизительно на время кругового обхода.

Для ограничения пиков трафика реализация TFRC должна предотвращать выборы трафика произвольной величины. Предел допустимых пиков должен быть не больше числа пакетов, передаваемых за один период кругового обхода. Реализация TFRC может ограничивать пики значением меньше числа пакетов, передаваемых за период кругового обхода. Кроме того, реализация TFRC может использовать ограничение пиков по скорости в целях выравнивания потока трафика.

Например, реализация протокола может рассчитывать интервал между пакетами (t_ipi) следующим образом:

t_ipi = s/X_inst;

Пусть t_now показывает текущее время, а i является натуральным числом (i = 0, 1, …) и t_i показывает номинальное время передачи i-го пакета. Тогда номинальное время t_(i+1) можно рекурсивно определить следующим образом:

t_0 = t_now,
t_(i+1) = t_i + t_ipi.

Отправителя TFRC разрешается накапливать «кредиты на передачу» за неиспользованное для передачи время в течение последних T секунд отправителю разрешено передавать за неиспользованное номинальное время t_j в пока t_j < t_now — T для T, равного времени кругового обхода.

5. Расчет частоты потерь (p)

Точное и стабильное измерение частоты потерь имеет первоочередное значение для TFRC. Измерение частоты потери пакетов осуществляется на приемной стороне путем детектирования потери пакетов по порядковым номерам прибывающих пакетов или при получении маркированного пакета. Опишем этот процесс прежде, чем разбираться с остальной частью приемного протокола. Если получатель еще не обнаружил потери или маркировки пакетов, он не рассчитывает вероятность потерь и сообщает о нулевой частоте потерь.

5.1. Детектирование потерь и маркированных пакетов

TFRC предполагает, что в каждом пакете содержится порядковый номер и эти номера увеличиваются на 1 в каждом переданном пакете. Данная спецификация требует, чтобы при повторе передачи потерянного пакета использовался новый порядковый номер в соответствии с последовательностью нумерации. Если транспортный протокол требует при повторе передачи использовать исходный порядковый номер, разработчики транспортного протокола должны обеспечить механизм, позволяющий отличить задержанные пакеты от переданных повторно, и механизм детектирования потери пакетов при повторе передачи.

TFRC предполагает, что каждый пакет содержит порядковый номер и номера увеличиваются на единицу в каждом переданном пакете. Данная спецификация требует, чтобы при повторной передаче потерянных пакетов использовались новые порядковые номера, а не номера, с которыми потерянные пакеты были переданы изначально. Если используемый транспортный протокол требует повтора передачи с исходными порядковыми номерами, разработчики транспортного протокола должны обеспечить механизм, позволяющий отличить исходный пакет от переданного повторно.

Получатель поддерживает структуру данных, в которой хранится информация о полученных и пропущенных пакетах. В данной спецификации предполагается, что эта структура представляет собой список полученных пакетов и временных меток момента приема каждого такого пакета. На практике такая структура может использовать более компактное представление, выбранное разработчиками.

Получатель поддерживает структуру данных, в которой хранится информация о полученных и пропущенных пакетах. В данной спецификации предполагается, что эта структура представляет собой список полученных пакетов и временных меток момента приема каждого такого пакета. На практике такая структура может использовать более компактное представление, выбранное разработчиками.

Потеря пакета детектируется по факту прибытия по крайней мере NDUPACK пакетов с большими порядковыми номерами; для NDUPACK задано значение 3. Требование приема NDUPACK последующих пакетов совпадает с аналогичным требованием TCP и обеспечивает TFRC устойчивость к нарушению порядка доставки пакетов. В отличие от TCP, если пакет приходит позднее (после доставки NDUPACK следовавших за ним пакетов), информация об этом пакете может заполнить пробел в записях TFRC и получатель сможет пересчитать вероятность потерь. В будущих версиях TFRC значение NDUPACK для детектирования потери может быть заменено адаптивным значением, учитывающим реальное нарушение порядка доставки, но в данной спецификации механизм такого учета не рассматривается.

Для соединений, поддерживающих ECN, прибытие маркированных пакетов трактуется как факт насыщения без ожидания доставки последующих пакетов.

Если перед пакетами с маркерами ECN была возможна потеря пакетов14, детектированием факта насыщения считается потеря первого пакета. Например, если получатель принимает пакет с порядковым номером n-1, за которым следует немаркированный пакет с порядковым номером n+1, а затем маркированный пакет с порядковым номером n+2, тогда получатель обнаруживает насыщение по приему пакета n+2. Начало обнаруженного факта перегрузки связано с потерей пакета n. Рекомендации параграфа 5.2 позволяют определить принадлежность потерь и маркированных пакетов к одному или нескольким фактам потерь.

5.2. Преобразование истории потерь в факты потерь

TFRC требует устойчивости к нескольким последовательным потерям пакетов или приему маркированных пакетов, когда эти события относятся к одному факту потери. Это похоже на поведение протокола TCP, который (обычно) лишь однократно за период RTT уменьшает наполовину окно насыщения. Таким образом, получатель должен отобразить историю потери пакетов в запись о факте потери, трактуя как факт потери утрату одного или более пакетов или прием маркированных одного или более пакетов в течение периода RTT. Для выполнения такого отображения получателю нужно знать значение RTT, которое обычно периодически сообщается отправителем в форме управляющей информации, присоединяемой в конце пакета данных. Для TFRC способ передачи результатов измерения RTT получателю не имеет значения, однако рекомендуется использовать для этого рассчитанное отправителем значение RTT (R в параграфе 4.3).

Для того, чтобы определить, относится потеря или маркированный пакет к новому факту потери или является продолжением существующего, нужно сравнить порядковые номера и временные метки пакетов, принятых получателем. Для маркированного пакета S_new время приема T_new можно определить напрямую. Для потерянного пакета нужно использовать интерполяцию, чтобы определить номинальное «время прибытия». Предположим, что:

S_loss — порядковый номер потерянного пакета;

S_before — порядковый номер последнего пакета, прибывшего с номером меньше S_loss прежде любого пакета с номером, превышающим S_loss;

S_after — порядковый номер первого пакета, прибывшего с после пакета S_before, с порядковым номером больше S_loss;

S_max — наибольший порядковый номер.

Следовательно, S_before < S_loss < S_after <= S_max.

T_loss — номинальное время, когда должен был прибыть потерянный пакет;

T_before — время приема пакета S_before;

T_after — время прибытия пакета S_after.

Отметим, что T_before < T_after.

Для потерянного пакета S_loss можно интерполировать номинальное «время прибытия» на основе времени прибытия пакетов S_before и S_after:

T_loss = T_before + ((T_after — T_before) * (S_loss - S_before)/(S_after - S_before))

Для случая перехода порядковых номеров через максимальное значение (0), предположим, что S_MAX = 2b, где b — размер принятого в реализации поля порядковых номеров в битах. В этом случае мы можем интерполировать время прибытия T_loss следующим образом:

T_loss = T_before + (T_after — T_before) * Dist(S_loss, S_before)/Dist(S_after, S_before)

где

Dist(S_A, S_B) = (S_A + S_MAX - S_B) % S_MAX

Если было определено, что потеря пакета S_old явилась началом предыдущего факта потери и мы детектировали потерю пакета S_new, можно интерполировать номинальное время прибытия пакетов S_old и S_new (T_old и T_new, соответственно).

Если T_old + R >= T_new, потеря пакета S_new относится к текущему факту потерь. В противном случае S_new относится к новому факту потери.

5.3. Размер интервала без потерь

После детектирования первого факта потери, получатель делит пространство порядковых номеров на интервалы без потерь. Если интервал без потерь A определен, как начинающийся с пакета S_A, а следующий интервал B начинается с пакета S_B, тогда к интервалу A относятся (S_B — S_A) пакетов. Таким образом, интервал A включает все пакеты, переданные отправителем с момента отправки первого пакета интервала A до первого пакета интервала B (не включая этот пакет).

Текущий интервал I_0 определяется как интервал без потерь, включающий последний факт потерь. Если интервал без потерь начинается с пакета S_A, а S_C является максимальным номером пакета в этом интервале, размер I_0 составляет S_C — S_A + 1. Например, если текущий интервал состоит из одного пакета с маркером ECN, то S_A == S_C и размер интервала без потерь равен одному пакету.

5.4. Средний интервал без потерь

Для расчета частоты потерь p сначала вычислим продолжительность среднего интервала без потерь. Это осуществляется с помощью взвешенного фильтра, определяющего средний интервал на основе значений n последних интервалов так, чтобы значение частоты потерь изменялось достаточно непрерывно. Если получатель еще не имеет данных о потерях или маркированных пакетах, средний интервал без потерь не рассчитывается.

Веса w_0 — w_(n-1) определяются следующим образом:

        If (i < n/2) {
            w_i = 1;
        } Else {
            w_i = 2 * (n-i)/(n+2);
        }

Таким образом, для n=8 значения w_0 — w_7 составляют:

1.0, 1.0, 1.0, 1.0, 0.8, 0.6, 0.4, 0.2

Значение n для числа интервалов без потерь, используемых при расчете частоты потерь, определяет скорость отклика TFRC на изменение уровня насыщения. Рекомендуется использовать в качестве значения этого параметра 8. TFRC не следует использовать значения n > 8 для трафика, который может конкурировать в глобальной сети Internet с трафиком TCP. В крайнем случае при использовании значений n > 8 для обеспечения безопасной работы потребуется незначительное изменение механизмов TFRC для обеспечения более резкого отклика на два и более периода RTT с высоким уровнем потерь.

При расчете среднего интервала без потерь требуется решить вопрос о включении последнего интервала. Предлагается включать его только в тех случаях, когда он существенно увеличивает значение среднего интервала.

Пусть I_0 — I_n обозначают интервалы без потерь и I_0 относится к текущему факту потерь. Если имеется по крайней мере n интервалов без потерь, установим k = n, в остальных случаях в качестве значения k будем использовать максимальный номер имеющегося интервала без потерь. Тогда средний интервал рассчитывается следующим образом:

      I_tot0 = 0;
      I_tot1 = 0;
      W_tot = 0;
      for (i = 0 to k-1) {
          I_tot0 = I_tot0 + (I_i * w_i);
          W_tot = W_tot + w_i;
      }
      for (i = 1 to k) {
          I_tot1 = I_tot1 + (I_i * w_(i-1));
      }
      I_tot = max(I_tot0, I_tot1);
      I_mean = I_tot/W_tot;

Частота (вероятность) потерь p составит:

p = 1/I_mean;

5.5. Дисконтирование истории

Как было показано в параграфе 5.4, при расчете среднего значения по n интервалам без потерь последний интервал дает 1/(0.75*n) часть общего веса, независимо от продолжительности этого интервала. В этом параграфе описан дополнительный механизм «дисконтирования истории»15, рассмотренный в работах [FHPW00a] и [W00], который позволяет приемному узлу TFRC подбирать весовые параметры, придавая больший вес последнему интервалу без потерь, когда этот интервал более чем вдвое превышает рассчитанное значение среднего интервала.

Для дисконтирования истории свяжем коэффициент DF_i (число с плавающей запятой) с каждым интервалом L_i (для i > 0). Общая история дисконтирования для каждого интервала без потерь будет храниться в массиве коэффициентов. В начальный момент значения элементов массива DF_i устанавливаются в 1:

for (i = 0 to n) {
   DF_i = 1;
}

Дисконтирование истории также использует общий коэффициент DF (число с плавающей запятой), который также имеет начальное значение 1. Сначала посмотрим, как коэффициенты используются при расчете среднего интервала без потерь, а затем опишем изменение коэффициентов с течением времени.

Как описано в параграфе 5.4, средний интервал без потерь вычисляется с использованием n значений предыдущих интервалов I_1, …, I_n и значения I_0 для текущего интервала без потерь. Расчет среднего интервала с использованием коэффициентов дисконтирования незначительно отличается от процедуры, описанной в параграфе 5.4:

      I_tot0 = I_0 * w_0;
      I_tot1 = 0;
      W_tot0 = w_0;
      W_tot1 = 0;
      for (i = 1 to n-1) {
          I_tot0 = I_tot0 + (I_i * w_i * DF_i * DF);
          W_tot0 = W_tot0 + w_i * DF_i * DF;
      }
      for (i = 1 to n) {
          I_tot1 = I_tot1 + (I_i * w_(i-1) * DF_i);
          W_tot1 = W_tot1 + w_(i-1) * DF_i;
      }
      p = min(W_tot0/I_tot0, W_tot1/I_tot1);

Значение общего коэффициента DF обновляется по прибытии каждого пакета в соответствии с приведенным ниже описанием. Сначала получатель определяет средневзвешенное значение I_mean для интервалов без потерь I_1, …, I_n:

      I_tot = 0;
      W_tot = 0;
      for (i = 1 to n) {
          W_tot = W_tot + w_(i-1) * DF_i;
          I_tot = I_tot + (I_i * w_(i-1) * DF_i);
      }
      I_mean = I_tot / W_tot;

Значение I_mean сравнивается с размером текущего интервала без потерь I_0. Если I_0 превышает I_mean более, чем вдвое, это говорит о том, что новый интервал без потерь существенно превышает старые значения и значение общего коэффициента DF изменяется для снижения относительного веса более старых интервалов:

      if (I_0 > 2 * I_mean) {
          DF = 2 * I_mean/I_0;
          if (DF < THRESHOLD) {
              DF = THRESHOLD;
          }
      } else {
          DF = 1;
      }

Отличное от 0 значение порога THRESHOLD обеспечивает гарантию того, что информация о более ранних интервалах в периоды высокого насыщения не будет полностью обесценена. Рекомендуется устанавливать THRESHOLD = 0,25. Отметим, что прибытие каждого нового пакета ведет к дополнительному росту I_0 и коэффициент DF будет обновляться.

При новом факте потерь текущий интервал переходит из I_0 в I_1, интервал I_i — в I_(i+1), а интервал I_n отбрасывается. Предыдущий коэффициент DF включается в массив коэффициентов дисконтирования. Поскольку DF_i показывает коэффициент, связанный с интервалом I_i, значения DF_i в массиве также смещаются при новом факте потерь. Процедура сдвига имеет вид:

      for (i = 1 to n) {
          DF_i = DF * DF_i;
      }
      for (i = n-1 to 0 step -1) {
          DF_(i+1) = DF_i;
      }
      I_0 = 1;
      DF_0 = 1;
      DF = 1;

На этом описание дополнительного механизма дисконтирования истории заканчивается. Подчеркнем что этот механизм является опциональным и позволяет TFRC более быстро реагировать на стремительное прекращение перегрузок, демонстрируемое ростом интервала без потерь.

6. Протокол получателя данных

Получатель периодически направляет отправителю сообщения обратной связи. Пакеты обратной связи в обычных условиях следует передавать по крайней мере по одному за период RTT, если отправитель не передает менее 1 сообщения за период RTT (в последнем случае пакеты обратной связи следует передавать в ответ на каждый принятый пакет). Пакеты обратной связи следует также передавать при новых фактах потерь без ожидания завершения цикла RTT и при получении пакетов с нарушением порядка доставки, когда это ведет к удалению факта потерь из истории.

Если отправитель передает пакеты с высокой скоростью (много пакетов за период RTT), передача пакетов обратной связи несколько раз в течение RTT может обеспечивать преимущества, поскольку позволит быстрее реагировать на изменение результатов измерения RTT и повысит устойчивость к потере пакетов обратной связи. Однако эти преимущества с ростом числа пакетов обратной связи за период RTT растут достаточно медленно.

Если получатель передал k пакетов обратной связи за период RTT, для k>1 п. 4) параграфа 6.2 изменяется с установкой для таймера обратной связи значения R_m/k секунд. Однако каждый пакет обратной связи уведомляет пакета о скорости приема а течение последнего периода RTT, а не части этого периода. В этом документе не задаются изменения, которые могут потребоваться для передачи получателем множества пакетов обратной связи за период RTT. Отметим, что передача множества пакетов обратной связи за время RTT дает незначительные преимущества.

6.1. Поведение получателя при поступлении пакета данных

При получении пакета данных приемный узел выполняет ряд действий:

  1. Добавление пакета в историю принятых пакетов.
  2. Если новый пакет ведет к обнаружению нового факта потерь или не было передано пакета обратной связи на момент завершения отсчета таймера обратной связи, выполняется п. 3. В остальных случаях дополнительных действий не предпринимается (за исключением оптимизации, описанной в следующем параграфе).Для дополнительной оптимизации может выполняться проверка заполнения полученным пакетом пропуска в порядковых номерах (истории) и связанное с этим объединение интервалов без потерь. Если пакет заполняет пропуск, получатель может незамедлительно передать пакет обратной связи. Эффект от такой оптимизации в нормальных условиях предполагается незначительным.
  3. Расчет p. Предыдущее значение p рассматривается, как p_prev. Рассчитывается новое значение в соответствии с разделом 5.
  4. Завершение отсчета таймера обратной связи. Если p > p_prev, отсчет таймера считается завершенным и выполняются действия, описанные в параграфе 6.2.Если p <= p_prev и к моменту последнего завершения отсчета таймера обратной связи пакет обратной связи не был передан, выполняются действия, описанные в параграфе 6.2. Если же пакет обратной связи к этому моменту был передан, никаких дополнительных действий не требуется.

6.2. Завершение отсчета таймера обратной связи

При завершении отсчета таймера обратной связи на принимающей стороне должны выполняться определенные действия в зависимости от наличия или отсутствия пакетов, принятых с момента отправки последнего сообщения обратной связи.

Для m-го завершения отсчета таймера обратной связи предположим, что на приемной стороне максимальный номер полученного пакета имеет значение S_m, а включенный в этот пакет результат измерения RTT имеет значение R_m. Как описано в параграфе 3.2.1, R_m представляет собой наиболее свежую оценку отправителем периода кругового обхода, переданную в пакетах данных. Если с момента отправки предыдущего сообщения обратной связи были получены пакеты данных, получатель выполняет следующие операции:

  1. Расчет средней частоты потерь с использованием алгоритма, описанного в разделе 5.
  2. Расчет значения скорости приема X_recv на основе пакетов, полученных за предыдущие R_(m-1) секунд. Это выполняется в тех случаях, когда отсчет таймера обратной связи завершается естественным путем или констатируется в результате новой потери или приема маркированного пакета, как описано в п. 3) параграфа 6.1.В типичной ситуации, когда получатель передает только один пакет обратной связи за период кругового обхода и отсчет таймера обратной связи не завершается раньше времени в результате новой потери, время с момента предыдущего завершения отсчета таймера обратной связи будет составлять R_(m-1) секунд.Отметим, что при завершении отсчета таймера обратной связи в результате потери или приема маркированного пакета, время, прошедшее с момента предыдущего завершения отсчета, будет явно меньше R_(m-1) секунд.Для упрощения реализации в тех случаях, когда время с момента предыдущего завершения отсчета таймера обратной связи отлично от R_(m-1) секунд, скорость приема может рассчитываться за более продолжительный интервал вплоть до момента завершения отсчета таймера обратной связи, которое произошло не менее R_(m-1) секунд назад.
  3. Подготовка и передача сообщения обратной связи с информацией, описанной в параграфе 3.2.2.
  4. Сброс и повторный запуск таймера обратной связи на время R_m секунд.

Отметим, что приведенное выше правило 2) дает минимальное значение измеренной скорости приема X_recv, равное 1 пакету за период кругового обхода. Если отправитель ограничивает скорость передачи данных до значений меньше 1 пакета за RTT, это будет обусловлено потерей пакетов, а не ограничениями, вносимыми измеренным значением скорости приема.

Если с момента передачи последнего пакета обратной связи не было принято ни одного пакета, новый пакет обратной связи не передается и таймер обратной связи перезапускается на время R_m секунд.

6.3. Инициализация получателя

Получатель инициализируется первым принятым пакетом данных. Предположим, что этот пакет имеет порядковый номер i.

В момент получения первого пакета:

  • устанавливается p = 0;
  • устанавливается X_recv = 0;
  • подготавливается и передается пакет обратной связи;
  • таймер обратной связи запускается на время R_i секунд.

Если первый пакет данных не содержит оценки периода кругового обхода R_i, получатель передает пакет обратной связи для каждого принимаемого пакета, пока не будет получен пакет данных с оценкой времени кругового обхода.

Если отправитель использует грубые временные метки, которые инкрементируются каждую четверть периода кругового обхода, таймер обратной связи не требуется и для определения момента передачи пакета обратной связи используется приведенная ниже процедура из RFC 4342.

  • Всякий раз при передаче пакета обратной связи получатель устанавливает для переменной last_counter наибольшее значение счетчика окон с момента последней передачи сообщения обратной связи, если с этого момента были получены какие-либо пакеты данных.
  • Если получатель принимает пакет данных со значением счетчика окон, равным значению last_counter + 4 или превышающим его, получатель передает новый пакет обратной связи (отношения «больше или равно» определяются в циклическом пространстве счетчика окон).

6.3.1. Инициализация истории потерь после первого факта потери

В этом параграфе рассматриваются процедуры, которые должны использоваться для инициализации истории потерь после первого факта потерь.

Число пакетов, принятых до первого факта потери, не может напрямую использоваться для расчета допустимой скорости передачи, поскольку в течение этого периода скорость передачи меняется достаточно быстро. TFRC предполагает, что корректная скорость передачи данных после первой потери равна половине скорости передачи перед потерей. TFRC аппроксимирует эту скорость X_target по максимальному значению X_recv (в течение процедуры замедленного старта для отдельного периода кругового обхода скорость передачи данных отправителем в общем случае равна удвоенной скорости приема данных получателем за предыдущий период кругового обхода).

После первой потери вместо инициализации первого интервала без потерь числом пакетов, принятых до первой потери, получатель TFRC рассчитывает интервал без потерь, который нужен для получения скорости X_target, и использует этот искусственный интервал без потерь для запуска механизма истории потерь.

TFRC рассчитывает первый интервал без потерь, находя значение p, для которого уравнение пропускной способности в параграфе 3.1 дает скорость передачи отличающуюся от X_target не более, чем на 5%, для данного времени кругового обхода R — для первого интервала без потерь устанавливается значение 1/p. Если получатель знает размер сегмента s, используемый отправителем, он может использовать уравнение пропускной способности, в противном случае получатель может измерить скорость приема в пакетах за секунду вместо байт/сек и использовать уравнение пропускной способности для X_pps (допуск 5% обусловлен тем, что уравнение пропускной способности трудно обратить и без такого допуска пришлось бы использовать ресурсоемкие численные методы расчета p).

Специальным случаем инициализации первого интервала без потерь является ситуация, когда первый пакет теряется или приходит с маркером насыщения. При потере первого пакета в TCP отправитель повторяет передачу этого пакета по завершении отсчета таймера повторной передачи. Если первый пакет TCP имеет маркер ECN, отправитель сбрасывает и заново запускает таймер повтора передачи и отправляет новый пакет данных только после того, когда будет завершен отсчет запущенного заново таймера [RFC3168] (параграф 6.1.2). Для TFRC, если первый пакет потерян или имеет маркер ECN, первый интервал без потерь не содержит пакетов данных. В этом случае размер этого (пустого) интервала следует устанавливать так, чтобы скорость передачи задавалась как в TCP (см. ниже).

Когда первый интервал без потерь в TFRC пуст (первый пакет потерян или имеет маркер ECN), для обеспечения аналогии с поведением TCP, TFRC желает установить допустимую скорость передачи в 1 пакет за каждые 2 периода кругового обхода (или 0,5 на RTT). Таким образом, получатель TFRC рассчитывает интервал без потерь так, чтобы он обеспечивал значение X_target = 0,5/R пакетов в секунду для периода кругового обхода R и использовал это расчетное значение для первого интервала без потерь. Получатель TFRC использует значение 0,5/R пакетов в секунду в качестве минимального значения X_target при инициализации первого интервала без потерь.

Отметим, что несмотря на использование получателем TFRC искусственного значения интервала без потерь после первой потери, получатель продолжает сообщать о скорости передачи X_recv, как указано в параграфе 6.2.

7. Серверные варианты

В серверных вариантах TFRC получатель использует транспорт с гарантированной доставкой для передачи информации о потере пакетов отправителю, а отправитель рассчитывает частоту потерь и допустимую скорость передачи.

Основным преимуществом серверной реализации TFRC является то, что отправитель не должен доверять расчетам частоты потерь на стороне получателя. Однако требование гарантированной доставки информации о потерях от получателя к отправителю вносит существенные ограничения в процесс выбора транспортного протокола для поддержки серверных вариантов TFRC.

Вариант TFRC, реализованный на приемной стороне в соответствии с данной спецификацией, напротив, не требует гарантированной доставки пакетов обратной связи. Этот вариант также лучше подходит для таких приложений, как потоковые службы на web-серверах, для которых желателен максимальный перенос нагрузки с серверной стороны на клиентскую.

Документы RFC 4340 и RFC 4342 совместно задают спецификацию механизма DCCP CCID 3, который может применяться в серверных вариантах TFRC. В CCID 3 каждый пакет обратной связи от получателя содержит опцию Loss Intervals, показывающую размеры последних интервалов без потерь. Пакеты обратной связи могут также включать опцию Ack Vector, позволяющую отправителю точно определить, какие пакеты были отброшены или маркированы и проверить информацию из опций Loss Intervals. Опция Ack Vector может также включать маркеры ECN Nonce Echo, позволяющие отправителю проверить данные получателя о принятых пакетах данных без маркеров. Опция Ack Vector также позволяет отправителю самому увидеть, какие пакеты данных были потеряны или маркированы ECN для детектирования интервалов без потерь и расчета частоты потерь. Раздел 9 документа RFC 4342 включает обсуждение вопросов проверки информации, принятой от получателя.

8. Вопросы реализации

В этом документе приведена спецификация механизма контроля насыщения TFRC для использования прикладными и транспортными протоколами. В этом разделе кратко рассматриваются некоторые вопросы реализации механизма.

8.1. Расчет пропускной способности

Для t_RTO = 4*R и b = 1 уравнение пропускной способности из параграфа 3.1 можно представить в форме:

                  s
      X_Bps =  --------
               R * f(p)

где

f(p) = sqrt(2*p/3) + (12*sqrt(3*p/8) * p * (1+32*p^2))

Значения функции f(p) могут сохраняться в специальной таблице.

Многие операции умножения (например, q и 1-q для расчета среднего времени кругового обхода, умножение на 4 для тайм-аута) могут быть реализованы с помощью операций сдвига регистра.

8.2. Поведение отправителя при получении пакета обратной связи

В этом параграфе рассматриваются вопросы реализации, связанные поведением отправителя при получении пакетов обратной связи, как описано в параграфе 4.3.

8.2.1. Детектирование интервалов с ограниченной передачей данных

При получении пакета обратной связи отправитель проверяет, относится ли покрываемый пакетом интервал к периоду ограниченной передачи данных. В этом параграфе рассматривается один из возможных вариантов реализации этого.

Если все пакеты обратной связи содержат временную метку последнего принятого пакета, предположим, что t_new — это временная метка из данного пакета обратной связи. Поскольку все пакеты обратной связи покрывают интервал по крайней мере в один период кругового обхода, отправителю достаточно этой метки для того, чтобы определить наличие в интервале (t_old, t_new] времени с ограниченной передачей данных; если оценка времени кругового обхода отправителем составляет R, то в качестве t_old используется значение t_new — R (это оценка покрываемого пакетом обратной связи интервала, а не его точное определение, однако точность такой оценки вполне достаточна).

Ниже приведен псевдокод для проверки ограничения передачи данных в течение всего интервала, покрываемого пакетом обратной связи. Переменные NotLimited1 и NotLimited2 представляют время, когда отправитель не ограничивал передачу данных.

Инициализация

NotLimited1 = NotLimited2 = t_new = t_next = 0;
t_now = текущее время;

После передачи сегмента

       If (отправитель передал все, что ему было дозволено) {
           // отправитель не ограничивал передачу данных в этом интервале
           If NotLimited1 <= t_new
               // цель: NotLimited1 > t_new.
               NotLimited1 = t_now
           Else if (NotLimited2 <= t_next)
               // цель: NotLimited2 > t_next.
               NotLimited2 = t_now;
       }

При получении пакета обратной связи, если в этом интервале передача данных ограничена

       t_new = временная метка из пакета обратной связи
       t_old = t_new - R                         // локальная переменная
       t_next = t_now;
       If ((t_old < NotLimited1 <= t_new) or (t_old < NotLimited2 <= t_new))
           отправитель не ограничивал передачу данных в этом интервале;
       Else
           отправитель ограничивал передачу данных в этом интервале.
       If (NotLimited1 <= t_new && NotLimited2 > t_new)
           NotLimited1 = NotLimited2;

Времена передачи указывают на отправку сегмента или сегментов нижележащему уровню.

В промежутке между пакетами обратной связи (t_old, t_new] дает интервал передачи по оценке покрываемый последним пакетом обратной связи, а t_next показывает время последнего периода кругового обхода после t_new. Предполагается, что следующий пакет обратной связи будет покрывать интервал (t_new, t_next], если получатель не передаст пакет обратной связи раньше в ответ на новый факт потери. Целью является сохранение в переменной NotLimited1 времени передачи без ограничений в интервале (t_new, t_next], если таковая происходила, а в переменной NotLimited2 — времени неограниченной передачи после t_next.

Если при получении пакета обратной связи одно из значений NotLimited1, NotLimited2 попадает в интервал, покрываемый данным пакетом, этот интервал считается интервалом передачи без ограничений (т. е., отправитель передавал данные без ограничения по крайней мере один раз в течение данного интервала). Если ни одно из значений NotLimited1, NotLimited2 не относится к интервалу, покрываемому пакетом обратной связи, предполагается, что отправитель ограничивал передачу данных в течение всего интервала.

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

Рассмотренное ограничение вполне приемлемо. Для повышения точности идентификации наличия ограничений на передачу в период, покрываемый пакетом обратной связи отправитель может сохранять больше значений NotLimited.

В некоторых реализациях TFRC отправитель передает временные метки с грубым разрешением, которые увеличиваются каждую четверть периода кругового обхода, и пакеты обратной связи сообщают наибольший порядковый номер принятого пакета вместо временной метки последнего полученного пакета. В таких случаях отправитель может поддерживать состояние для каждого пакета, чтобы определить время t_new, когда был передан подтверждаемый пакет, или оценить t_new по оценке периода кругового обхода и прошедшему времени t_delay из пакета обратной связи.

8.2.2. Поддержка X_recv_set

Для упрощения поддержки X_recv_set достаточно ограничить размер массива X_recv_set тремя элементами (N=3). В этом случае процедура Update X_recv_set() будет иметь вид:

      Update X_recv_set():
          Добавить X_recv к X_recv_set;
          Удалить из X_recv_set значения с возрастом более 2 периодов кругового обхода;
          Сохранить только N последних значений.

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

8.3. Передача пакетов раньше номинального времени

В этом параграфе рассматривается один из механизмов планирования передачи пакетов на стороне отправителя для операционных систем с грубой гранулярностью отсчета времени (параграф 4.6).

Пусть t_gran задает гранулярность таймера планирования в операционной системе, а t_ipi — интервал между передачей пакетов (как указано в параграфе 4.6). Если операционная система не обеспечивает нужной гранулярности таймеров или по иным причинам не может поддерживать короткие интервалы t_ipi, отправитель TFRC будет ограничен возможностью передачи не более 1 пакета за каждые t_gran секунд или ему должна быть разрешена передача множества пакетов сразу в форме коротких пиков. В дополнение к разрешению отправителю накапливать кредиты на передачу пакетов за прошлые неиспользованные периоды, полезным может оказаться разрешение отправителю передавать пакет раньше запланированного времени, как описано ниже в этом параграфе.

Параметр t_delta может использоваться для того, чтобы разрешить передачу пакетов раньше номинального времени. Рассмотрим приложение, которое переходит в режим бездействия и запрашивает следующую передачу в момент t_i = t_(i-1) + t_ipi, где t_(i-1) показывает время передачи предыдущего пакета. Когда приложение снова активизируется, оно проверяет значение текущего времени t_now. Если t_now > t_i — t_delta, пакет передается. Когда рассчитывается номинальное время передачи следующего пакета t_i, может оказаться, что t_now > t_i — t_delta. В таких случаях пакет передается незамедлительно.

Для того, чтобы раньше номинального времени передавалось не более одного пакета и пакеты никогда не передавались ранее, чем за период кругового обхода до номинального времени передачи, параметр t_delta следует выбирать, как показано ниже:

t_delta = min(t_ipi, t_gran, rtt)/2;

(гранулярность планирования t_gran в некоторых старых системах Unix составляет 10 мсек.).

В качестве примера рассмотрим поток TFRC с допустимой скоростью передачи X = 10 пакетов за период кругового обхода (PPR), временем кругового обхода 100 мсек, гранулярностью планирования операционной системы t_gran = 10 мсек и возможностью аккумулирования неиспользованных кредитов на передачу в течение периода кругового обхода. В этом случае t_ipi будет иметь значение 1 мсек. Отправителю TFRC будет разрешено передавать пакеты за 0,5 мсек до номинального времени и сохранять неиспользованные кредиты на передачу в течение 100 мсек. Гранулярность планирования в 10 мсек не будет оказывать существенного влияния на работу соединения.

В качестве другого примера рассмотрим поток TFRC с гранулярностью планирования хуже периода кругового обхода — пусть время кругового обхода составляет 0,1 мсек, а гранулярность планирования в операционной системе — 1 мсек и обеспечивается возможность накопления кредитов на передачу в течение периода кругового обхода. Отправителю TFRC будет дозволено сохранять неиспользованные кредиты на передачу в течение 0,1 мсек. Если гранулярность планирования «не оказывает» влияния на отклики отправителя на получение пакетов обратной связи, отправитель TFRC сможет передать RTT пакетов (в соответствии с разрешенной скоростью) за каждый период RTT в ответ на принятый пакет обратной связи. В этом случае грубая гранулярность планирования не позволит существенно снизить скорость передачи, но передача может носить пиковый характер с передачей данных в течение периода кругового обхода в ответ на каждый пакет обратной связи.

Однако в этом случае производительность будет отличаться, если гранулярность планирования операционной системы будет влиять на время отклика на получение пакетов обратной связи, наряду с влиянием на обычное планирование передачи. В этом случае производительность отправителя будет существенно ограничена гранулярностью планирования, превышающей период кругового обхода, — при возможности отправителя передавать RTT данных с дозволенной скоростью передачи не более 1 пакета за каждую мсек. Такое ограничение скорости передачи является неизбежным результатом разрешения пиковой передачи не более периода кругового обхода.

8.4. Расчет среднего интервала без потерь

Расчет среднего интервала без потерь в параграфе 5.4 включает умножение на весовые коэффициенты w_0 — w_(n-1), которые для n=8 имеют значения:

1.0, 1.0, 1.0, 1.0, 0.8, 0.6, 0.4, 0.2.

С незначительной потерей точности можно использовать в качестве весовых коэффициентов значения степеней числа два или суммы таких значений, например:

1.0, 1.0, 1.0, 1.0, 0.75, 0.5, 0.25, 0.25.

8.5. Опциональный механизм History Discounting

Необязательный механизм дисконтирования истории, описанный в параграфе 5.5, служит для расчета усредненной частоты потерь. Механизм дисконтирования вводится в действие лишь в тех случаях, когда наблюдаются необычно долгие интервалы передачи без потерь. Для более эффективной работы значения коэффициента DF_i могут быть ограничены степенями числа 2.

9. Отличия от RFC 3448

9.1. Обзор изменений

В этом разделе рассматриваются отличия от RFC 3448. На верхнем уровне основным отличием является добавление механизмов обработки случаев ограниченной передачи данных отправителем. Данный документ также явно разрешает отправителю TFRC накапливать до RTT неиспользованных кредитов на передачу, обеспечивающих возможность пиковой передачи пакетов при получении от приложения данных после периода ограниченной передачи. В RFC 3448 этот вопрос в явном виде не рассматривался.

В данном документе, в отличие от RFC 3448, принимаются высокие начальные значения скорости передачи TCP из RFC 3390. данный документ также отличается от RFC 3448 в части разрешения RFC 4342 использовать грубые временные метки в пакетах данных взамен более тонкой гранулярности таких меток.

Другие отличия включают процедуру замедленного старта, отклик на отбрасывание первого пакета данных и т. п. В данном документе исправлены также отмеченные ошибки RFC 3448.

Данный раздел не является нормативным; нормативные материалы приведены выше.

9.2. Изменения в отдельных параграфах

Параграф 4.1, оценка среднего размера сегмента. Приведен вариант алгоритма, который может использоваться для оценки среднего размера сегмента.

Параграф 4.2, значение начальной скорости передачи. В RFC 3448 начальная скорость передачи имеет значение 2 пакета за время кругового обхода. В настоящем документе начальная скорость передачи может достигать 4 пакетов за период кругового обхода в соответствии с RFC 3390. Начальная скорость была изменена в терминах размера сегмента s, а не в терминах MSS.

В параграфе 4.2 данного документа сказано, что tld16 во время замедленного старта может инициализироваться значениями 0 или -1. В параграфе 4.2 также даны разъяснения по поводу того, что измерения RTT могут осуществляться не только по пакетам обратной связи, но и иными способами (например, из обмена SYN-пакетами).

Параграф 4.3, отклик на пакеты обратной связи. Изменен способ использования скорости приема для ограничения дозволенной скорости передачи. Используется набор значений скорости приема за два последних периода кругового обхода, инициализируемый достаточно большим значением скорости приема.

Большое начальное значение скорости приема (параграф 4.2) используется недолго, если получатель отправляет пакет обратной связи после получения первого пакета и отправитель в ответ на этот пакет снижает дозволенную скорость передачи до значения не более 2 пакетов за период RTT, которое является удвоенной скоростью приема. Благодаря изменению обработки данных о скорости приема на стороне отправителя, последний не снижает дозволенную скорость приема до удвоенного значения скорости приема в ответ на первый пакет обратной связи.

В период ограниченной передачи данных отправитель сохраняет значение скорости приема, предшествующее периоду ограниченной передачи, если это значение превышает скорость приема в период ограниченной передачи. Отправитель также уменьшает сохраненные значения X_recv_set в ответ на продолжительный период ограниченной передачи. Этот вопрос более подробно рассмотрен в Приложении C.

Параграф 4.4, отклик на период бездействия. В соответствии с параграфом 5.1 документа [RFC4342] в данном документе указано, что при снижении скорости после периода бездействия, покрывающего время с момента запуска таймера обратной связи, дозволенная скорость передачи не снижается до значений меньше начальной скорости передачи (в параграфе 4.4 для переменной recover_rate устанавливается значение начальной скорости передачи).

Параграф 4.4, исправление ошибки [RFC3448Err]. В RFC 3448 содержится противоречивый текст о снижении отправителем скорости передачи вдвое по истечении двух периодов кругового обхода без получения пакетов обратной связи или по истечении 4 периодов кругового обхода. В данном документе указано, что снижение скорости вдвое происходит после 4 периодов кругового обхода без получения пакетов обратной связи [RFC3448Err].

Параграф 4.4, разъяснение процедуры замедленного старта. В параграфе 4.4 указано, что X_Bps не может использоваться, если при завершении отсчета таймера обратной связи p = 0, поскольку у отправителя еще нет значения X_Bps. В параграфе 4.4 также разъяснена ситуация, когда у отправителя еще нет результата определения RTT, но с момента запуска таймера обратной связи уже был передан пакет.

Параграф 4.6: кредиты за неиспользованную передачу. В параграфе 4.6 отмечено, что отправитель TFRC может накапливать до RTT кредитов за неиспользованные передачи. Параграф 4.6 был переписан для того, чтобы четко разделить требования спецификации и вопросы реализации механизма TFRC.

Параграф 5.4, разъяснение. Параграф 5.4 был переписан для прояснения расчета получателем среднего интервала между потерями в тех случаях, когда число таких интервалов еще не достигло n.

Параграф 5.5, корректировка. Параграф 5.5 был исправлен в части того, что интервал без потерь I_0 включает все переданные пакеты с учетом потерянных или маркированных пакетов (как определено в параграфе 5.3).

Параграф 5.5, исправление ошибки [RFC3448Err]. В параграфе 5.5 строка

for (i = 1 to n) { DF_i = 1; }

была заменена на

for (i = 0 to n) { DF_i = 1; }

[RFC3448Err].

Параграф 5.5, дисконтирование истории. Значение параметра THRESHOLD, определяющее нижнюю границу параметра дисконтирования истории DF, было изменено с 0,5 до 0,25 для обеспечения возможности дисконтирования при большой продолжительности интервала без потерь.

Раздел 6, множество пакетов обратной связи. В разделе 6 расширено обсуждение процедур обработки ситуаций, когда получатель шлет множество пакетов обратной связи за период кругового обхода.

Параграф 6.3, инициализация таймера обратной связи. В параграфе 6.3 описана инициализация таймера обратной связи на стороне получателя в тех случаях, когда в первом принятом пакете нет оценки периода кругового обхода.

Параграф 6.3, грубые временные метки. Параграф 6.3 был изменен с включением в качестве опции грубых временных меток от отправителя, инкрементируемых один раз за каждую четверть периода кругового обхода, вместо более прецизионных меток. Такое поведение соответствует RFC 4342.

Параграф 6.3.1, поведение после первой потери. В параграфе 6.3.1 настоящего документа сказано, что для инициализации истории потерь после первого факта потери получатель использует максимальную скорость приема взамен скорости приема в последнем периоде кругового обхода.

Параграф 6.3.1, отбрасывание первого пакета. В параграфе 6.3.1 описана инициализация истории потерь в тех случаях, когда первый пакет данных утерян или имеет маркировку ECN.

Раздел 7, серверные варианты. В разделе 7 рассматриваются варианты реализации механизма TFRC на серверах с учетом RFC 4342.

10. Вопросы безопасности

TFRC не является транспортным протоколом, а представляет собой механизм управления, предназначенный для использования с транспортным протоколом. Следовательно, вопросы безопасности требуется рассматривать прежде всего в контексте соответствующих транспортных протоколов и поддерживаемых ими механизмов аутентификации.

Механизмы контроля насыщения потенциально могут использоваться для организации атак на отказ служб. Такая атака может быть реализована путем передачи ложных сообщений обратной связи. Поэтому транспортным протоколам, использующим TFRC, следует принимать меры по защите от приема фальсифицированных пакетов обратной связи. Точные механизмы такой защиты зависят от выбранного транспортного протокола.

Кроме того, механизм контроля насыщения может использоваться «жадными» получателями, которые хотят получать данных больше, нежели позволяет беспристрастное деление полосы. Получатель может предпринять такую попытку за счет передачи серверу обманной информации о приеме пакетов, которые реально были потеряны в результате насыщения. Возможной защитой от такого поведения является включение той или иной формы специальных сигналов (nonce), которые получатель должен возвращать отправителю для подтверждения приема. Однако детали такой защиты зависят от наличия гарантий доставки пакетов на уровне транспортного протокола.

Предполагается, что протоколы, использующие ECN с TFRC, будут также поддерживать обратную связь от получателя с использованием ECN nonce [RFC3540]. ECN nonce представляет собой модификацию ECN с защитой отправителя от нечаянного или злонамеренного сокрытия маркированных пакетов. Однако детали использования таких механизмов зависят от транспортного протокола и не рассматриваются в этом документе.

10.1. Вопросы безопасности для TFRC в DCCP

TFRC в настоящее время используется механизмом контроля насыщения CCID 317 [RFC4342] протокола DCCP18 [RFC4340]. Раздел «Вопросы безопасности»19 в RFC 4340 [RFC4340] (раздел 18) включает обсуждение некоторых аспектов безопасности DCCP, в том числе проверку корректности порядковых номеров для защиты от перехвата соединений. В разделе 18 RFC 4340 также рассматриваются механизмы DCCP, способные ограничить влияние потенциальных атак на службы (DoS).

В RFC 4342 дана спецификация использования TFRC в CCID 3. RFC 4342 включает расширенное обсуждение механизмов, которые отправитель может использовать для проверки информации, переданной получателем. При использовании ECN с CCID 3 получатель возвращает отправителю информацию ECN Nonce, позволяющую последнему проверить достоверность переданных получателем данных. Для случаев когда ECN не используется в разделе 9 RFC 4342 рассматривается возможность использования отправителем различных методов, которые позволяют предотвратить проблемы, связанные с ошибочными сообщениями получателя о перегрузках в сети. Однако, как отмечено в RFC 4342, эти методы не являются столь же стойкими к ошибкам и неразрушающими, как ECN Nonce.

11. Благодарности

Авторы благодарят за отклики и обсуждении основанного на уравнении пропускной способности механизма контроля насыщения многих людей, включая членов исследовательской группы Reliable Multicast, рабочей группы Reliable Multicast Transport и исследовательской группы End-to-End. Благодарим также Dado Colussi, Gorry Fairhurst, Ladan Gharai, Wim Heirman, Eddie Kohler, Ken Lofgren, Mike Luby, Ian McDonald, Vladimir Moltchanov, Colin Perkins, Michele R., Gerrit Renker, Arjuna Sathiaseelan, Vladica Stanisic, Randall Stewart, Eduardo Urzaiz, Shushan Wen и Wendy Lee (lhh@zsu.edu.cn) за отклики на ранние версии этого документа и Mark Allman за многочисленные отклики по использованию [RFC3448] для создания работоспособной реализации.

Приложение A. Параметры

В этом документе используется целый ряд параметров. Предполагается, что временные переменные (например, t_now, tld) выражаются в секундах, а разрешение таймеров не хуже 1 миллисекунды.

data-limited interval

Интервал, в течение которого отправитель ограничивает передачу данных (т. е., передает их со скоростью меньше дозволенной) в течение интервала времени (параграф 4.3).

DF

Коэффициент дисконтирования для интервалов между потерями (параграф 5.5).

initial_rate

Дозволенная начальная скорость передачи.

last_counter

Наибольшее полученное значение размера окна (параграф 6.3).

n

Число интервалов без потерь.

NDUPACK

Число пакетов для принятия решения о потере (константа) (параграф 5.1).

nofeedback timer

Таймер на стороне отправителя (раздел 4).

p

Оцененная вероятность (частота) потерь.

p_prev

Предыдущее значение p (параграф 6.1).

q

Константа фильтрации для RTT (параграф 4.3).

q2

Константа фильтрации для долговременной оценки RTT (параграф 4.6).

R

Оценка времени кругового обхода для пути.

R_m

Конкретная оценка времени кругового обхода для пути (параграф 4.3, 6).

R_sample

Измеренное значение RTT (параграф 4.3).

R_sqmean

Долговременная оценка квадратного корня из RTT (параграф 4.6).

recover_rate

Дозволенная скорость для восстановления передачи после периода бездействия (параграф 4.4).

recv_limit

Предел скорости передачи, рассчитанный по X_recv_set (параграф 4.3).

s

Номинальный размер пакета в байтах.

S

Порядковый номер.

t_delay

Сообщенное получателем время между приемом последнего пакета и генерацией пакета обратной связи (параграф 3.2.2).

t_delta

Параметр, позволяющий гибко управлять временем передачи (параграф 8.3).

t_gran

Гранулярность таймера планирования операционной системы (константа) (параграф 8.3).

t_ipi

Межпакетный интервал при передаче (параграф 4.6).

t_mbi

Максимальное значение RTO для TCP (константа) (параграф 4.3).

t_recvdata

Временная метка последнего принятого пакета (параграф 3.2.2).

timer_limit

Предел скорости передачи в результате завершения отсчета таймера обратной связи (параграф 4.4).

tld

Время последнего удвоения (параграф 4.2).

t_now

Текущее время (параграф 4.3).

t_RTO

Estimated RTO of TCP (параграф 4.3).

X

Допустимая скорость передачи, ограничиваемая по скорости приема.

X_Bps

Рассчитанная скорость передачи в байт/сек (параграф 3.1).

X_pps

Рассчитанная скорость передачи в пакет/сек (параграф 3.1).

X_inst

Разрешенная мгновенная скорость передачи (параграф 4.6).

X_recv

Оцененная получателем скорость приема (параграф 3.2.2).

X_recv_set

Небольшой набор недавних значений X_recv (параграф 4.3).

X_target

Результирующая скорость передачи после первого факта потерь (параграф 6.3.1).

W_init

Начальное окно TCP (константа) (параграф 4.2).

Приложение B. Начальное значение таймера обратной связи

Почему в качестве начального значения таймера обратной связи TFRC используется значение 2 секунды вместо 3 секунд, рекомендуемых в качестве начального значения таймера повтора передачи TCP в соответствии с [RFC2988]? Нет каких-либо существенных причин, по которым таймер обратной связи TFRC должен иметь начальное значение, совпадающее с начальным значением таймера повтора TCP. Таймер повторной передачи в TCP используется не только для снижения скорости в ответ на насыщение, но и для повтора передачи пакетов, которые предполагаются потерянными в сети. Таймер обратной связи TFRC, напротив, используется только для снижения дозволенной скорости передачи и не служит триггером для передачи новых пакетов. В результате не возникает какой-либо опасности для сети в результате того, что начальное значение таймера обратной связи TFRC меньше рекомендуемого значения таймера повторной передачи TCP.

Далее, пока отсчет таймера обратной связи не завершился TFRC обеспечивает более медленный отклик на насыщение, нежели TCP, и применяемое в TFRC ограничение скорости передачи на основе скорости приема менее точно, нежели используемые в TCP окна и синхронизация подтверждений, поэтому таймер обратной связи является важным механизмом защиты TFRC. С учетом сказанного, представляется вполне разумным и обоснованным выбор в качестве начального значения таймера обратной связи значения, меньшего по сравнению с начальным значением таймера повторной передачи TCP.

Приложение C. Отклик на период ограниченной передачи

В последующих работах может использоваться иной отклик на значение скорости приема в период ограниченной передачи данных и факты потерь пакетов в такой период.

В частности [RFC2861] предлагает экспериментальный механизм проверки корректности окна насыщения (CWV20) для TCP. Далее мы будем использовать термин «стандартный TCP» для механизмов контроля насыщения, описанных в [RFC2581] и [RFC2581bis]. [RFC2861] задает иной отклик на периоды бездействия или ограниченной передачи, нежели принято в стандартном TCP. При использовании CWV отправитель TCP снижает вдвое размер окна насыщения после каждого RTO в течение периода бездействия, вплоть до начального размера окна. Аналогично при использовании CWV отправитель TCP уменьшает вдвое окно насыщения после каждого RTO в периоды ограниченной передачи.

В этом документе уже задан отклик TFRC на периоды бездействия, похожий на поведение TCP с CWV. Однако этот документ не задает отклик TFRC на периоды ограниченной передачи данных по аналогии с CWV. Добавление такого механизма в TFRC будет требовать изменения одной строки в псевдокоде п. 4) параграфа 4.3. В частности, отклик отправителя на пакет обратной связи:

    If (если весь интервал, закрываемый пакетом обратной связи, характеризуется 
            ограниченной передаче данных) {
          If (пакет обратной связи говорит о новом факте потерь или росте частоты
                       потерь p) {
              уменьшить вдвое элементы X_recv_set;
              X_recv = 0.85 * X_recv;
              Maximize X_recv_set();
              recv_limit = max(X_recv_set);
          } Else {
              Maximize X_recv_set();
              recv_limit = 2 * max (X_recv_set);
          }
    }

будет заменен на:

      If (если весь интервал, закрываемый пакетом обратной связи, характеризуется 
            ограниченной передаче данных) {
          Старые элементы X_recv_set умножаются на 0,85;
          If (пакет обратной связи говорит о новом факте потерь или росте частоты
                       потерь p) {
              Новое значение X_recv умножается на 0,85.
          }
          Maximize X_recv_set();
          recv_limit = 2 * max (X_recv_set);
      }

В частности, если скорость приема из предыдущего периода ограниченной передачи сохранена в X_recv_set, приведенное выше изменение п. 4) будет приводить к умножению этой скорости на 0,85 всякий раз при получении пакета обратной связи и выполнении приведенного выше псевдокода. В результате после 4 последовательных периодов кругового обхода скорость приема из предыдущего периода ограниченной передачи будет умножаться на 0,854 = 0,52. Таким образом, изменение одной строки в п. 4) параграфа 4.3 будет приводить к снижению дозволенной скорости вдвое за каждые 4 периода кругового обхода, в течение которых отправитель ограничивал передачу данных. По самой природе X_recv_set этот механизм никогда не будет снижать дозволенную скорость передачи ниже удвоенного последнего значения скорости приема.

Отметим, что для сохранения похожего на CWV стиля откликов на ограничение передачи данных сохраняется значение

recv_limit = 2 * max (X_recv_set);

взамен

recv_limit = max (X_recv_set);

для реагирования на потери в периоды ограниченной передачи. Такой ослабленный отклик на факт потери дозволен потому, что поведение в стиле CWV само по себе ограничивает скорость флуктуаций скорости передачи в периоды ограниченной передачи данных.

C.1. Долгое бездействие или ограниченный объем данных

Таблица 1: Отклики на долгое бездействие и ограничение передачи данных

Протокол Долгие периоды бездействия Долгие периоды ограниченной передачи
Стандартный TCP Начальный размер окна Окно увеличивается для каждого cwnd
TCP с CWV Половина окна (не меньше cwnd) Уменьшение окна наполовину
Стандартный TFRC Снижение скорости вдвое (не менее 2 пакетов за RTT). В течение 1 RTT после передачи пакета скорость ограничена значением X_recv Скорость передачи ограничена удвоенной скоростью приема
Обновленный TFRC Снижение скорости вдвое (не ниже начальной) Скорость ограничена удвоенным значением max (текущее значение X_recv, скорость приема до периода ограничения)

 Таблица 1 описывает отклики стандартного TCP [RFC2581], TCP с контролем насыщения CWV[RFC2861], стандартного TFRC [RFC3448] и обновленного TFRC (данный документ) на периоды длительного бездействия или ограниченной передачи. Длинным считается период, продолжительность которого не менее RTO.

Стандартный TCP после долгого бездействия.

Для стандартного TCP [RFC2581] указывает, что после периода бездействия не менее RTO TCP следует установить окно насыщения не более изначального размера окна (точнее говоря, RFC 2581 указывает, что отправителю TCP следует установить для cwnd значение изначального размера окна, если отправитель не передавал данных в течение интервала, превышающего тайм-аут повтора).

Стандартный TCP после длительного ограничения передачи.

Стандартный TCP [RFC2581] не снижает размер окна насыщения после периода ограниченной передачи данных, в течение которого окно насыщения не использовалось полностью. Стандартный TCP в [RFC2581] использует значения FlightSize (объем остающихся в сети данных) только для установки порога замедленного старта по истечении тайм-аута повтора передачи. Стандартный TCP не ограничен синхронизацией подтверждений в течение периода ограниченной передачи.

Слабый отклик стандартного TCP на периоды ограниченной передачи существенно отличается от строго отклика на периоды бездействия.

TCP с CWV после долгого бездействия.

В качестве экспериментального варианта [RFC2861] предлагает более сдержанный отклик на период бездействия, нежели принято в стандартном TCP, где в период бездействия отправитель TCP вдвое снижает значение cwnd после каждого периода RTO (вплоть до начального значения cwnd).

TCP с CWV после длительного ограничения передачи.

В качестве экспериментального варианта [RFC2861] предлагает более строгий отклик на периоды ограниченной передачи данных, нежели принято в стандартном TCP, где после каждых RTO секунд ограниченной передачи окно насыщения уменьшается вдвое по сравнению с используемым размером окна насыщения.

Отклик TCP с CWV на период бездействия похож на отклик в периоды ограниченной передачи данных. TCP с CWV вносит меньшие по сравнению со стандартным TCP ограничений в отклики на период бездействия и большие ограничения в отклики на периоды ограниченной передачи данных.

Стандартный TFRC после долгого бездействия.

Для стандартного TFRC в [RFC3448] указано, что дозволенная скорость передачи снижается вдвое после каждых RTO секунд периода бездействия. Дозволенная скорость передачи не снижается до значений меньше 2 пакетов за период RTT после периода бездействия. Первый пакет обратной связи после периода бездействия сообщает о скорости приема в пакетах за период кругового обхода — эта скорость используется для ограничения скорости передачи. Стандартный TFRC эффективно выполняет процедуру замедленного старта, начиная с этого значения дозволенной скорости.

Стандартный TFRC после длительного ограничения передачи.

[RFC3448] не делает различий между периодами бездействия и периодами ограниченной передачи. По этой причине дозволенная скорость передачи ограничивается значением, не превышающим удвоенную скорость приема в течение и после периода ограниченной передачи. Это очень жесткое ограничение, более жесткое, нежели в стандартном TCP и TCP с CWV.

Обновленный TFRC после долгого бездействия.

Для обновленного TFRC в данном документе указано, что дозволенная скорость снижается вдвое за каждые RTO секунд периода бездействия. В результате бездействия дозволенная скорость не снижается до значений меньше начальной скорости передачи. Первый пакет обратной связи после периода бездействия сообщает о скорости приема в 1 пакет за период кругового обхода. Однако отправитель в обновленном TFRC не использует это значение скорости приема для ограничения скорости передачи. Таким образом, обновленный TFRC отличается от стандартного тем, что устанавливается более низкий предел снижения скорости передачи, а отклик на первый пакет обратной связи после периода бездействия является более эффективным.

Обновленный TFRC после длительного ограничения передачи.

Для обновленного TFRC в настоящем документе внесены различия между периодами бездействия и периодами ограниченной передачи. Как указано в параграфе 4.3, в периоды ограниченной передачи обновленный TFRC помнит скорость приема до начала ограничений и не снижает дозволенную скорость ниже удвоенного значения сохраненной в памяти скорости приема. Это похоже на отклик стандартного TCP, но достаточно сильно отличается от весьма ограниченного отклика стандартного TFRC на периоды ограниченной передачи. Однако отклик обновленного TFRC не столь консервативен, как отклик TCP с CWV, где окно насыщения постепенно уменьшается до реального размера окна в период ограниченной передачи.

Отметим, что для современных реализаций TCP окно насыщения в общем случае не увеличивается в период ограниченной передачи (когда текущее окно насыщения не используется полностью) [MAF05] (параграф 5.7). В обновленном TFRC подобного механизма нет.

Восстановление после периодов бездействия или ограниченной передачи.

Когда TCP снижает размер окна насыщения после бездействия или ограниченной передачи, TCP может установить порог замедленного старта ssthresh, позволяющий отправителю TCP начать замедленный возврат к старому значению скорости передачи по завершении периода бездействия или ограниченной передачи. Однако в TFRC даже при ограничении скорости передачи отправителя TFRC удвоенным значением предшествующей скорости приема отправитель может удвоить скорость передачи по сравнению с предыдущим периодом кругового обхода, если это позволяет уравнение пропускной способности. Таким образом, TFRC не требуются механизмы, типа используемого в TCP порога замедленного старта ssthresh для выполнения процедуры замедленного старта после периодов бездействия или ограниченной передачи.

В перспективе одним из направлений развития является добавление механизмов проверки окна насыщения (CWV) для откликов TFRC на периоды ограниченной передачи. В настоящее время, следуя стандартному TCP, в периоды ограниченной передачи обновленный TFRC не ограничивают скорость передачи в зависимости от скорости приема.

C.2. Короткое бездействие или ограниченный объем данных

Таблица 2 показывает отклики стандартного TCP [RFC2581], TCP с CWV [RFC2861], стандартного TFRC [RFC3448] и обновленного TFRC (данный документ) на короткие периоды бездействия или ограниченной передачи. Коротким считается период, продолжительность которого меньше RTT.

Таблица 2: Отклики на короткое бездействие и ограничение передачи данных

Протокол Короткие периоды бездействия Короткие периоды ограниченной передачи
Стандартный TCP Пик размером до cwnd Пик размером до cwnd
TCP с CWV Пик размером до cwnd Пик размером до cwnd
Стандартный TFRC ? ?
Обновленный TFRC Пик размером до RTT неиспользованных кредитов на передачу Пик размером до RTT неиспользованных кредитов на передачу

 Таблица 2 показывает, что отклики обновленного TFRC на короткие периоды бездействия или ограниченной передачи подобны откликам стандартного TCP и TCP с CWV. Для коротких периодов бездействия или ограниченной передачи TCP ограничивается только размером неиспользуемого окна насыщения, а обновленных TFRC — только число неиспользованных кредитов на передачу (до RTT). Для стандартного TFRC [RFC3448] не задает в явном виде поведения в части неиспользованных кредитов на передачу.

C.3. Среднее бездействие или ограниченный объем данных

Таблица 3 показывает отклики стандартного TCP [RFC2581], TCP с CWV [RFC2861], стандартного TFRC [RFC3448] и обновленного TFRC (данный документ) на периоды бездействия или ограниченной передачи средней продолжительности. Средними считаются периоды продолжительностью более RTT, но меньше RTO.

Таблица 3: Отклики на среднее по продолжительности бездействие и ограничение передачи данных

Протокол Средние периоды бездействия Средние периоды ограниченной передачи
Стандартный TCP Пик размером до cwnd Пик размером до cwnd
TCP с CWV Пик размером до cwnd Пик размером до cwnd
Стандартный TFRC ? Ограничено X_recv
Обновленный TFRC Пик размером до RTT неиспользованных кредитов на передачу Пик размером до RTT неиспользованных кредитов на передачу

 Таблица 3 показывает, что отклики обновленного TFRC на периоды бездействия или ограниченной передачи средней продолжительности подобны откликам стандартного TCP и TCP с CWV. Для средних по продолжительности периодов бездействия или ограниченной передачи TCP ограничивается только размером неиспользуемого окна насыщения. В таких же ситуациях обновленный TFRC ограничивается только числом неиспользованных кредитов на передачу (до RTT). Для периодов ограниченной передачи средней продолжительности стандартный TFRC будет ограничен значением X_recv из последнего пакета обратной связи. Обновленный TFRC, напротив, не ограничивается скоростью приема в течение периода ограниченной передачи, которая покрывает весь подтвержденный пакетом обратной связи период кругового обхода. Для стандартного TFRC [RFC3448] не задает явно поведение в части неиспользованных кредитов на передачу.

C.4. Потери в период ограниченной передачи данных

В этом параграфе обсуждаются отклики на потери в период ограниченной передачи данных.

Таблица 4: Отклики на потери в период ограниченной передачи данных

Протокол Отклик на потери
Стандартный TCP Установить для ssthresh и cwnd значение FlightSize/2
TCP с CWV Установить для ssthresh и cwnd значение FlightSize/2
Стандартный TFRC Рассчитать X_Bps и передавать не более 2*X_Bps
Обновленный TFRC Рассчитать X_Bps и передавать не более recv_limit. Изменить X_recv_set

В TCP [RFC2581] отклик на потери в период ограниченной передачи данных не отличается от откликов на потери в любом другом состоянии TCP. Этот отклик состоит в установке окна насыщения в размере половины FlightSize, где FlightSize определяет размер переданных, но еще не подтвержденных данных. Таким образом, после потери в период ограниченной передачи отправитель TCP должен вдвое снизить скорость передачи, как это происходит при обычных условиях в ответ на потерю.

В стандартном TFRC отклик на потери в период ограниченной передачи совпадает с откликом на потери в любом другом состоянии TFRC. Скорость передачи ограничивается значением X_Bps из уравнения пропускной способности, а также удвоенным последним значением скорости приема X_recv. В результате после потери в период ограниченной передачи может передавать данные со скоростью до 2*X_recv, даже в тех случаях, когда X_Bps из уравнения пропускной способности разрешает большую скорость.

В обновленном TFRC использование скорости приема X_recv в периоды ограниченной передачи для отклика на потери в такие периоды изменено; скорость передачи ограничена значением recv_limit и отправитель может запоминать значения скорости приема X_recv непосредственно перед началом периода ограниченной передачи. Это позволяет отправителю увеличивать скорость передачи в период ограничений более, чем вдвое, вплоть до скорости приема перед началом ограничений (если это дозволяет значение X_Bps, полученное из уравнения пропускной способности). Такое поведение похоже на принятую в стандартном TCP практику отказа от снижения размера окна в период ограниченной передачи данных (при отсутствии потерь).

Как и в стандартном TFRC отправитель в обновленном TFRC передает данных меньше, нежели позволяет значение X_Bps из уравнения пропускной способности. После потери отправитель по-прежнему может не хотеть передавать данных больше, чем позволяет новое значение X_Bps, которое учитывает факт потери. В обновленный TFRC добавлен механизм постепенного ограничения скорости передачи после потерь в период ограниченной передачи. В отличие от отклика TCP в форме установки для размера окна насыщения cwnd значения в половину FlightSize, дополнительные механизмы в обновленном TFRC используют принятую в TFRC практику медленного изменения откликов как для увеличения, так и для снижения допустимой скорости передачи.

Это делается в обновленном TFRC (п. 4) параграфа 4.3) путем уменьшения элемента X_recv_set после потери в период ограниченной передачи и позволяет отправителю передать до max(X_recv_set) данных, вместо 2*max(X_recv_set), в период кругового обхода, следующий непосредственно за получением информации о потере. Таким образом, возможность передачи более, чем 2*X_recv (последнее полученное значение) в интервале ограниченной передачи достигается за счет введения дополнительного механизма снижения дозволенной скорости после потерь в период ограниченной передачи.

Для иллюстрации отклика TFRC на потери в период ограниченной передачи данных рассмотрим несколько примеров.

Таблица 5: Потеря после периода ограниченной передачи

Этап 1: Нет ограничения передачи.
        Передается 100 пакетов за период кругового обхода (RTT).
Этап 2: Ограниченная передачи, 10 пакетов за RTT.
Этап 3: Нет ограничения передачи.
        Передается 100 пакетов за RTT, как позволяет X_Bps.
        Потеря пакета в первом RTT этапа 3.
        Обновление X_Bps.

Отклик обновленного TFRC: незначительное снижение дозволенной скорости передачи в зависимости от числа пакетов с момента последней потери.

Пример 1, потеря после периода ограниченной передачи. Этот пример показывает, что потери после завершения периода ограниченной передачи данных решаются с помощью уравнения пропускной способности для X_Bps.

В примере 1, где пакет теряется в первый RTT этапа 3, это будет отражаться измененным значением X_Bps и дальнейшие потери пакетов будут приводить к дополнительному снижению X_Bps. В частности, следуя стандартному для TFRC уравнению пропускной способности [FHPW00] (параграф A.2), дозволенная скорость передачи TFRC будет снижена вдвое после пяти периодов кругового обхода подряд с потерями пакетов.

Пример 2, незначительное ограничение передачи данных. В этом примере рассматривается потеря пакета в период ограниченной передачи, когда отправитель передает чуть меньше данных, чем ему разрешено.

Таблица 6: Потеря при незначительном ограничении передачи

Этап 1: Нет ограничения передачи. 100 пакетов за RTT.
Этап 2: Ограниченная передачи, 99 пакетов за RTT.
        Пакет теряется на этапе 2.

Отклик обновленного TFRC: незначительное снижение дозволенной скорости передачи (до 85 пакетов за RTT или чуть меньше) в зависимости от числа пакетов с момента последней потери.

Рассмотрим соединение обновленного TFRC, где отправитель передает 100 пакетов за RTT и начинает ограничивать передачу 99 пакетами по причине нехватки данных от приложения (т. е., за каждый период интервала ограниченной передачи отправитель может передать еще один пакет). Если в период ограниченной передачи теряется пакет, дозволенная скорость передачи снижается до min(X_Bps, recv_limit), где оба значения X_Bps и recv_limit незначительно отличаются от дозволенной скорости передачи.

Таблица 7: Потеря одного пакета

Этап 1: Нет ограничения передачи. 100 пакетов за RTT.
Этап 2: Ограниченная передачи, 10 пакетов за RTT.
Этап 3: Нет передачи в течение 2 периодов RTT.
Этап 4: Передается 1 пакет, который приходит с маркером ECN.

Отклик обновленного TFRC: снижение дозволенной скорости передачи до 50 пакетов за RTT. Для каждой потери пакета в период ограниченной передачи сохраненное значение X_recv до начала ограничения передачи уменьшается вдвое.

Пример 3, потеря 1 пакета в период ограниченной передачи. В этом примере рассматривается потеря единственного пакета в период ограниченной передачи после того, как отправитель не передавал пакетов в течение 2 RTT.

Рассмотрим соединение обновленного TFRC, где отправитель передавал 100 пакетов за RTT и начал ограничивать передачу на уровне 10 пакетов за RTT, а потом не передавал пакетов в течение 2 периодов RTT, после чего передал один пакет, который был принят с маркером ECN. В этом случае обновленный TFRC для каждого факта потери в период ограниченной передачи будет снижать вдвое сохраненное значение скорости перед началом периода ограниченной передачи X_recv.

Таблица 8: Потери после увеличения скорости передачи

Этап 1: Нет ограничения передачи. 100 пакетов за RTT.
Этап 2: Ограниченная передачи, 1 пакет за RTT.
Этап 2: Ограниченная передачи, 20 пакетов за RTT.
        Теряется несколько пакетов в каждом RTT этапа 3.
        В течение этапа 3 отправитель желает передавать 20 пакетов за RTT.

Отклик обновленного TFRC: при каждой потере пакетов в течение периода ограниченной передачи сохраненное значение скорости приема до начала ограничения X_recv уменьшается вдвое, а последнее полученное значение X_recv умножается на 0,85.

Пример 4, Потери после увеличения скорости передачи в период ограничения. В этом примере рассматриваются потери в то время, когда отправитель существенно повышает скорость передачи данных в период ограниченной передачи.

Рассмотрим соединение обновленного TFRC, где отправитель передавал 100 пакетов за RTT, затем ограничил передачу до 1 пакета за RTT и снова увеличил до 20 пакетов. После этого неоднократно возникали потери пакетов.

В этом случае обновленный TFRC при каждом факте потери данных в период ограниченной передачи будет снижать вдвое сохраненное значение скорости приема до ограничения X_recv, а последнее значение X_recv будет умножаться на 0,85.

C.5. Другие варианты

Другим путем оценки обновленного TFRC является сравнение поведения TCP, стандартного TFRC и обновленного TFRC для соединений с чередованием периодов занятости и бездействия, периодов бездействия и ограниченной передачи, а также чередования бездействия и ограниченной передачи в процессе замедленного старта.

C.6. Оценка отклика TFRC на периоды бездействия

В этом параграфе проводится оценка отклика обновленного TFRC на периоды бездействия и ограниченной передачи.

Одним из недостатков стандартного TFRC является то, что жесткий отклик на периоды бездействия или ограниченной передачи может вызывать у приложения желание дополнить поток данных ненужной информацией для предотвращения простоев. Поэтому в обновленном TFRC используется менее жесткий отклик на периоды бездействия или ограниченной передачи. Ведутся работы (например, Faster Restart [KFS07]), которые могут также снизить желание приложений заполнять паузы пустыми данными за счет ускорения процедуры восстановления после периода бездействия. Будут полезны дальнейшие исследования для более детального понимания взаимодействия между механизмами контроля насыщения TCP или TFRC и приложениями, стремящимися заполнить паузы пустыми данными в периоды бездействия или ограниченной передачи.

TCP с контролем окна насыщения (CWV), описанный в параграфе C.1, является экспериментальным стандартом, задающим для отправителя TCP медленное снижение размера окна насыщения в период бездействия или ограниченной передачи [RFC2861]. Хотя отклики TFRC и обновленного TFRC на периоды бездействия похожи на отклики TCP с CWV, отклик обновленного TFRC на периоды ограниченной передачи менее консервативны, нежели аналогичные отклики TCP с CWV (а отклики стандартного TFRC на периоды ограниченной передачи были более консервативны по сравнению с откликами CWV). В будущих работах этот документ может пересматриваться и в отклик обновленного TFRC на периоды ограниченной передачи может включать медленное снижение допустимой скорости передачи; в Приложении C приводится один из возможных механизмов такого снижения. Такие модификации станут более вероятными, если механизм контроля окна насыщения CWV получит в IETF статус Proposed Standard21 для TCP.

Литература

Нормативные документы

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, March 1997.

[RFC3448] Handley, M., Floyd, S., Padhye, J., and J. Widmer, «TCP Friendly Rate Control (TFRC): Protocol Specification», RFC 3448, January 2003.

Дополнительная литература

[BRS99] Balakrishnan, H., Rahul, H., and Seshan, S., «An Integrated Congestion Management Architecture for Internet Hosts,»23 Proc. ACM SIGCOMM, Cambridge, MA, September 1999.

[CCID-4] Floyd, S., and E. Kohler, «Profile for DCCP Congestion Control ID 4: the Small-Packet Variant of TFRC Congestion Control», Work in Progress, February 2008.

[FHPW00] S. Floyd, M. Handley, J. Padhye, and J. Widmer, «Equation-Based Congestion Control for Unicast Applications»24, August 2000, Proc SIGCOMM 2000.

[FHPW00a] S. Floyd, M. Handley, J. Padhye, and J. Widmer, «Equation-Based Congestion Control for Unicast Applications: the Extended Version»25, ICSI tech report TR-00-03, March 2000.

[FF99] Floyd, S., and K. Fall, Promoting the Use of End-to-End Congestion Control in the Internet, IEEE/ACM Transactions on Networking26, August 1999.

[KFS07] E. Kohler, S. Floyd, and A. Sathiaseelan, «Faster Restart for TCP Friendly Rate Control (TFRC)», Work in Progress, November 2007.

[MAF05] A. Medina, M. Allman, and S. Floyd, «Measuring the Evolution of Transport Protocols in the Internet», ACM Computer Communications Review27, April 2005.

[PFTK98] Padhye, J. and Firoiu, V. and Towsley, D. and Kurose, J., «Modeling TCP Throughput: A Simple Model and its Empirical Validation»28, Proc ACM SIGCOMM 1998.

[RFC2140] Touch, J., «TCP Control Block Interdependence», RFC 2140, April 1997.

[RFC2581] Allman, M., Paxson, V., and W. Stevens, «TCP Congestion Control», RFC 2581, April 1999.

[RFC2581bis] Allman, M., Paxson, V., and W. Stevens, «TCP Congestion Control», Work in Progress, April 2008.

[RFC2861] Handley, M., Padhye, J., and S. Floyd, «TCP Congestion Window Validation», RFC 2861, June 2000.

[RFC2988] Paxson, V. and M. Allman, «Computing TCP’s Retransmission Timer», RFC 2988, November 2000.

[RFC3168] Ramakrishnan, K., Floyd, S., and D. Black, «The Addition of Explicit Congestion Notification (ECN) to IP», RFC 3168, September 2001.

[RFC3390] Allman, M., Floyd, S., and C. Partridge, «Increasing TCP’s Initial Window», RFC 3390, October 2002.

[RFC3448Err] RFC 3448 Errata, <http://www.rfc-editor.org/errata_search.php?rfc=3448>.

[RFC3540] Spring, N., Wetherall, D., and D. Ely, «Robust Explicit Congestion Notification (ECN) Signaling with Nonces», RFC 3540, June 2003.

[RFC4340] Kohler, E., Handley, M., and S. Floyd, «Datagram Congestion Control Protocol (DCCP)», RFC 4340, March 2006.

[RFC4342] Floyd, S., Kohler, E., and J. Padhye, «Profile for Datagram Congestion Control Protocol (DCCP) Congestion Control ID 3: TCP-Friendly Rate Control (TFRC)», RFC 4342, March 2006.

[RFC4828] Floyd, S. and E. Kohler, «TCP Friendly Rate Control (TFRC): The Small-Packet (SP) Variant», RFC 4828, April 2007.

[W00] Widmer, J., «Equation-Based Congestion Control», Diploma Thesis, University of Mannheim, February 2000, <http://www.icir.org/tfrc/>.

Адреса авторов

Sally Floyd

ICSI

1947 Center St, Suite 600

Berkeley, CA 94708

EMail: floyd@icir.org

Mark Handley,

Department of Computer Science

University College London

Gower Street

London WC1E 6BT

UK

EMail: M.Handley@cs.ucl.ac.uk

Jitendra Padhye

Microsoft Research

EMail: padhye@microsoft.com

Joerg Widmer

DoCoMo Euro-Labs

Landsberger Strasse 312

80687 Munich

Germany

EMail: widmer@acm.org


Перевод на русский язык

Николай Малых

nmalykh@gmail.com

Полное заявление авторских прав

Copyright (C) The IETF Trust (2008).

К этому документу применимы права, лицензии и ограничения, указанные в BCP 78, и, за исключением указанного там, авторы сохраняют свои права.

Этот документ и содержащаяся в нем информация представлены «как есть» и автор, организация, которую он/она представляет или которая выступает спонсором (если таковой имеется), Internet Society и IETF отказываются от каких-либо гарантий (явных или подразумеваемых), включая (но не ограничиваясь) любые гарантии того, что использование представленной здесь информации не будет нарушать чьих-либо прав, и любые предполагаемые гарантии коммерческого использования или применимости для тех или иных задач.

Интеллектуальная собственность

IETF не принимает какой-либо позиции в отношении действительности или объема каких-либо прав интеллектуальной собственности (Intellectual Property Rights или IPR) или иных прав, которые, как может быть заявлено, относятся к реализации или использованию описанной в этом документе технологии, или степени, в которой любая лицензия, по которой права могут или не могут быть доступны, не заявляется также применение каких-либо усилий для определения таких прав. Сведения о процедурах IETF в отношении прав в документах RFC можно найти в BCP 78 и BCP 79.

Копии раскрытия IPR, предоставленные секретариату IETF, и любые гарантии доступности лицензий, а также результаты попыток получить общую лицензию или право на использование таких прав собственности разработчиками или пользователями этой спецификации, можно получить из сетевого репозитория IETF IPR по ссылке http://www.ietf.org/ipr.

IETF предлагает любой заинтересованной стороне обратить внимание на авторские права, патенты или использование патентов, а также иные права собственности, которые могут потребоваться для реализации этого стандарта. Информацию следует направлять в IETF по адресу ietf-ipr@ietf.org.


1TCP-Friendly Rate Control — дружественное к TCP управление скоростью.

2В оригинале используется термин best efforts. Прим. перев.

3Additive-Increase, Multiplicative-Decrease — аддитивный рост, мультипликативное снижение.

4TFRC-PacketSize.

5Congestion Control ID 3.

6Datagram Congestion Control Protocol — протокол передачи дейтаграмм с контролем насыщения.

7Explicit Congestion Notification.

8Round-trip time.

9Selective acknowledgment — селективное подтверждение.

10В оригинале используется термин nofeedback timer. Прим. перев.

11Time Last Doubled.

12Maximum Segment Size.

13Бесконечность.

14Имеются пропуски в порядковых номерах. Прим. перев.

15History discounting mechanism.

16Time Last Doubled — время последнего удвоения

17Congestion Control ID 3.

18Datagram Congestion Control Protocol — протокол дейтаграмм с контролем насыщения.

19Security Considerations.

20Congestion Window Validation

21Предложенный стандарт.

22Перевод этого документа имеется на сайте www.protokols.ru. Прим. перев.

23Документ доступен по ссылке http://publications.csail.mit.edu/lcs/pubs/pdf/MIT-LCS-TR-771.pdf. Прим. перев.

24Документ доступен по ссылке http://www.icir.org/tfrc/tcp-friendly.pdf. Прим. перев.

25Документ доступен по ссылке http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.36.8816&rep=rep1&type=pdf. Прим. перев.

26Документ доступен по ссылке http://www.icir.org/floyd/papers/collapse.may99.pdf. Прим. перев.

27Документ доступен по ссылке http://www.icir.org/floyd/papers/TCPevolution-May2004.pdf. Прим. перев.

28Документ доступен по ссылке http://www.sigcomm.org/sigcomm98/tp/paper25.pdf. Прим. перев.

Update X_recv_set():

добавить X_recv к X_recv_set;

Удалить из X_recv_set значения, не относящиеся к двум последним периодам RTT.

Рубрика: RFC | Оставить комментарий

RFC 5282 Using Authenticated Encryption Algorithms with the Encrypted Payload of the Internet Key Exchange version 2 (IKEv2) Protocol

Network Working Group                                           D. Black
Request for Comments: 5282                                           EMC
Updates: 4306                                                  D. McGrew
Category: Standards Track                                    August 2008

Использование алгоритмов аутентифицированного шифрования с элементом Encrypted в протоколе IKEv2

Using Authenticated Encryption Algorithms with the Encrypted Payload of the Internet Key Exchange version 2 (IKEv2) Protocol

PDF

Статус документа

Этот документ представляет проект стандартного протокола для сообщества Internet и служит приглашением к дискуссии в целях развития и совершенствования протокола. Информацию о текущем состоянии стандартизации протокола можно найти в документе Internet Official Protocol Standards (STD 1). Настоящий документ может распространяться без ограничений.

Аннотация

Алгоритм аутентифицированного шифрования объединяет в одну операцию шифрование и защиту целостности. Такие алгоритмы называют также комбинированными. В этом документе описано использование алгоритмов аутентифицированного шифрования с элементами данных Encrypted протокола IKEv21.

Описано также применение двух конкретных алгоритмов аутентифицированного шифрования с элементами IKEv2 Encrypted. Это алгоритм AES2 в режимах AES GCM3 и AES CCM4. Для использования других алгоритмов аутентифицированного шифрования с элементами IKEv2 Encrypted могут быть разработаны отдельные документы.

1. Введение

Алгоритм аутентифицированного шифрования объединяет функции шифрования и защиты целостности в одну операцию над открытым текстом (plaintext) для создания шифрованного текста с контролем целостности [RFC5116]. Для проверки целостности может использоваться значение ICV5, логически отделенное от зашифрованных данных, или код для проверки целостности может включаться в зашифрованные данные, которые создаются алгоритмом. Алгоритмы аутентифицированного шифрования называют также комбинированным режимом работы блочного шифра (combined mode of operation of a block cipher) или алгоритмами комбинированного режима.

Алгоритм AEAD6 обеспечивает защиту целостности для дополнительных данных, связанных с открытым текстом и остающихся не зашифрованными. В этом документе описано использование алгоритма AEAD с элементами данных Encrypted в протоколе IKEv27. Описано также использование двух конкретных алгоритмов AEAD с элементами данных IKEv2 Encrypted — AES GCM [GCM] и AES CCM [CCM].

Версия 1 протокола обмена ключами в Internet (IKEv1) [RFC2409] основана на протоколе ISAKMP8 [RFC2408]. Бит E (Encryption — шифрование) в заголовке ISAKMP говорит о том, что все элементы данных после заголовка зашифрованы, но любая проверка целостности этих элементов обеспечивается отдельным элементом Hash или Signature (см. параграфы 3.1, 3.11 и 3.12 в [RFC2408]). Такое отделение шифрования от защиты целостности препятствует использованию аутентифицированного шифрования в IKEv1, ограничивая использование комбинированного режима AES в IPsec протоколом ESP9 [RFC2406]. Текущей версией ESP является версия 3 — ESPv3 [RFC4303].

Версия 2 протокола обмена ключами (IKEv2) [RFC4306] использует элементы Encrypted, устроенные на основе ESP. Элемент данных IKEv2 Encrypted связывает шифрование и защиту целостности ток, что становится возможным использование алгоритмов AEAD.

1.1. Используемые соглашения

Ключевые слова необходимо (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не нужно (SHALL NOT), следует (SHOULD), не следует (SHOULD NOT), рекомендуется (RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе должны интерпретироваться в соответствии с [RFC2119].

Символы и переменные для обозначения входных и выходных данных в операциях шифрования и расшифровки (K, N, P, A, C) определены в [RFC5116]. Символы и переменные SK_*, обозначающие конкретные ключи IKEv2, определены в [RFC4306].

2. Структура документа

Этот документ основан на RFC, описывающих использование AES GCM [RFC4106] и AES CCM [RFC4309] с протоколом ESP, поэтому вводный материал и спецификации режимов из этих документов не повторяются здесь. Структура этого документа следует структуре упомянутых и многие параграфы соответствуют параграфам предшественников, а существенные отличия, которые следует принимать во внимание разработчикам, отмечены явно. Существенные части этого документа заимствованы из двух упомянутых RFC.

Этот документ основан на терминологии, обозначениях и интерфейсах аутентифицированного шифрования, описанных в [RFC5116]. Важным отличием от [RFC4106] и [RFC4309] является то, что в этих двух документах процедуры шифрования и защиты целостности разделяются, а [RFC5116] задает единый шифрованный выход (ciphertext — C), включающий защиту целостности. Более общий подход включает алгоритмы аутентифицированного шифрования, которые выдают один расширенный шифрованный выход со встроенной защитой целостности вместо раздельного шифрования и защиты целостности.

Для AES GCM и AES CCM шифрованный (C) вывод [RFC5116] аутентифицированного шифрования содержит зашифрованные данные [RFC4106] или [RFC4309], объединенные (конкатенация) со значением кода проверки целостности (ICV10) [RFC4106] или [RFC4309]. Этот документ не меняет алгоритмов аутентифицированного шифрования AES GCM и AES CCM, описанных в [RFC4106] и [RFC4309].

3. Элементы данных IKEv2 Encrypted

Этот раздел основан на [RFC5116] и параграфе 3.14 [RFC4306].

                     1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! Next Payload  !C!  RESERVED   !         Payload Length        !
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
!                     Initialization Vector                     !
! (размер, заданный алгоритмом аутентифицированного шифрования) !
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~                        Ciphertext                             ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 1. Элемент IKEv2 Encrypted с аутентифицированным шифрованием.

Для использования алгоритмов аутентифицированного шифрования с элементами данных IKEv2 Encrypted этот раздел обновляет текст параграфа 3.14 в [RFC4306], меняя рисунок 21 и следующий за ним текст (до конца параграфа) содержимым этого раздела. Кроме того, содержимое параграфа 3.14 в [RFC4306] обновлено также в плане разрешения использовать один алгоритм аутентифицированного шифрования вместо раздельных алгоритмов блочного шифрования и защиты целостности. Параграфы 3.1 и 3.2 этого документа относятся к алгоритмам AES GCM и AES CCM, не меняя, следовательно, документа [RFC4306]. Вносимые этим документом обновления [RFC4306] не оказывают влияния в тех случаях, когда аутентифицированное шифрование не предлагается и не используется.

Структура данных элемента IKEv2 Encrypted применяется для всех алгоритмов аутентифицированного шифрования и эта же структура применяется в ESP. При использовании алгоритма аутентифицированного шифрования элемент IKEv2 Encrypted включает поля заголовка, за которым следует вектор инициализации (IV11) и поле шифрованных данных (C12), включающее контроль целостности (см. рисунок 1).

Поле Next Payload, флаг C и поле Payload Length не меняются по сравнению с [RFC4306].

Содержимое поля IV определяется алгоритмом аутентифицированного шифрования (см. параграф 3.1 и 4 для алгоритмов AES GCM и AES CCM).

Поле Ciphertext представляет собой выход алгоритма аутентифицированного шифрования (см. параграф 2.1 [RFC5116]) для приведенных ниже входных данных.

  • Секретный ключ (K) — ключ шифрования, получаемый из ключа SK_ei или SK_er (который подходит), как описано в [RFC4306]. Получение ключа шифрования из SK_ei или SK_er для алгоритмов AES GCM и AES CCM описано ниже в параграфе 7.1.

  • Одноразовое значение nonce (N), указываемое алгоритмом аутентифицированного шифрования (для AES GCM и AES CCM см. раздел 4 ниже). При расшифровке элемента Encrypted принимающая сторона создает значение nonce на основе вектора инициализации IV в Encrypted с использованием правил для конкретного алгоритма аутентифицированного шифрования (см. параграфы 3.1 и 4 для алгоритмов AES GCM и AES CCM).

  • Открытые (нешифрованные) данные (P13) представляют собой конкатенацию шифруемых элементов данных IKE с заполнением Padding (если оно используется) и полем Pad Length, как показано ниже на рисунке 2. Структура открытых данных на рисунке 2 применяется для всех алгоритмов шифрования, используемых с элементом IKEv2 Encrypted и не меняется по сравнению с [RFC4306].

  • Связанные данные (A14), описанные ниже в разделе 5.

                     1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~                 IKE Payloads для шифрования                   ~
+               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
!               !             Padding (0-255 октетов)           !
+-+-+-+-+-+-+-+-+                               +-+-+-+-+-+-+-+-+
!                                               !  Pad Length   !
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 2. IKEv2 Encrypted Payload Plaintext (P)

Элементы данных (поле IKE Payloads) соответствуют [RFC4306].

Поле Padding может содержать любое значение, выбранное отправителем.

Поле Pad Length указывает число октетов в поле Padding. К размеру поля Padding не предъявляется требований по выравниванию, получатели должны воспринимать заполнение размером от 0 до 255 октетов.

Шифрованный выход алгоритма аутентифицированного шифрования, как определено в [RFC5116], включает в себя данные, которые позволяют проверить целостность и подлинность шифрованной информации и связанных с ней данных. В результате не требуется использовать отдельное поле контроля целостности (ICV15) в структуре данных IKEv2 Encrypted.

3.1. Вектор инициализации AES GCM и AES CCM (IV)

Этот параграф основан на параграфах 3.1 из [RFC4106] и 3.1 из [RFC4309]. Требования к векторам инициализации для AES GCM и AES CCM одинаковы и совпадают с требованиями для протокола ESP.

Вектор инициализации (IV) должен иметь 8 октетов. Значение IV должно выбираться шифрующей стороной (encryptor) так, чтобы то или иное значение IV использовалось только один раз для данного ключа. Шифрующий может генерировать IV любым способом, обеспечивающим уникальность значений. Базовые модели генерации IV включают счетчик, инкрементируемый по каждому пакеты и применение линейных регистров сдвига с обратной связью (LFSR16).

3.2. Конструкции Ciphertext (C) для AES GCM и AES CCM

Этот параграф основан на разделе 6 из [RFC4106] и параграфе 3.1 из [RFC4309] с обобщением, соответствующим интерфейсам, описанным в [RFC5116]. Конструкции для алгоритмов AES GCM и AES CCM различаются, но в каждом случае они совпадают с конструкциями для ESP.

Для AES GCM и AES CCM поле Ciphertext содержит выход алгоритма аутентифицированного шифрования (отметим, что это поле включает данные контроля целостности).

Значение AES GCM ICV включает только тег аутентификации AES GCM. Реализации должны поддерживать полноразмерные 16-октетные значения ICV, можно также поддерживать размер 8 или 12 октетов, но недопустимо поддерживать другие размеры ICV.

AES CCM использует шифрованное значение ICV. Реализации должны поддерживать ICV размером 8 и 16 октетов. Возможна также поддержка 12-октетных ICV, но недопустима поддержка других размеров ICV.

4. Формат Nonce (N) для AES GCM и AES CCM

Конкретные алгоритмы аутентифицированного шифрования могут использовать разные форматы одноразовых значений nonce, но им следует по умолчанию применять формат nonce, описанный в этом параграфе.

Принятый по умолчанию формат nonce использует частично неявные значения nonce (см. параграф 3.2.1 [RFC5116]) следующим образом:

  • неявная часть nonce является «затравкой», которая представляет собой часть ключевого материала IKEv2 (Keying Material), известного шифрующей и дешифрующей стороне (см. параграф 7.1), значение затравки не включается в элемент данных IKEv2 Encrypted;

  • явной частью nonce служит вектор инициализации IV, включаемый в элемент IKEv2 Encrypted.

При использовании этого принятого по умолчанию формата nonce шифрующая и дешифрующая сторона создают одноразовое значение nonce путем конкатенации затравки salt с вектором инициализации IV в указанном порядке.

Для использования AES GCM с IKEv2 Encrypted этот принятый по умолчанию формат nonce должен использоваться и должны применяться 12-октетные значения nonce. Отметим, что этот формат соответствует заданному в разделе 4 [RFC4106], что обеспечивает совместимость между применением AES GCM в IKEv2 и ESP. Все требования раздела 4 [RFC4106] применимы к использованию AES GCM с IKEv2 Encrypted.

Для использования AES CCM с IKEv2 Encrypted этот принятый по умолчанию формат nonce должен использоваться и должны применяться 11-октетные значения nonce. Отметим, что этот формат соответствует заданному в разделе 4 [RFC4309], что обеспечивает совместимость между применением AES CCM в IKEv2 и ESP. Все требования раздела 4 [RFC4309] применимы к использованию AES CCM с IKEv2 Encrypted.

5. Связанные данные IKEv2 (A)

Этот раздел основан на разделе 5 [RFC4106] и разделе 5 [RFC4309], оба из которых называют связанные данные AAD17. Описанная в этом разделе конструкция связанных данных применима для всех алгоритмов аутентифицированного шифрования, но отличается от конструкции, применяемой с ESP, поскольку IKEv2 требует другого покрытия данных в части защиты целостности.

5.1. Конструкция Associated Data (A)

                     1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~                 IKE Payloads для шифрования                   ~
+               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
!               !             Padding (0-255 октетов)           !
+-+-+-+-+-+-+-+-+                               +-+-+-+-+-+-+-+-+
!                                               !  Pad Length   !
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рисунок 3. Связанные данные (A) элемента IKEv2 Encrypted для аутентифицированного шифрования.

Связанные данные (A) должны включать часть содержимого сообщения IKEv2, начиная с первого октета фиксированного заголовка IKE и заканчивая последним октетом Payload Header для элементе Encrypted (т. е., четвертым октетом элемента Encrypted), как показано на рисунке 3. Это включает все элементы данных между фиксированным заголовком IKE и элементом Encrypted.

Поля Initialization Vector и Ciphertext, показанные выше на рисунке 1, недопустимо включать в связанные данные.

5.2. Охват данных для контроля целостности

Защита целостности IKEv2 Encrypted включает все сообщение IKEv2, содержащее элемент данных Encrypted. При использовании алгоритма аутентифицированного шифрования с элементом Encrypted охват данных реализуется, как показано ниже.

  1. Связанные данные (A) охватывают часть сообщения IKEv2, начиная с первого октета фиксированного заголовка IKE и заканчивая последним октетом Payload Header элемента Encrypted (четвертый октет Encrypted). Сюда включаются все элементы данных между фиксированным заголовком IKE и элементом Encrypted, который всегда является последним элементом данных в сообщении IKEv2 [RFC4306].

  2. Вектор инициализации IV служит входными данными для проверки целостности в алгоритме аутентифицированного шифрования. Положительный результат проверки целостности на приемной стороне подтверждает использование корректного значения IV, обеспечивая защиту целостности и для самого IV.

  3. Открытые данные (элементы данных IKE, Padding и Pad Length) охватываются проверкой целостности алгоритма аутентифицированного шифрования.

6. Расширение элементов Encrypted для AES GCM и AES CCM

Расширение, описанное в разделе 7 работы [RFC4106] и разделе 6 работы [RFC4309], применимо к использованию комбинированных режимов AES GCM и AES CCM с элементами данных IKEv2 Encrypted. См. раздел 7 в [RFC4106] и раздел 6 в [RFC4309].

7. Соглашения IKEv2 для AES GCM и AES CCM

В этом разделе описаны соглашения, используемые при генерации ключевого материала и значений «затравок» (salt) для алгоритмов AES GCM и AES CCM с протоколом IKEv2 [RFC4306]. Указаны также идентификаторы и атрибуты, требуемые для использования AES GCM и AES CCM с элементами данных IKEv2 Encrypted.

7.1. Ключевой материал и «затравки»

Этот параграф основан на параграфе 8.1 в [RFC4106] и 7.1 в [RFC4309]. Значения Keying Material и Salt для алгоритмов AES GCM и AES CCM различаются, но имеют структуру, совпадающую со структурой этих полей в ESP.

IKEv2 использует псевдослучайную функцию (PRF18) для создания ключевого материала. PRF применяется в режиме итераций для создания ключевого материала произвольного размера, из которого выделяется материал для конкретных целей без учета выходных границ PRF (см. параграф 2.14 в [RFC4306]).

В этом параграфе показано, как процесс создания ключей, описанный в параграфе 2.14 документа [RFC4306], используется при выработке ключевого материала для AES GCM и AES CCM. Когда алгоритм AES GCM или AES CCM используется с элементами данных IKEv2 Encrypted, ключи защиты целостности SK_ai и SK_ar не применяются и каждый из этих ключей должен трактоваться, как значение нулевого размера. Размер ключей шифрования SK_ei и SK_er включает дополнительные байты «затравки» (salt). Размер и формат ключей шифрования SK_ei и SK_er должен соответствовать приведенным ниже требованиям.

  • Для AES GCM каждый ключ шифрования имеет размер и формат материала «KEYMAT requested», указанного в параграфе 8.1 [RFC4106] для размера ключа AES. Например, если ключ AES имеет размер 128 битов, каждый ключ шифрования будет иметь размер 20 октетов, включающих 16-октетный ключ шифрования AES, за которым следует 4 октета затравки.

  • Для AES CCM каждый ключ шифрования имеет размер и формат материала «KEYMAT requested», указанного в параграфе 7.1 [RFC4309] для размера ключа AES. Например, если ключ AES имеет размер 128 битов, каждый ключ шифрования будет иметь размер 19 октетов, включающих 16-октетный ключ шифрования AES, за которым следует 3 октета затравки.

7.2. Идентификаторы преобразований IKEv2

Этот параграф относится только к использованию алгоритмов AES GCM и AES CCM с элементами данных IKEv2 Encrypted. Здесь используются идентификаторы, применяемые для согласования алгоритмов AES GCM и AES CCM в ESP.

Ниже перечислены идентификаторы, выделенные ранее агентством IANA, которые служат для согласования использования в протоколе IKEv2 (т. е., с элементами данных IKEv2 Encrypted) алгоритмов AES GCM и AES CCM в качестве преобразований ENCR:

14 для AES CCM с 8-октетным ICV;

15 для AES CCM с 12-октетным ICV;

16 для AES CCM с 16-октетным ICV;

18 для AES GCM с 8-октетным ICV;

19 для AES GCM с 12-октетным ICV;

20 для AES GCM с 16-октетным ICV.

С IKEv2 следует использовать 16-октетные значения ICV, поскольку больший размер ICV обеспечивает более высокий уровень защиты обмена ключами IKEv2 и связанной с этим обменом функциональности.

В общем случае использовать 12-октетные значения (преобразования 15 и 19) не рекомендуется с целью снижения числа возможных вариантов размера ICV. Если нужен размер ICV больше 8 октетов, следует применять 16-октетные ICV.

7.3. Размер ключа

Этот параграф базируется на параграфе 8.4 в [RFC4106] и параграфе 7.4 в [RFC4309]. Требования к размеру ключа (Key Length) одинаковы для алгоритмов AES GCM и AES CCM и идентичны требованиям для протокола ESP.

Поскольку алгоритм AES поддерживает три размера ключей, атрибут Key Length должен указываться при использовании любого из идентификаторов преобразования для AES GCM или AES CCM, перечисленных в параграфе 7.2. Атрибут Key Length должен иметь значение 128, 192 или 256. Использовать размер ключа 192 не рекомендуется. Если нужен размер ключа AES больше 128 битов, следует применять 256-битовый ключ AES. Это снижает число вариантов размера ключа AES.

8. Выбор алгоритма IKEv2

Этот раздел относится к использованию любых алгоритмов аутентифицированного шифрования с элементами IKEv2 Encrypted и не основан на каких-либо предшествующих документах.

IKEv2 (параграф 3.3.3 в [RFC4306]) указывает, что алгоритмы шифрования и защиты целостности требуются для IKE SA19 (защищенная связь). Этот документ служит обновлением для [RFC4306], указывающим, что при выборе алгоритма аутентифицированного шифрования для любой связи SA (IKE или ESP) недопустимо выбирать для этой SA также механизм защиты целостности. Другое обновление [RFC4306] указывает, что в случаях, когда в предложении указаны только алгоритмы аутентифицированного шифрования, в такое предложение недопустимо включать какие либо преобразования для защиты целостности.

9. Тестовые векторы

В разделе 9 [RFC4106] и разделе 8 [RFC4309] приведены ссылки, указывающие тестовые векторы для AES GCM и AES CCM.

10. Алгоритмы RFC 5116 AEAD_*

Этот параграф добавляет новые алгоритмы в схему AEAD_*, определенную в [RFC5116], позволяя применять AES GCM и AES CCM с IKEv2. Алгоритмы AEAD_* не имеют каких-либо атрибутов или параметров, идентификатор каждого алгоритма AEAD_*, определенный в данном документе, полностью задает размер ключа AES и размер ICV (например, AEAD_AES_128_GCM использует 128-битовый ключ AES и 16-октетное значение ICV).

AEAD_* охватывает алгоритмы аутентифицированного шифрования AES GCM и AES CCM, используемые с IKEv2, и это требует задания 8 дополнительных алгоритмов AEAD_* в дополнение к 4 указанным в [RFC5116]:

  • 4 алгоритма AEAD_* задаются для использования 8- и 12-октетных значений ICV с алгоритмом AES GCM и алгоритмами AEAD_*, указанными в [RFC5116].

  • Версия AES CCM, применяемая с IPsec (см. [RFC4309]), использует 11-октетные значения nonce вместо 12-октетных в версии AES CCM, указанной в [RFC5116]. 6 алгоритмов AEAD_* указаны для этой версии AES CCM с короткими значениями nonce.

Этот документ рекомендует не применять 192-битовые ключи AES и, следовательно, не включает алгоритмов AEAD_* с такими ключами.

10.1. Алгоритмы AES GCM с 8- и 12-октетными ICV

Следующие 4 алгоритма AEAD_* идентичны алгоритмам AEAD_* из [RFC5116], за исключением использования 8-октетных значений ICV вместо 16-октетных.

10.1.1. AEAD_AES_128_GCM_8

Этот алгоритм идентичен AEAD_AES_128_GCM (параграф 5.1 в [RFC5116]), за исключением тега размера (t) со значением 8 и тега аутентификации размером 8 октетов (64 бита).

Шифротекст AEAD_AES_128_GCM_8 в точности на 8 октетов превышает по размеру нешифрованные данные.

10.1.2. AEAD_AES_256_GCM_8

Этот алгоритм идентичен AEAD_AES_256_GCM (параграф 5.2 в [RFC5116]), за исключением тега размера (t) со значением 8 и тега аутентификации размером 8 октетов (64 бита).

Шифротекст AEAD_AES_256_GCM_8 в точности на 8 октетов превышает по размеру нешифрованные данные.

10.1.3. AEAD_AES_128_GCM_12

Этот алгоритм идентичен AEAD_AES_128_GCM (параграф 5.1 в [RFC5116]), за исключением тега размера (t) со значением 12 и тега аутентификации размером 12 октетов (9620 битов).

Шифротекст AEAD_AES_128_GCM_12 в точности на 12 октетов превышает по размеру нешифрованные данные.

10.1.4. AEAD_AES_256_GCM_12

Этот алгоритм идентичен AEAD_AES_256_GCM (параграф 5.2 в [RFC5116], за исключением тега размера (t) со значением 12 и тега аутентификации размером 12 октетов (9621 битов).

Шифротекст AEAD_AES_256_GCM_12 в точности на 12 октетов превышает по размеру нешифрованные данные.

10.2. Алгоритмы AES CCM с 11-октетным Nonce

Следующие 4 алгоритма AEAD реализуют AES CCM с 11-октетным значением nonce, как указано в [RFC4309].

10.2.1. AEAD_AES_128_CCM_SHORT

Алгоритм аутентифицированного шифрования AEAD_AES_128_CCM_SHORT идентичен алгоритму AEAD_AES_128_CCM (см. параграф 5.3 в [RFC5116]), за исключением использования значений nonce на один октет короче. AEAD_AES_128_CCM_SHORT работает в соответствии с [CCM]. Алгоритм использует AES-128 в качестве блочного шифра, обеспечивая для его работы ключ, nonce, связанные данные и открытые данные для шифрования. Форматирование и функция генерации значения счетчика описаны в Приложении A к [CCM], там же указаны значения параметров:

размер nonce — n = 12;

размер тега — t = 16;

q = 3.

Используется тег проверки подлинности размером 16 октетов (128 битов). Шифротекст AEAD_AES_128_CCM_SHORT состоит из шифрованного выхода операции шифрования CCM, объединенного (конкатенация) с выходом тега аутентификации операции шифрования CCM. Тестовые примеры представлены в [CCM]. Размеры входных и выходных данных представлены ниже.

K_LEN — 16 октетов;

P_MAX — 224 — 1 октетов;

A_MAX — 264 — 1 октетов;

N_MIN и N_MAX — по 11 октетов каждое;

C_MAX — 224 + 15 октетов.

Шифротекст AEAD_AES_128_CCM_SHORT в точности на 16 октетов больше соответствующего открытого текста.

10.2.2. AEAD_AES_256_CCM_SHORT

Этот алгоритм идентичен AEAD_AES_128_CCM_SHORT, но имеет пару отличий, показанных ниже:

K_LEN — 32 октета вместо 16;

AES-256 CCM вместо AES-128 CCM.

Шифротекст AEAD_AES_256_CCM_SHORT в точности на 16 октетов больше соответствующего открытого текста.

10.2.3. AEAD_AES_128_CCM_SHORT_8

Этот алгоритм идентичен AEAD_AES_128_CCM_SHORT, отличаясь лишь размером тега проверки подлинности — 8 октетов (64 бита).

Шифротекст AEAD_AES_128_CCM_SHORT_8 в точности на 8 октетов больше соответствующего открытого текста.

10.2.4. AEAD_AES_256_CCM_SHORT_8

Этот алгоритм идентичен AEAD_AES_256_CCM_SHORT, отличаясь лишь размером тега проверки подлинности — 8 октетов (64 бита).

Шифротекст AEAD_AES_256_CCM_SHORT_8 в точности на 8 октетов больше соответствующего открытого текста.

10.2.5. AEAD_AES_128_CCM_SHORT_12

Этот алгоритм идентичен AEAD_AES_128_CCM_SHORT, отличаясь лишь размером тега проверки подлинности — 12 октетов (9622 битов).

Шифротекст AEAD_AES_128_CCM_SHORT_12 в точности на 12 октетов больше соответствующего открытого текста.

10.2.6. AEAD_AES_256_CCM_SHORT_12

Этот алгоритм идентичен AEAD_AES_256_CCM_SHORT, отличаясь лишь размером тега проверки подлинности — 12 октетов (9623 битов).

Шифротекст AEAD_AES_256_CCM_SHORT_12 в точности на 12 октетов больше соответствующего открытого текста.

10.3. Алгоритмы AEAD_* и IKEv2

В таблице перечислены алгоритмы AEAD_* AES CCM и AES GCM, которые могут быть согласованы для IKEv2, с указанием идентификаторов преобразования (IKEv2 Encryption (ENCR) Transform Identifier) и размеров ключей (Key Length Attribute), которые применяются при согласовании каждого алгоритма.

Алгоритм AEAD

Идентификатор ENCR

Размер ключа

AEAD_AES_128_GCM

20

128

AEAD_AES_256_GCM

20

256

AEAD_AES_128_GCM_8

18

128

AEAD_AES_256_GCM_8

18

256

AEAD_AES_128_GCM_12

19

128

AEAD_AES_256_GCM_12

19

256

AEAD_AES_128_CCM_SHORT

16

128

AEAD_AES_256_CCM_SHORT

16

256

AEAD_AES_128_CCM_SHORT_8

14

128

AEAD_AES_256_CCM_SHORT_8

14

256

AEAD_AES_128_CCM_SHORT_12

15

128

AEAD_AES_256_CCM_SHORT_12

15

256

Каждый из перечисленных алгоритмов AEAD_* идентичен алгоритму, обозначаемому комбинацией IKEv2 ENCR Identifier и Key Length Attribute, показанной в той же строке таблицы.

11. Вопросы безопасности

Вопросы безопасности, связанные с аутентифицированным шифрованием, рассмотрены в [RFC5116] (см. весь документ, а не только раздел «Вопросы безопасности», поскольку некоторые важные аспекты безопасности рассматриваются за пределами этого раздела).

Вопросы безопасности, связанные с использованием AES GCM и AES CCM с протоколом ESP, применимы и использования этих алгоритмов с IKEv2 Encrypted, как описано в разделе 10 [RFC4106] и разделе 9 [RFC4309]. Применение AES GCM и AES CCM с протоколом IKEv2 не создает дополнительных проблем безопасности по сравнению с известными для случая работы AES GCM и AES CCM с протоколом ESP.

Вопросы безопасности IKEv2 рассмотрены в разделе 5 [RFC4306].

12. Взаимодействие с IANA

Идентификаторы преобразований (Encryption Transform), указанные в параграфе 7.2 были выделены IANA для использования с протоколом ESP. Данный документ расширяет их применение на IKEv2 для элементов данных Encrypted. Для такого расширения не требуется каких-либо действий IANA.

Агентство IANA добавило перечисленные в таблице значения в реестр Authenticated Encryption with Associated Data (AEAD) Parameters.

Алгоритм AEAD

Параграф

Идентификатор

AEAD_AES_128_GCM_8

10.1.1

5

AEAD_AES_256_GCM_8

10.1.2

6

AEAD_AES_128_GCM_12

10.1.3

7

AEAD_AES_256_GCM_12

10.1.4

8

AEAD_AES_128_CCM_SHORT

10.1.1

9

AEAD_AES_256_CCM_SHORT

10.1.2

10

AEAD_AES_128_CCM_SHORT_8

10.1.3

11

AEAD_AES_256_CCM_SHORT_8

10.1.4

12

AEAD_AES_128_CCM_SHORT_12

10.1.5

13

AEAD_AES_256_CCM_SHORT_12

10.1.6

14

Регистрация агентством IANA алгоритма AEAD не означает одобрения этого алгоритма или его защищенности.

13. Благодарности

Благодарности за AES GCM и AES CCM приведены в разделе [RFC4106] и разделе 12 [RFC4309].

Благодарим Charlie Kaufman, Pasi Eronen, Tero Kivinen, Steve Kent и Alfred Hoenes за внимательное рецензирование этого документа.

Документ подготовлен с использованием шаблона 2-Word-v2.0.template.dot, автором которого является Joe Touch.

14. Литература

14.1. Нормативные документы

[CCM] Dworkin, M., «NIST Special Publication 800-38C: The CCM Mode for Authentication and Confidentiality», U.S. National Institute of Standards and Technology, <http://csrc.nist.gov/publications/nistpubs/800-38C/SP800-38C.pdf>24, updated July 2007.

[GCM] Dworkin, M., «NIST Special Publication 800-38D: Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC.», U.S. National Institute of Standards and Technology, November 2007, <http://csrc.nist.gov/publications/nistpubs/800-38D/SP-800-38D.pdf>25, November 2007.

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, March 1997.

[RFC4106] Viega, J. and D. McGrew, «The Use of Galois/Counter Mode (GCM) in IPsec Encapsulating Security Payload (ESP)», RFC 4106, June 2005.

[RFC4303] Kent, S., «IP Encapsulating Security Payload (ESP)», RFC 4303, December 2005.

[RFC4306] Kaufman, C., Ed., «Internet Key Exchange (IKEv2) Protocol», RFC 4306, December 2005.

[RFC4309] Housley, R., «Using Advanced Encryption Standard (AES) CCM Mode with IPsec Encapsulating Security Payload (ESP)», RFC 4309, December 2005.

[RFC5116] McGrew, D., «An Interface and Algorithms for Authenticated Encryption», RFC 5116, January 2008.

14.2. Дополнительная литература

[RFC2406] Kent, S. and R. Atkinson, «IP Encapsulating Security Payload (ESP)», RFC 2406, November 1998.

[RFC2408] Maughan, D., Schertler, M., Schneider, M., and J. Turner, «Internet Security Association and Key Management Protocol (ISAKMP)», RFC 2408, November 1998.

[RFC2409] Harkins, D. and D. Carrel, «The Internet Key Exchange (IKE)», RFC 2409, November 1998.


Адреса авторов

David L. Black

EMC Corporation

176 South Street

Hopkinton, MA 10748

Phone: +1 (508) 293-7953

EMail: black_david@emc.com

David A. McGrew

Cisco Systems, Inc.

510 McCarthy Blvd.

Milpitas, CA 95035

Phone: +1 (408) 525-8651

EMail: mcgrew@cisco.com


Перевод на русский язык

Николай Малых

nmalykh@gmail.com


Полное заявление авторских прав

Copyright (C) The IETF Trust (2008).

К этому документу применимы права, лицензии и ограничения, указанные в BCP 78, и, за исключением указанного там, авторы сохраняют свои права.

Этот документ и содержащаяся в нем информация представлены «как есть» и автор, организация, которую он/она представляет или которая выступает спонсором (если таковой имеется), Internet Society и IETF отказываются от каких-либо гарантий (явных или подразумеваемых), включая (но не ограничиваясь) любые гарантии того, что использование представленной здесь информации не будет нарушать чьих-либо прав, и любые предполагаемые гарантии коммерческого использования или применимости для тех или иных задач.

Интеллектуальная собственность

IETF не принимает какой-либо позиции в отношении действительности или объема каких-либо прав интеллектуальной собственности (Intellectual Property Rights или IPR) или иных прав, которые, как может быть заявлено, относятся к реализации или использованию описанной в этом документе технологии, или степени, в которой любая лицензия, по которой права могут или не могут быть доступны, не заявляется также применение каких-либо усилий для определения таких прав. Сведения о процедурах IETF в отношении прав в документах RFC можно найти в BCP 78 и BCP 79.

Копии раскрытия IPR, предоставленные секретариату IETF, и любые гарантии доступности лицензий, а также результаты попыток получить общую лицензию или право на использование таких прав собственности разработчиками или пользователями этой спецификации, можно получить из сетевого репозитория IETF IPR по ссылке http://www.ietf.org/ipr.

IETF предлагает любой заинтересованной стороне обратить внимание на авторские права, патенты или использование патентов, а также иные права собственности, которые могут потребоваться для реализации этого стандарта. Информацию следует направлять в IETF по адресу ietf-ipr@ietf.org.


1Internet Key Exchange version 2 — протокол обмена ключами в Internet версии 2.

2Advanced Encryption Standard.

3Galois/Counter Mode.

4Counter with CBC-MAC Mode.

5Integrity Check Value — значение для проверки целостности.

6Authenticated Encryption with Associated Data — аутентифицированное шифрование со связанными данными.

7Internet Key Exchange version 2 — протокол обмена ключами в Internet версии 2

8Internet Security Association and Key Management Protocol – протокол защищенных связей и обмена ключами.

9Encapsulating Security Payload — инкапсулированные защищенные элементы.

10Integrity Check Value.

11Initialization Vector.

12Ciphertext.

13Plaintext.

14Associated data.

15Integrity Check Value — код контроля целостности.

16Linear feedback shift register — линейный регистр сдвига с обратной связью.

17Additional Authenticated Data — дополнительные аутентифицированные данные.

18Pseudo-Random Function.

19Security Association.

20В оригинале ошибочно сказано 64. См. https://www.rfc-editor.org/errata_search.php?eid=3605. Прим. перев.

21В оригинале ошибочно сказано 64. См. https://www.rfc-editor.org/errata_search.php?eid=3606. Прим. перев.

22В оригинале ошибочно сказано 64 бита. См. https://www.rfc-editor.org/errata_search.php?eid=3605. Прим. перев.

23В оригинале ошибочно сказано 8 октетов (64 бита). См. https://www.rfc-editor.org/errata_search.php?eid=3606. Прим. перев.

24Приведенная ссылка устарела. Документ доступен здесь. Прим. перев.

25Приведенная ссылка устарела. Документ доступен здесь. Прим. перев.

Рубрика: RFC | Комментарии к записи RFC 5282 Using Authenticated Encryption Algorithms with the Encrypted Payload of the Internet Key Exchange version 2 (IKEv2) Protocol отключены

RFC 5246 The Transport Layer Security (TLS) Protocol Version 1.2

Network Working Group                                          T. Dierks
Request for Comments: 5246                                   Independent
Obsoletes: 3268, 4346, 4366                                  E. Rescorla
Updates: 4492                                                 RTFM, Inc.
Category: Standards Track                                    August 2008

 

Протокол TLS версии 1.2

The Transport Layer Security (TLS) Protocol Version 1.2

PDF

Статус документа

В этом документе описан предлагаемый стандарт протокола для сообщества Internet; документ служит приглашением к дискуссии в целях развития протокола. Информацию о текущем состоянии стандартизации протокола можно найти в документе Internet Official Protocol Standards (STD 1). Данный документ может распространяться свободно.

Аннотация

Этот документ содержит спецификацию версии 1.2 протокола TLS1, который обеспечивает защиту коммуникаций через Internet. Протокол обеспечивает приложениям «клиент-сервер» способ обмена данными, предотвращающий перехват, фальсификацию и подмену сообщений.

1. Введение

Основной задачей протокола TLS является обеспечение конфиденциальности и целостности данных, передаваемых между двумя коммуникационными приложениями. Протокол включает два уровня: TLS Record Protocol и TLS Handshake Protocol. Нижний уровень, расположенный поверх того или иного транспортного протокола с гарантированной доставкой (например, TCP [TCP]), называется протоколом TLS Record. Этот протокол обеспечивает безопасность соединений и обладает двумя основными свойствами.

  • Конфиденциальность соединения. Для шифрования данных используется симметричная схема (например, AES [AES], RC4 [SCH] и т. п.). Уникальные ключи для симметричного шифрования генерируются для каждого соединения на основе секретного ключа, согласованного с помощью другого протокола (например, TLS Handshake). Протокол Record может использоваться и без шифрования.

  • Надежность соединения. Транспортировка сообщений включает проверку целостности с использованием кодов MAC на основе ключей. Для расчета MAC используются защитные хэш-функции (например, SHA-1 и т. п.). Протокол Record может работать без MAC, но такой режим обычно применяется только при использовании протокола Record в качестве транспорта для согласования параметров безопасности.

Протокол TLS Record служит для инкапсуляции различных протоколов вышележащего уровня. Одним из таких протоколов является TLS Handshake Protocol, который позволяет серверу и клиенту выполнить аутентификацию другой стороны и согласовать алгоритм шифрования и ключи до того, как протокол прикладного уровня начнет передачу или прием первого байта данных. Протокол TLS Handshake обеспечивает безопасные соединения, которые обладают тремя основными свойствами, перечисленными ниже.

  • Идентификация и аутентификация партнера может проводиться с использованием асимметричных (открытых) ключей (например, RSA [RSA], DSA [DSS] и т. п). Такая проверка подлинности не является обязательной, но в общем случае требуется по крайней мере на одной стороне.

  • Процесс согласования общего секрета защищен – согласованный ключ недоступен для прослушивания и получить ключ для любого аутентифицированного соединения невозможно, даже если атакующий может перехватывать проходящие через соединение пакеты.

  • Процесс согласования надежен – атакующий не может повлиять на этот процесс, не будучи обнаруженным участниками соединения.

Преимуществом TLS является независимость от протоколов прикладных уровней. Для протоколов вышележащих уровней TLS обеспечивает полную прозрачность. Стандарт TLS не задает способ использования TLS другими протоколами — решение о процедуре согласования TLS и интерпретации обмена сертификатами аутентификации принимают разработчики протоколов, работающих на основе TLS.

1.1. Уровни требований

Ключевые слова необходимо (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не следует (SHALL NOT), следует (SHOULD), не нужно (SHOULD NOT), рекомендуется (RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе интерпретируются в соответствии с [REQ].

1.2. Основные отличия от TLS 1.1

Этот документ является пересмотром спецификации TLS 1.1 [TLS1.1], обеспечивающим повышение уровня гибкости, прежде всего при согласовании криптографических алгоритмов. Основные отличия нового протокола приведены ниже:

  • комбинация MD5/SHA-1 в псевдослучайной функции (PRF1) заменена PRF, определяемыми выбранным шифронабором (все определенные в этом документе шифронаборы используют функцию P_SHA256);

  • комбинация MD5/SHA-1 в элементах с цифровой подписью заменена одним хэш-значением и подписанные элементы включают поле, явно указывающее используемый алгоритм хэширования;

  • существенно упрощена для клиентов и серверов возможность задания алгоритмов подписи и хэширования, которые они будут воспринимать, что также смягчило требования к алгоритмам подписи и хэширования, принятые в прежних версиях TLS;

  • добавлена поддержка аутентифицированного шифрования с дополнительными режимами;

  • добавлены определения расширений TLS и шифронаборов AES, заимствованные из [TLSEXT] и [TLSAES];

  • усилена проверка номера версии EncryptedPreMasterSecret;

  • увеличено число требований;

  • размер verify_data стал зависеть от шифронабора (по умолчанию сохраняется значение 12);

  • уточнено описание опасности атак Bleichenbacher/Klima;

  • во многих случаях должны передаваться сигналы;

  • если после certificate_request нет доступных сертификатов, клиент должен передавать пустой список сертификатов;

  • шифронабор TLS_RSA_WITH_AES_128_CBC_SHA стал обязательным для реализации;

  • добавлены шифронаборы HMAC-SHA256;

  • удалены шифронаборы IDEA и DES (они сочтены устаревшими и будут описаны в отдельном документе);

  • поддержка совместимых с SSLv2 сообщений hello может быть реализована (ранее ее следовало реализовать), передавать такие сообщения не следует (в будущем может быть принято решение о том, что поддерживать такие сообщения не следует);

  • в язык представления добавлены «проходные» варианты (limited «fall-through»), позволяющие использовать общий код для множества вариантов;

  • добавлено Приложение D.4. «Подводные камни» реализации;

  • обычные разъяснения и редакторские правки.

2. Назначение протокола

Основные цели протокола TLS (в порядке снижения важности) перечислены ниже.

  1. Криптографическая защита – протокол TLS следует использовать для организации защищенных соединений между парами точек.

  2. Интероперабельность – независимые разработчики программ должны иметь возможность создания использующих TLS приложений, которые смогут обмениваться параметрами шифрования с другими подобными приложениями, не зная ничего об их программном коде.

  3. Расширяемость – протокол TLS предназначен стать базой, к которой могут добавляться новые методы шифрования и работы с открытыми ключами. Это позволит избавиться от необходимости разработки новых протоколов (риск добавления новых уязвимостей) и создания новых библиотек функций обеспечения безопасности.

  4. Эффективность — криптография требует больших вычислительных ресурсов, в частности, для операций с открытыми ключами. По этой причине протокол TLS включает дополнительную схему кэширования сессий, снижающую число организуемых с нуля соединений. В дополнение к этому приняты меры по снижению уровня служебного сетевого трафика.

3. Назначение документа

Протокол TLS и описанная в данном документе спецификация этого протокола основаны на спецификации протокола SSL 3.0, опубликованной компанией Netscape. Различия между SSL 3.0 и TLS не критичны, но достаточно существенны — версии TLS и SSL 3.0 не могут взаимодействовать между собой (хотя каждый включает механизм совместимости с предыдущими версиями). Данный документ адресован прежде всего читателям, планирующим реализовать протокол или выполняющим его криптографический анализ. Спецификация протокола написана с учетом требований этих двух групп. По этой причине многие зависящие от алгоритма структуры данных и правила включены в текст документа (а не в приложения), чтобы упростить доступ к информации об этих структурах и правилах.

Документ не содержит детальных определений служб или интерфейсов, хотя в нем рассматриваются отдельные сферы политики, требуемые для обеспечения высокого уровня безопасности.

4. Язык представления

Этот документ имеет дело с форматированием данных для внешнего представления. В документе используется очень простой синтаксис, похожий на синтаксис языка программирования C и синтаксис XDR [XDR]. Используемый в документе язык представления предназначен только для TLS и не имеет применения за пределами этого стандарта.

4.1. Размер базового блока

Представление всех элементов данных описано в явной форме. Базовый блок данных имеет размер 1 байт (8 битов). Многобайтовые элементы данных объединяются (конкатенация) слева направо и сверху вниз. Из байтового потока многобайтовый элемент (например, число) формируется следующим образом (используется нотация языка C):

значение = (байт[0] << 8*(n-1)) | (байт[1] << 8*(n-2)) | ... | байт[n-1];

Для многобайтовых значений используется сетевой порядок следования байтов2.

4.2. Различные элементы

Текст комментария начинается с символов /* и заканчивается символами */.

Необязательные компоненты заключены в двойные квадратные скобки [[ ]].

Однобайтовые элементы, содержащие неинтерпретируемые данные, имеют тип opaque3.

4.3. Векторы

Вектор (одномерный массив) представляет собой поток однородных элементов данных. Размер вектора может быть указан в документации или согласован во время работы. В любом случае размер задается в байтах, а не числом элементов вектора. Синтаксис задания нового типа T’, который относится к векторам фиксированного размера типа T имеет вид

T T'[n];

Вектор T’ занимает n байтов в потоке данных, где значение n кратно размеру T. Размер вектора не включается в кодированный поток данных.

В приведенном ниже примере Datum определяется как три последовательных байта, которые протокол не интерпретирует, а Data – три последовательных элемента Datum, занимающих в общей сложности 9 байтов.

    opaque Datum[3];      /* три неинтерпретируемых байта */
    Datum Data[9];        /* 3 последовательных 3-байтовых вектора */

Векторы переменной длины определяются с указанием допустимого диапазона размеров (включая крайние значения) в форме <floor..ceiling>. При кодировании в поток данных перед самим вектором помещается его реальный размер. Размер задается в форме числа, занимающего столько байтов, сколько требуется для хранения максимального (ceiling) размера вектора. Вектор переменной длины, имеющий нулевой размер, указывается как пустой вектор.

    T T'<floor..ceiling>;

В приведенном ниже примере mandatory представляет собой вектор типа opaque размером от 300 до 400 байтов. Такой вектор никогда не может быть пустым. Поле размера занимает два байта (uint16), что достаточно для записи максимальной длины вектора 400 (см. параграф 4.4). Вектор longer может представлять до 800 байтов данных или до 400 элементов uint16 и может быть пустым. Кодирование вектора включает двухбайтовое поле размера, предшествующее вектору. Размер кодированного вектора должен быть кратным размеру одного элемента (например, значение 17 для вектора uint16 будет некорректным).

  opaque mandatory<300..400>; /* поле размера занимает 2 байта, вектор не может быть пустым */
  uint16 longer<0..800>;      /* от 0 до 400 16-битовых беззнаковых целых чисел */

4.4. Числа

Базовым числовым элементов является беззнаковый байт uint8. Все остальные типы чисел формируются из базового типа путем описанной в параграфе 4.1 конкатенации фиксированного числа байтов. Ниже перечислены предопределенные типы чисел.

    uint8 uint16[2];
    uint8 uint24[3];
    uint8 uint32[4];
    uint8 uint64[8];

Все числовые значения, используемые в данной спецификации, сохраняются в так называемом сетевом порядке байтов; число uint32, представленное в шестнадцатеричном формате 01 02 03 04, эквивалентно десятичному значению 16909060.

Отметим, что в некоторых случаях (например, параметры DH) требуется использование целых чисел в качестве opaque-векторов. Для этого они представляются целыми числами без знака (т. е., ведущие октеты с нулевыми значениями не требуются, даже в тех случаях, когда старший бит установлен).

4.5. Перечисляемые значения

Используется также дополнительный тип данных – перечисляемые значения или enum. Поле типа enum допускает только значения, заданные при определении этого типа. Каждое определение задает новый перечисляемый тип. В операциях присваивания и сравнения могут использоваться только однотипные перечисляемые значения. Каждому элементу перечисляемого типа должно быть присвоено значение, как показано в приведенном ниже примере. Поскольку элементы перечисляемого типа не упорядочены, каждый элемент должен иметь уникальное значение.

    enum { e1(v1), e2(v2), ... , en(vn) [[, (n)]] } Te;

Перечисляемые значения занимают в потоке байтов столько места, сколько нужно для записи значения самого большого элемента данного перечисляемого типа. Элементы определенного ниже перечисляемого типа Color будут занимать в потоке по 1 байту.

    enum { red(3), blue(5), white(7) } Color;

Можно задать значение без связанного с ним тега для расширения размера типа без создания ненужных элементов. В приведенном ниже определении задается тип Taste, элементы которого занимают в потоке по 2 байта и могут принимать только значения только 1, 2 или 4.

    enum { sweet(1), sour(2), bitter(4), (32000) } Taste;

Имена элементов перечисляемого типа доступны только в контексте данного типа. В первом примере полная ссылка на второй элемент типа Color будет иметь вид Color.blue. Полная форма представления не требуется, если целью присваивания является полностью определенный элемент.

    Color color = Color.blue;     /* полная спецификация – корректно всегда */
    Color color = blue;           /* корректно при заданном неявно типе */

Для перечисляемых типов, которые никогда не преобразуются для внешнего представления, числовые значения можно опустить

    enum { low, medium, high } Amount;

4.6. Структурированные типы

Из примитивов могут создаваться структурированные типы. Каждая спецификация структурированного типа задает новый уникальный тип. Синтаксис описания идентичен синтаксису структур языка C.

    struct {
        T1 f1;
        T2 f2;
        ...
        Tn fn;
    } [[T]];

Поля структуры можно указывать с использованием идентификатора типа, как для перечисляемых значений. Например, T.f2 будет указывать на второе поле определенного выше структурированного типа. Определения структурированных типов могут быть вложенными.

4.6.1. Варианты

Определяемая структура может содержать варианты, выбор между которыми основывается на доступной в среде информации. Селектор вариантов должен относиться к перечисляемому типу, включающему возможные варианты, объявленные в операторе select. Варианты могут быть «проходными» (limited fall-through) — если два варианта непосредственно следуют друг за другом (между ними нет других полей), оба варианта будут содержать одинаковые поля. В приведенном ниже примере варианты orange и banana содержат V2. Отметим, что такой синтаксис введен только в TLS 1.2.

Каждый вариант структуры может иметь метку, используемую для ссылок на этот вариант. Механизм выбора варианта во время работы не описывается языком представления.

      struct {
          T1 f1;
          T2 f2;
          ....
          Tn fn;
           select (E) {
               case e1: Te1;
               case e2: Te2;
               case e3: case e4: Te3;
               ....
               case en: Ten;
           } [[fv]];
      } [[Tv]];

Например,

       enum { apple, orange } VariantTag;

       struct {
           uint16 number;
           opaque string<0..10>; /* переменный размер */
       } V1;
       struct {
           uint32 number;
           opaque string[10];    /* фиксированный размер */
       } V2;
       struct {
           select (VariantTag) { /* значение селектора задано неявно     */
               case apple: V1;   /* VariantBody, tag = apple             */
               case orange: 
               case banana: 
                 V2;             /* VariantBody, tag = orange или banana */
           } variant_body;       /* необязательная метка варианта        */
       } VariantRecord;

4.7. Криптографические атрибуты

Пять вариантов криптографических операций – цифровая подпись (digital signing), потоковое шифрование (stream cipher encryption), блочное шифрование (block cipher encryption), аутентифицированное шифрование с шифрованием дополнительных данных (AEAD4) и шифрование с открытым ключом (public key encryption) обозначаются ключевыми словами digitally-signed, stream-ciphered, block-ciphered, aead-ciphered и public-key-encrypted, соответственно. Поля с криптографической обработкой указываются с предшествующим типу поля ключевым словом, задающим криптографическую операцию. Ключи шифрования определяются текущим состоянием сессии (см. параграф 6.1).

Элемент с цифровой подписью представляется в форме структуры DigitallySigned

      struct {
         SignatureAndHashAlgorithm algorithm;
         opaque signature<0..2^16-1>;
      } DigitallySigned;

Поле algorithm указывает использованный алгоритм (см. определение этого поля в параграфе 7.4.1.4.1). Отметим, что этого поля не было в предыдущих версиях протокола. Поле signature содержит цифровую подпись, полученную с использованием указанного алгоритма применительно к содержимому элемента. Размер поля signature определяется алгоритмом подписи и ключом.

При использовании RSA-подписей opaque-вектор содержит подпись, созданную с использованием схемы RSASSA-PKCS1-v1_5, определенной в [PKCS1]. Как указано в [PKCS1], для DigestInfo должно использоваться представление DER [X680] [X690]. Для алгоритмов хэширования без параметров (к которым относится SHA-1) поле DigestInfo.AlgorithmIdentifier.parameters должно иметь значение NULL, но реализации должны воспринимать как это значение, так и просто отсутствие параметров. Отметим, что в ранних версиях TLS использовалась другая схема для подписей RSA, которая не включала кодирования DigestInfo.

В DSA 20-байтовое хэш-значение SHA-1 создается напрямую с использованием алгоритма DSA5 без дополнительного хэширования (в результате создаются два значения — r и s). Сигнатура DSA представляет собой opaque-вектор, как сказано выше, содержимое которого является DER-представлением структуры

      Dss-Sig-Value ::= SEQUENCE {
          r INTEGER,
          s INTEGER
      }

Примечание. В современной терминологии аббревиатура DSA обозначает Digital Signature Algorithm, а DSS — стандарт NIST. В исходных спецификациях SSL и TLS для обоих случаев применяется обозначение DSS, а в данном документе DSA указывает алгоритм, а DSS — стандарт. Обозначение DSS в определениях сохраняется лишь в целях преемственности.

При потоковом шифровании к тексту применяется операция XOR6 по отношению к идентичному количеству псевдослучайных чисел, порождаемому криптостойким генератором.

В блочном режиме каждый блок текста преобразуется в шифрованный блок, который создается в режиме CBC7. Все элементы шифрованного потока имеют размер, кратный размеру шифрованного блока.

В режиме AEAD для исходного текста используется сразу шифрование и защита целостности. Входные данные могут иметь любой размер, а зашифрованный выход обычно превышает размер входных данных в результате добавления данных контроля целостности.

При шифровании с открытым ключом используется алгоритм, шифрующий данные таким образом, что их можно расшифровать только с использованием соответствующего секретного ключа. Шифрованные элементы представляется, как opaque-векторы <0..216-1>, размер которых определяется алгоритмом шифрования и ключом.

В режиме RSA шифрование выполняется с использованием схемы RSAES-PKCS1-v1_5, определенной в [PKCS1].

В приведенном ниже примере

      stream-ciphered struct {
          uint8 field1;
          uint8 field2;
          digitally-signed opaque {
            uint8 field3<0..255>;
            uint8 field4;
          };
      } UserType;

содержимое внутренней структуры (поля field3 и field4) служит в качестве входной информации для алгоритма цифровой подписи/хэширования, а структура в целом кодируется с использованием потокового шифрования. Размер этой структуры будет равен сумме размеров полей field1 и field2 (2 байта), поля алгоритма хеширования и подписи (2 байта), поля размера подписи (2 байта) и самой цифровой подписи. Это значение можно вычислить, поскольку алгоритм и ключ, используемые для цифровой подписи, известны до кодирования или декодирования этой структуры.

4.8. Константы

Для целей спецификации путем декларирования символа желаемого типа и присваивания ему значения могут использоваться типизованные константы. Предопределенные типы (opaque, векторы переменной длины и структуры, содержащие тип opaque) не могут использоваться в качестве присваиваемых константам значений. Поля многоэлементной структуры или вектора не могут быть пропущены.

Например,

       struct {
           uint8 f1;
           uint8 f2;
       } Example1;

       Example1 ex1 = {1, 4};  /* присваивание f1 = 1, f2 = 4 */

5. HMAC и псевдослучайная функция

Для многих операций уровней TLS Record и TLS Handshake требуется код MAC8, позволяющий защитить целостность сообщений, – сигнатура неких данных, защищенная ключом. Определенные в этом документе шифронаборы используют конструкцию, известную, как HMAC [HMAC], работающую на основе хэш-функции. Другие шифронаборы при необходимости могут определять свои конструкции MAC.

Кроме того, требуется конструкция для преобразования секретов в блоки данных для генерации или проверки пригодности ключей. Такая псевдослучайная функция PRF принимает на входе секрет, затравку (seed) и идентифицирующую метку, выдавая результат произвольного размера.

В этом разделе мы определяем PRF на основе HMAC. Эта PRF с хэш-функцией SHA-256 применяется для всех шифронаборов, определенных в этом документе и документах TLS, выпущенных во время согласования TLS 1.2. Новые шифронаборы должны явно указывать PRF и в общем случае следует применять TLS PRF с SHA-256 или более сильной стандартной функцией.

Определим сначала функцию преобразования данных P_hash(secret, data), которая использует одну хэш-функцию для создания на базе секрета и затравки блока данных произвольного размера:

      P_hash(secret, seed) = HMAC_hash(secret, A(1) + seed) +
                             HMAC_hash(secret, A(2) + seed) +
                             HMAC_hash(secret, A(3) + seed) + ...

где знак + означает конкатенацию.

Значения A() определяются следующим образом

       A(0) = seed
       A(i) = HMAC_hash(secret, A(i-1))

Функция P_hash может итеративно применяться столько раз, сколько потребуется для генерации нужного объема данных. Например, если будет применяться функция P_SHA256, для создания 80 байтов данных ее можно вызвать 3 раза (до A(3)), что даст 96 байтов на выходе и последние 16 байтов финальной итерации отбросить для создания выходного блока размером 80 байтов.

TLS PRF создается путем применения P_hash к секрету, как показано ниже

      PRF(secret, label, seed) = P_<hash>(secret, label + seed)

Метка представляет собой строку символов ASCII. Ее следует включать в неизменном виде без байта размера или завершающего null-символа. Например, метка slithy toves будет при хэшировании использоваться, как последовательность байтов:

    73 6C 69 74 68 79 20 74 6F 76 65 73

6. Протокол TLS Record

Протокол TLS Record включает несколько уровней. На каждом уровне сообщение может включать поля размера, описания и содержимого. Протокол Record принимает сообщения для передачи, фрагментирует данные в блоки нужного размера с возможным их сжатием, применяет MAC, шифрует и передает результат. Принятые данные расшифровываются, проверяются9, декомпрессируются (при необходимости) и собираются заново из фрагментов, после чего передаются клиенту на вышележащий уровень.

В этом документе описаны 4 клиента данного протокола — протокол согласования (handshake), протокол сигнализации (alert), протокол смены шифра (change cipher spec) и прикладной протокол (application data). Для поддержки расширений TLS протоколом Record могут поддерживаться дополнительные типы записей. Значения для новых типов выделяются агентством IANA в реестре Content Type Registry, как описано в разделе 12.

Реализациям недопустимо передавать записи типов, не определенных в этом документе, если не было согласовано то или иное расширение. Если реализация TLS получает запись неизвестного типа, она должна возвращать в ответ сигнал unexpected_message.

Любой протокол, предназначенный для работы на основе TLS, должен разрабатываться с учетом возможных атак на него. На практике это означает, что разработчики таких протоколов должны принимать во внимание, какие свойства защиты протокол TLS обеспечивает и не обеспечивает (и на них нельзя полагаться).

Отметим, что поля типа и размера записи не защищены с помощью шифрования. Если сама эта информация является конфиденциальной, разработчики приложения могут принять те или иные меры (заполнение, зашумление трафика) для минимизации утечек.

6.1. Состояния соединений

Состояние соединения TLS представляет собой рабочую среду протокола TLS Record. Оно задает алгоритмы сжатия, шифрования и MAC. Кроме того, известны параметры этих алгоритмов — секрет MAC и ключи шифрования больших объемов данных для соединения в направлениях чтения и записи. Логически всегда присутствуют 4 состояния — текущие состояния для чтения и записи, а также состояния для ожидаемых чтения и записи. Все записи (record) обрабатываются в текущих состояниях чтения и записи. Параметры безопасности для ожидающих состояний могут устанавливаться протоколом TLS Handshake, а Change Cipher Spec может избирательно переводить ожидающее состояние в текущее (в этом случае текущее состояние удаляется и заменяется ожидающим, а новое ожидающее состояние инициализируется пустым). Недопустимо делать текущим состояние, которое не было инициализировано с параметрами защиты. Изначальное текущее состояние всегда задает отсутствие шифрования, компрессии и MAC.

Параметры защиты для состояний чтения и записи TLS Connection задаются приведенными ниже значениями.

connection end — конечная точка

Показывает, является ли данная точка «клиентом» или «сервером» в этом соединении.

PRF algorithm — алгоритм псевдослучайной функции

Алгоритм, используемый для генерации ключей из первичного секрета (см. раздел 5 и параграф 6.3).

bulk encryption algorithm — алгоритм шифрования больших объемов данных

Алгоритм, который будет использоваться для шифрования основного объема данных. Данная спецификация включает размер ключа для этого алгоритма, тип шифра (блочный, потоковый или AEAD), размер блока (для блочных шифров) и размеры явных или неявных векторов инициализации (или nonce).

MAC algorithm — алгоритм MAC

Алгоритм, используемый для аутентификации сообщений. Данная спецификация включает размер хэш-значения, возвращаемого алгоритмом MAC.

compression algorithm — алгоритм сжатия

Алгоритм, используемый для сжатия данных. Спецификация должна включать всю информацию, требуемую для сжатия.

master secret — первичный секрет

48-байтовое секретное значение, известное обеим сторонам соединения.

client random — случайное значение клиента

32-битовое случайное число, предоставляемое клиентом.

server random — случайное значение сервера

32-битовое случайное число, предоставляемое сервером.

Эти параметры определяются на языке представления следующим образом:

      enum { server, client } ConnectionEnd;
      enum { tls_prf_sha256 } PRFAlgorithm;
      enum { null, rc4, 3des, aes } BulkCipherAlgorithm;
      enum { stream, block, aead } CipherType;
      enum { null, hmac_md5, hmac_sha1, hmac_sha256, hmac_sha384, hmac_sha512} MACAlgorithm;
      enum { null(0), (255) } CompressionMethod;
      /* Могут быть добавлены алгоритмы, указанные в CompressionMethod, PRFAlgorithm,
         BulkCipherAlgorithm и MACAlgorithm. */

      struct {
          ConnectionEnd          entity;
          PRFAlgorithm           prf_algorithm;
          BulkCipherAlgorithm    bulk_cipher_algorithm;
          CipherType             cipher_type;
          uint8                  enc_key_length;
          uint8                  block_length;
          uint8                  fixed_iv_length;
          uint8                  record_iv_length;
          MACAlgorithm           mac_algorithm;
          uint8                  mac_length;
          uint8                  mac_key_length;
          CompressionMethod      compression_algorithm;
          opaque                 master_secret[48];
          opaque                 client_random[32];
          opaque                 server_random[32];
      } SecurityParameters;

Уровень записей будет использовать параметры безопасности для генерации перечисленных ниже 6 элементов (некоторые элементы используются не всеми шифрами и могут быть пустыми).

      client write MAC key
      server write MAC key
      client write encryption key
      server write encryption key
      client write IV
      server write IV

Клиентские параметры записи используются сервером при получении и обработке записей, а серверные используются клиентом. Алгоритм генерации указанных элементов из параметров защиты описан в параграфе 6.3.

После того как установлены параметры защиты и созданы ключи, состояния соединений могут быть установлены и сделаны текущими. Текущие состояния должны обновляться для каждой обработанной записи. Каждое состояние соединения включает перечисленные ниже элементы.

compression state — состояние компрессии

Текущее состояние алгоритма сжатия.

cipher state — состояние шифра

Текущее состояние алгоритма шифрования, включающее запланированный ключ для данного соединения. Для потоковых шифров этот элемент будет содержать информацию, требуемую для продолжения шифрования или дешифрования потока данных.

MAC secret — секрет MAC

Секретное значение MAC для данного соединения (см. выше).

sequence number — порядковый номер

Для каждого соединения поддерживается порядковый номер (раздельно для состояний чтения и записи). Порядковый номер должен устанавливаться в 0 при переходе соединения в активное состояние. Номер представляет собой значение типа uint64 и не может быть больше 264-1. При достижении максимального значения порядковый номер не сбрасывается в 0. Если реализации TLS требуется сбросить номер при достижении максимального значения, она должна заново выполнить согласования. Порядковые номера увеличиваются после каждой записи (первая запись для конкретного соединения должна использовать порядковый номер 0).

6.2. Уровень записи

Уровень TLS Record принимает неразобранные данные от вышележащих уровней в непустых блоках произвольного размера.

6.2.1. Фрагментация

Уровень записи фрагментирует информационные блоки в записи TLSPlaintext, передающие данные размером до 214 байтов. Границы клиентских сообщений не сохраняются на уровне записи (т. е., множество клиентских сообщений с одним ContentType может быть объединено в одну запись TLSPlaintext или одно сообщение может быть фрагментировано в несколько записей).

      struct {
          uint8 major;
          uint8 minor;
      } ProtocolVersion;

      enum {
          change_cipher_spec(20), alert(21), handshake(22),
          application_data(23), (255)
      } ContentType;

      struct {
          ContentType type;
          ProtocolVersion version;
          uint16 length;
          opaque fragment[TLSPlaintext.length];
      } TLSPlaintext;

type — тип

Протокол вышележащего уровня, используемый для обработки вложенного фрагмента.

version — версия

Версия протокола, который будет использоваться. Данный документ описывает протокол TLS версии 1.2, для которого номер версии имеет значение { 3, 3 }. Номер версии 3.3 сложился по историческим причинам — на основе номера {3, 1}, который использовался для протокола TLS v1.0 (см. Приложение A.1). Отметим, что поддерживающий разные версии TLS клиент может не знать, какая версия будет применяться, до получения им сообщения ServerHello. Обсуждение вопроса выбора номера версии для сообщений ClientHello приведено в Приложении E.

length размер

Размер (в байтах) следующего TLSPlaintext.fragment. Значение поля не должно превышать 214.

fragment фрагмент

Данные приложения. Эти данные прозрачны и трактуются, как независимый блок, с которым работает протокол вышележащего уровня, заданный полем type.

Реализациям недопустимо передавать фрагменты нулевого размера для типов Handshake, Alert и ChangeCipherSpec. Фрагменты нулевого размера типа Application можно передавать, поскольку они потенциально могут препятствовать анализу трафика.

Примечание. Возможно чередование данных разных типов уровня TLS Record. Данные приложений в общем случае при передаче имеют более низкий приоритет по сравнению с другими типами информации. Однако записи должны доставляться в сеть в том же порядке, в котором они защищались уровнем записи. Получатели должны принимать и обрабатывать чередующийся трафик прикладного уровня в течение процессов согласований, следующих за первым согласованием для данного соединения.

6.2.2. Сжатие и декомпрессия записей

Все записи сжимаются с использованием алгоритма компрессии, определенного для текущего состояния сессии. Во всех случаях имеется один активный алгоритм сжатия, однако в начальный момент используется пустой алгоритм CompressionMethod.null. Алгоритм сжатия преобразует структуру TLSPlaintext в другую структуру TLSCompressed. Функция сжатия инициализируется с принятой по умолчанию информацией о состоянии после того, как состояние соединения становится активным. Алгоритмы сжатия для TLS описаны в [RFC3749].

Компрессия не должна приводить к потерям и увеличивать размер сжимаемых данных более, чем на 1024 байта. Если функция декомпрессии встречает фрагмент TLSCompressed.fragment, который она будет декомпрессировать в размер, превышающий 214 байтов, она должна выдавать сообщение о критической ошибке при декомпрессии.

      struct {
          ContentType type;       /* то же, что TLSPlaintext.type */
          ProtocolVersion version;/* то же, что TLSPlaintext.version */
          uint16 length;
          opaque fragment[TLSCompressed.length];
      } TLSCompressed;

length

Размер (в байтах) следующего фрагмента TLSCompressed.fragment. Размер фрагмента не может превышать 214 + 1024 байтов.

fragment

Сжатое представление TLSPlaintext.fragment.

Примечание. Операция CompressionMethod.null не меняет каких-либо полей.

Примечание для разработчиков. Функция декомпрессии отвечает за то, чтобы сообщения не могли вызвать переполнения буферов.

6.2.3. Защита данных записи

Функции шифрования и MAC преобразуют структуру TLSCompressed в другую структуру TLSCiphertext. Функция расшифровки выполняет обратный процесс. Значение MAC для записи включает порядковый номер, позволяющий обнаружить недостающие, лишние или повторные сообщения.

      struct {
          ContentType type;
          ProtocolVersion version;
          uint16 length;
          select (SecurityParameters.cipher_type) {
              case stream: GenericStreamCipher;
              case block:  GenericBlockCipher;
              case aead:   GenericAEADCipher;
          } fragment;
      } TLSCiphertext;

type — тип

Поле типа, идентичное TLSCompressed.type.

version — версия

Поле номера версии, идентичное TLSCompressed.version.

length размер

Размер (в байтах) следующего фрагмента TLSCiphertext.fragment. Размер не может превышать 214 + 2048.

fragment фрагмент

Зашифрованная форма TLSCompressed.fragment с кодом MAC.

6.2.3.1. Пустой или стандартный потоковый шифр

Потоковые шифры (включая BulkCipherAlgorithm.null — см. Приложение A.6) преобразуют структуры TLSCompressed.fragment в структуры TLSCiphertext.fragment и обратно.

      stream-ciphered struct {
          opaque content[TLSCompressed.length];
          opaque MAC[SecurityParameters.mac_length];
      } GenericStreamCipher;

Значение MAC генерируется, как

      MAC(MAC_write_key, seq_num +
                            TLSCompressed.type +
                            TLSCompressed.version +
                            TLSCompressed.length +
                            TLSCompressed.fragment);

где «+» означает конкатенацию.

seq_num

Порядковый номер записи.

hash

Алгоритм хэширования, заданный полем SecurityParameters.mac_algorithm.

Отметим, что значение MAC рассчитывается до шифрования. Потоковый шифр кодирует блок целиком, включая MAC. Для потоковых шифров, не использующих вектор инициализации (таких, как RC4), состояние шифра из конца записи просто используется для следующего пакета. При использовании шифра TLS_NULL_WITH_NULL_NULL шифрование не применяется (т. е., данные не шифруются и размер MAC равен 0, что эквивалентно отказу от использования MAC). TLSCiphertext.length = TLSCompressed.length + CipherSpec.hash_size.

6.2.3.2. Блочный шифр CBC

Для блочных шифров (таких, как 3DES или AES) функции шифрования и MAC преобразуют структуры TLSCompressed.fragment в другие структуры TLSCiphertext.fragment и обратно.

      struct {
          opaque IV[SecurityParameters.record_iv_length];
          block-ciphered struct {
              opaque content[TLSCompressed.length];
              opaque MAC[SecurityParameters.mac_length];
              uint8 padding[GenericBlockCipher.padding_length];
              uint8 padding_length;
          };
      } GenericBlockCipher;

Значение MAC генерируется в соответствии с описанием параграфа 6.2.3.1.

IV — вектор инициализации

Вектор инициализации (IV) следует выбирать случайно и он должен быть непредсказуемым. Отметим, что версии TLS до 1.1 не использовали поле IV и в качестве вектора инициализации применялся последний шифрованный блок предыдущей записи (CBC residue). Для предотвращения атак, описанных в [CBCATT] от этого пришлось отказаться. Для блочных шифров размер IV представляет собой размер SecurityParameters.record_iv_length, который совпадает с SecurityParameters.block_size.

padding — заполнение

Заполнение используется для выравнивания размера нешифрованных данных до значения, кратного размеру блока шифрования. Размер заполнения может быть произвольным (вплоть до 255 байтов), чтобы сделать значение TLSCiphertext.length кратным размеру блока. Для защиты от атак на базе анализа размера сообщений может использоваться дополнительное заполнение (сверх минимального, требуемого для выравнивания по границе блока). Каждое поле uint8 в векторе заполнения должно содержать значение размера заполнения. Получатель должен проверять значение заполнения и при несовпадении ему следует использовать сигнал bad_record_mac для индикации ошибки заполнения.

padding_length — размер заполнения

Размер заполнения должен быть таким, чтобы общий размер структуры GenericBlockCipher был кратным размеру блока шифрования. Поле размера может принимать любые значения в диапазоне от 0 до 255, включительно. Это значение определяет размер поля заполнения без учета самого поля padding_length.

Размер зашифрованных данных (TLSCiphertext.length) на 1 больше суммы значений SecurityParameters.block_length, TLSCompressed.length, SecurityParameters.mac_length и padding_length.

Пример. Если размер блока составляет 8 байтов, размер содержимого (TLSCompressed.length) — 61 байт, а размер MAC — 20 байтов, общий размер до заполнения составит 82 байта (без учета IV). Таким образом, размер заполнения для модуля 8 должен составить 6 байтов, чтобы сделать общий размер кратным 8 (размер блока). Реальный размер заполнения может составлять 6, 14, 22 и т. д., до 254. Если будет использоваться минимальное заполнение (6 байтов), каждое поле заполнения будет содержать значение 6. Таким образом последние 8 октетов GenericBlockCipher до шифрования блока будут иметь вид xx 06 06 06 06 06 06 06, где xx — последний октет MAC.

Примечание. Для блочных шифров в режиме CBC критично чтобы весь шифруемый текст записи был известен до передачи какого-либо шифротекста. В противном случае открывается возможность организации атаки, описанной в [CBCATT].

Примечание для разработчиков. Canvel с соавторами [CBCTIME] продемонстрировали атаку на заполнение CBC с синхронизацией на основе определения времени, затрачиваемого на расчет MAC. Для защиты от таких атак реализации должны обеспечить одинаковое время обработки, независимо от корректности заполнения. В общем случае лучше всего добиваться этого, рассчитывая значение MAC даже при некорректном заполнении и отвергая пакет лишь после расчета. Например, если значение заполнителя представляет некорректным, реализация может предположить, нулевой размер заполнения и рассчитать значение MAC. Это сохраняет некоторые возможности для синхронизации, поскольку время расчета MAC зависит от размера фрагмента данных, но воспользоваться такими возможностями будет гораздо сложнее, поскольку значение MAC будет рассчитываться для большого объема данных и для синхросигнала размер будет слишком мал.

6.2.3.3. Шифры AEAD

Для шифров AEAD [AEAD] (таких, как [CCM] или [GCM]) функция AEAD преобразует структуру TLSCompressed.fragment в другую структуру AEAD TLSCiphertext.fragment.

      struct {
         opaque nonce_explicit[SecurityParameters.record_iv_length];
         aead-ciphered struct {
             opaque content[TLSCompressed.length];
         };
      } GenericAEADCipher;

Шифры AEAD принимают на входе один ключ, значение nonce, нешифрованный текст и «дополнительные данные» для включения в проверку подлинности, как описано в параграфе 2.1 [AEAD]. В качестве ключа используется client_write_key или server_write_key. Ключ MAC не применяется.

Каждый шифронабор AEAD должен указывать способ создания значения nonce, которое представляется операции AEAD, и размер GenericAEADCipher.nonce_explicit. Во многих случаях приемлемо использование метода неявных nonce, описанного в параграфе 3.2.1 [AEAD] с record_iv_length, совпадающим с размером явной части. В таких случаях неявную часть следует создавать из key_block, как client_write_iv и server_write_iv (см. параграф 6.3), а явная часть включается в GenericAEAEDCipher.nonce_explicit.

Нешифрованный текст представляет собой TLSCompressed.fragment.

Дополнительные данные для аутентификации, обозначенные additional_data, определяются следующим образом:

      additional_data = seq_num + TLSCompressed.type +
                        TLSCompressed.version + TLSCompressed.length;

где «+» обозначает конкатенацию.

Вывод aead_output включает результат операции шифрования AEAD. Выходной размер обычно превышает TLSCompressed.length и размер этого превышения зависит от используемого шифра AEAD. Для любого шифра AEAD недопустимо увеличение размера на выходе сверх 1024 байтов.10

      AEADEncrypted = AEAD-Encrypt(write_key, nonce, plaintext, additional_data)

Для расшифровки и проверки шифр принимает на входе ключ, nonce, additional_data и шифрованное значение AEADEncrypted, возвращая на выходе расшифрованный текст или индикацию ошибки при расшифровке.

      TLSCompressed.fragment = AEAD-Decrypt(write_key, nonce, AEADEncrypted, additional_data)

При отказе во время расшифровки должен генерироваться сигнал bad_record_mac.

6.3. Расчет ключей

Для протокола Record требуется алгоритм генерации ключей, требуемых для текущего состояния соединения (см. Приложение A.6), на основе параметров защиты, обеспечиваемых протоколом согласования.

Первичный секрет хэшируется в последовательность защищенных байтов, которая делится на секреты записи MAC для клиента и сервера, а также ключи записи шифрования для клиента и сервера. Эти элементы генерируются из указанной последовательности байтов в указанном порядке. Неиспользуемые значения остаются пустыми. Некоторые шифры AEAD могут дополнительно требовать векторы инициализации при записи (IV) для клиента и сервера (см. параграф 6.2.3.3).

При генерации ключей и секретов MAC первичный секрет служит источником энтропии.

Для генерации ключевого материала выполняется расчет

      key_block = PRF(SecurityParameters.master_secret,
                      "key expansion",
                      SecurityParameters.server_random +
                      SecurityParameters.client_random);

пока не будет получен достаточный объем данных. После этого полученный блок делится, как показано ниже.

      client_write_MAC_key[SecurityParameters.mac_key_length]
      server_write_MAC_key[SecurityParameters.mac_key_length]
      client_write_key[SecurityParameters.enc_key_length]
      server_write_key[SecurityParameters.enc_key_length]
      client_write_IV[SecurityParameters.fixed_iv_length]
      server_write_IV[SecurityParameters.fixed_iv_length]

В настоящее время client_write_IV и server_write_IV генерируются только для метода неявных nonce, как описано в параграфе 3.2.1 [AEAD].

Примечание для разработчиков. Шифронабором, которому требуется значительный объем материала, является AES_256_CBC_SHA256 — ему нужно 2 x 32 байта для ключей и 2 x 32 байтов для секретов MAC (всего 128 байтов ключевого материала).

7. Протокол TLS Handshake

TLS включает три субпротокола, которые обеспечивают партнерам возможность согласования параметров защиты для уровня записи, проведения взаимной аутентификации, установки согласованных параметров защиты и информирования об ошибках.

Протокол Handshake отвечает за согласование сессии, включающей перечисленные ниже элементы.

session identifier — идентификатор сессии

Произвольная последовательность байтов, выбранная сервером для идентификации активного или возобновляемого (resumable) состояния сессии.

peer certificate — сертификат партнера

Сертификат X509v3 [PKIX] для партнера. Этот элемент состояния может быть пустым.

compression method — метод сжатия

Алгоритм, используемый для сжатия данных перед шифрованием.

cipher spec — спецификация шифра

Задает псевдослучайную функцию (PRF), используемую для генерации ключевого материала, алгоритм шифрования больших объемов данных (типа null, AES и т. п.) и MAC (типа HMAC-SHA1). Этот параметр также определяет криптографические атрибуты типа mac_length (см. формальное определение в Приложении A.6).

master secret — первичный секрет

48-байтовое секретное значение, известное клиенту и серверу.

is resumable

Флаг возможности использования сессии для инициирования новых соединений.

Эти элементы применяются для создания параметров защиты, используемых уровнем Record для защиты данных приложения. Можно организовать множество соединений с использованием одной сессии за счет применения возможности возобновления в протоколе TLS Handshake.

7.1. Протокол смены шифра

Протокол смены шифра существует для сигнализации об изменении стратегии шифрования. Протокол включает одно сообщение, которое шифруется и сжимается в соответствии с текущим (а не ожидающим) состоянием соединения. Сообщение содержит один байт со значением 1.

      struct {
          enum { change_cipher_spec(1), (255) } type;
      } ChangeCipherSpec;

Сообщения ChangeCipherSpec передаются клиентом и сервером для уведомления принимающей стороны о том, что последующие записи будут защищены с применением недавно согласованных шифров и ключей. Прием такого сообщения заставляет получателя передать на уровень Record команду незамедлительного копирования ожидающего состояния чтения в текущее состояние чтения. Сразу же после передачи такого сообщения отправитель должен дать своему уровню записи команду сделать ожидающее состояние записи текущим (см. параграф 6.1). Сообщение ChangeCipherSpec передается в процессе согласования после того, как параметры защиты согласованы, но до передачи сообщения Finished о завершении верификации.

Примечание. Если повторное согласование происходит в процессе передачи данных через соединение, взаимодействующие стороны могут продолжать передачу данных с использованием прежнего шифра CipherSpec. Однако с момента отправки ChangeCipherSpec должен использоваться новый шифр. Сторона, передавшая первой сообщение ChangeCipherSpec не знает, закончила ли другая сторона расчет нового ключевого материала (например, выполняются занимающие много времени расчеты для открытых ключей). Таким образом, может возникать небольшой промежуток времени, когда получатель должен буферизовать данные. На практике для современных машин этот промежуток явно будет очень коротким.

7.2. Протокол Alert

Одним из типов содержимого, поддерживаемого уровнем TLS Record, является сигнализация (alert). Сигнальные сообщения передают уровень важности и описание сигнала. Сообщения критического (fatal) уровня приводят к незамедлительному разрыву соединения. В этом случае другие соединения, соответствующие данной сессии, могут сохраняться, но идентификатор сессии должен быть объявлен неприемлемым (invalidated), чтобы предотвратить организацию в этой сессии новых соединений. Подобно остальным сообщениям, сигнальные сообщения шифруются и сжимаются в соответствии с текущим состоянием соединения.

      enum { warning(1), fatal(2), (255) } AlertLevel;

      enum {
          close_notify(0),
          unexpected_message(10),
          bad_record_mac(20),
          decryption_failed_RESERVED(21),
          record_overflow(22),
          decompression_failure(30),
          handshake_failure(40),
          no_certificate_RESERVED(41),
          bad_certificate(42),
          unsupported_certificate(43),
          certificate_revoked(44),
          certificate_expired(45),
          certificate_unknown(46),
          illegal_parameter(47),
          unknown_ca(48),
          access_denied(49),
          decode_error(50),
          decrypt_error(51),
          export_restriction_RESERVED(60),
          protocol_version(70),
          insufficient_security(71),
          internal_error(80),
          user_canceled(90),
          no_renegotiation(100),
          unsupported_extension(110),
          (255)
      } AlertDescription;

      struct {
          AlertLevel level;
          AlertDescription description;
      } Alert;

7.2.1. Сигнал закрытия

Клиент и сервер должны иметь общую информацию о завершении соединения во избежание атак «на отсечение» (truncation attack). Любая из сторон может инициировать обмен сообщениями о закрытии.

close_notify

Это сообщение уведомляет получателя о том, что сервер больше не будет передавать сообщений через данное соединение. Отметим, что в TLS 1.1 сбой при закрытии соединения больше не делает сессию невозобновляемой. Это отличие от TLS 1.0 обусловлено общепринятой практикой.

Любая сторона может инициировать закрытие соединения, передав сигнал close_notify. Все принятые после получения такого сигнала данные игнорируются.

Если не было передано какого-либо иного критического сигнала, каждая сторона должна передать сигнал close_notify до закрытия пишущей стороны соединения. Другая сторона должна ответить сообщением close_notify о своей готовности и незамедлительно закрыть соединение, отбрасывая все ожидающие записи. От инициатора закрытия не требуется ожидания приема close_notify перед закрытием читающей стороны соединения.

Если использующий TLS протокол обеспечивает передачу каких-либо данных через нижележащий транспорт после закрытия соединения TLS, реализация TLS должна принять отклик close_notify до индикации прикладному уровню закрытия соединения TLS. Если прикладной протокол не переносит каких-либо дополнительных данных, а будет просто закрывать нижележащее транспортное соединение, реализация может закрыть транспорт без ожидания отклика close_notify. Никакую часть данного стандарта не следует трактовать, как требование к манере управления профилем использования TLS для транспортировки своих данных, включая организацию и разрыв соединений.

Примечание. Предполагается, что завершение соединения гарантирует доставку ожидающих данных до разрушения транспорта.

7.2.2. Сигнализация ошибок

Обработка ошибок в протоколе TLS Handshake очень проста. При обнаружении ошибки нашедшая ее сторона отправляет другой стороне сообщение. После передачи или приема сигнала о критической ошибке обе стороны незамедлительно разрывают соединение. Серверы и клиенты должны забыть идентификаторы сессий, ключи и секреты, связанные с разорванным соединением. Таким образом, любое соединение, разорванное по критическому сигналу, недопустимо возобновлять.

Всякий раз при возникновении ситуации, описанной, как критическая ошибка, реализация должна передать соответствующий сигнал до разрыва соединения. Для всех ошибок, где критический уровень не указан явно, передающая сторона может сама принимать решение о критическом или некритическом характере ошибки. Если реализация решает передать сигнал и закрыть соединение, она должна передать сигнал критического уровня.

При отправке или получении сигнала уровня warning (предупреждение) разрывать соединение обычно не требуется. Если принимающая сторона решает отказаться от этого соединения (например, после получения сигнала no_renegotiation, который она не хочет воспринимать), ей следует передать критический сигнал для разрыва соединения. По этой причине сигналы-предупреждения практически бесполезны, если передающая сторона желает сохранить соединение — в результате такие сигналы иногда опускаются. Например, если партнер решает принять сертификат с истекшим сроком действия (возможно, по указанию пользователя) и продолжить использование соединения, он обычно не передает сигнала certificate_expired.

Список определенных сигналов об ошибках приведен ниже.

unexpected_message — неожиданное сообщение

Получено неприемлемое сообщение. Этот сигнал всегда является критическим и никогда не должен возникать для сеансов между корректными реализациями.

bad_record_mac — некорректное значение MAC

Этот сигнал возвращается при получении записи с неприемлемым значением MAC. Такой сигнал также должен возвращаться при неприемлемой расшифровке TLSCiphertext — размер не кратен размеру блока или не допустимы значения заполнения. Ошибка всегда является критической и такой сигнал никогда не должен возникать для сеансов между корректными реализациями (за исключением случаев повреждения сообщений в сети).

decryption_failed_RESERVED

Этот сигнал сигнал применялся в некоторых ранних версиях TLS и его использование может открывать возможность для атак на режим CBC [CBCATT]. Использование сигнала недопустимо для соответствующих этой спецификации реализаций протокола.

record_overflow — переполнение записи

Полученная запись TLSCiphertext имеет размер, превышающий 214+2048 байт, или запись была расшифрована в запись TLSCompressed, размер которой превысил 214+1024 байт. Сигнал является критическим и никогда не должен возникать для сеансов между корректными реализациями (за исключением случаев повреждения сообщений в сети).

decompression_failure — отказ при декомпрессии

Функция декомпрессии получила на входе неприемлемые данные (например, дающие на выходе избыточный размер). Сигнал является критическим.

handshake_failure — отказ при согласовании

Получение сигнала handshake_failure говорит о том, что отправитель оказался не способен согласовать приемлемый набор параметров защиты. Ошибка является критической.

no_certificate_RESERVED

Этот сигнал использовался в SSLv3, но не в TLS. Реализациям недопустимо передавать такие сигналы.

bad_certificate — некорректный сертификат

Сертификат поврежден, содержит подписи, которые не удалось проверить, и т. п.

unsupported_certificate — неподдерживаемый сертификат

Тип сертификата не поддерживается.

certificate_revoked — отозванный сертификат

Сертификат был отозван подписавшей его стороной.

certificate_expired — устаревший сертификат

Срок действия сертификата истек.

certificate_unknown — неизвестный сертификат

Некая (не указанная) проблема, возникшая при обработке сертификата и делающая сертификат непригодным.

illegal_parameter — недопустимый параметр

При согласовании значение поля вышло за допустимые пределы или стало не совместимым с другими полями. Ошибка является критической.

unknown_ca — неизвестный удостоверяющий центр

Получена корректная цепочка сертификатов или ее часть, но сертификат не был принят по причине того, что не удалось найти сертификат CA или найденный сертификат не может быть сопоставлен с доверенными CA. Ошибка является критической.

access_denied — доступ отвергнут

Был получен корректный сертификат, но при контроле доступа отправитель принял решение об отказе от согласования. Ошибка является критической.

decode_error — ошибка декодирования

Сообщение не может быть декодировано по причине выхода того или иного поля за допустимые пределы или некорректного размера сообщения. Сигнал является критическим и никогда не должен возникать для сеансов между корректными реализациями (за исключением случаев повреждения сообщений в сети).

decrypt_error — ошибка дешифровки

Отказ криптографической операции при согласовании (включая невозможность верификации подписи, расшифровки обмена ключами или верификации сообщения Finished). Ошибка является критической.

export_restriction_RESERVED — экспортные ограничения (резерв)

Этот сигнал использовался в некоторых ранних версиях TLS. Реализациям недопустимо передавать такие сигналы.

protocol_version — версия протокола

Версия протокола, которую клиент пытался согласовать, не поддерживается (например, старая версия отвергнута из соображений безопасности). Ошибка является критической.

insufficient_security — недостаточная защита

Возвращается вместо handshake_failure в тех случаях, когда при согласовании возник отказ по причине того, что сервер требует более защищенных шифров, нежели предложил клиент. Ошибка является критической.

internal_error — внутренняя ошибка

Внутренняя ошибка, не связанная с партнером или корректностью протокола, но не позволяющая продолжить работу (например, ошибка при выделении памяти). Ошибка является критической.

user_canceled — отказ пользователя

Согласование было отвергнуто по причинам, не связанным с протокольными ошибками. Если пользователь прервал операцию после завершения согласования, соединение лучше просто закрыть путем передачи close_notify. За этим сигналом следует передавать close_notify. Сигнал обычно служит предупреждением.

no_renegotiation — отказ от повторного согласования

Передается клиентом в ответ на запрос hello или сервером в ответ на клиентский запрос hello после первичного согласования. В любом из этих случаев обычно выполняется повторное согласование, но в тех случаях, когда такое согласование не приемлемо, получателю следует передать данный сигнал. В этот момент первичному отправителю следует решить вопрос о продолжении работы с данным соединением. Одним из случаев уместности такого сигнала является ситуация, когда сервер запустил процесс для выполнения запроса — процесс при старте мог получить параметры защиты (размер ключа, аутентификация и т. п.), изменить которые после запуска достаточно сложно. Сигнал всегда служит предупреждением.

unsupported_extension — неподдерживаемое расширение

Этот сигнал передается клиентом, получившим от сервера сообщение, содержащее расширение, которое этот клиент не может поместить в свое сообщение hello. Ошибка является критической.

Новые значения для сигналов выделяются агентством IANA, как описано в разделе 12.

7.3. Обзор протокола Handshake

Криптографические параметры состояния сессии задаются с использованием протокола TLS Handshake, работающего «поверх» уровня TLS Record. Когда клиент и сервер TLS начинают взаимодействие, они согласуют номер версии протокола, выбирают криптографические алгоритмы, могут выполнить взаимную аутентификацию, а также создают общие секреты с помощью шифрования на базе открытых ключей.

Протокол TLS Handshake включает следующие этапы:

  • обмен сообщениями hello для согласования алгоритмов, обмена случайными значениями и проверки возобновляемости сессии;

  • обмен требуемыми криптографическими параметрами, позволяющими клиенту и серверу согласовать предварительный секрет (premaster secret);

  • обмен сертификатами и криптографической информацией для обеспечения возможности взаимной аутентификации клиента и сервера;

  • генерация первичного секрета (master secret) из предварительного (premaster secret) и переданных друг другу случайных значений;

  • предоставление параметров безопасности уровню записи;

  • предоставление клиенту и серверу возможности проверить, что партнер выбрал такие же параметры безопасности, а согласование происходило без вмешательства злоумышленников.

Отметим, что вышележащим протоколам не следует чересчур доверять TLS в плане согласования сторонами наиболее строго из возможных вариантов — существует множество способов, когда перехват с участием человека (MITM11) может использоваться для снижения уровня защиты вплоть до минимально возможного. Протокол рассчитан на минимизацию риска, но атаки все равно возможны — например, атакующий может блокировать доступ к порту, через который работает служба защиты и попытаться вынудить партнеров организовать соединение без проверки подлинности. Фундаментальным правилом является необходимость понимать на верхних уровнях реальные потребности в защите и никогда не передавать данные через канал, не обеспечивающий требуемого уровня защиты. Протокол TLS является защищенным, поскольку любой из шифров обеспечивает заявленный уровень защиты — если вы согласовали использование алгоритма 3DES с обменом RSA для 1024-битовых ключей с хостом, чей сертификат был подтвержден, вы может быть уверенными в защите.

Эти цели могут быть достигнуты с помощью протокола согласования (handshake), работу которого кратко можно описать следующим образом — клиент отправляет приветственное сообщение ClientHello, на которое сервер отвечает своим приветствием ServerHello или, при возникновении критической ошибки, соединение будет разорвано. Сообщения ClientHello и ServerHello служат для организации защищенного соединения между сторонами. При обмене этими сообщениями организуются следующие атрибуты: Protocol Version, Session ID, Cipher Suite, Compression Method. В дополнение к ним происходит генерация случайных значений ClientHello.random и ServerHello.random с обменом ими.

Для реального обмена ключами используется до 4 сообщений — Certificate и ServerKeyExchange от сервера, Certificate и ClientKeyExchange от клиента. Может быть создан новый метод обмена ключами путем задания формата для этих сообщений и определения способа использования, который позволит согласовать между клиентом и сервером общий (shared) секрет. Этот секрет должен быть достаточно длинным — определенные к настоящему моменту методы обмена ключами поддерживают секреты размером от 46 байтов.

Вслед за сообщениями hello сервер будет отправлять свой сертификат в сообщении Certificate, если нужна аутентификация. Кроме того, может быть передано сообщение ServerKeyExchange, если оно требуется (например, если сервер не имеет сертификата или сертификат предназначен только для подписи). Если сервер аутентифицирован, он может запросить у клиента сертификат, когда это приемлемо для выбранного шифронабора. После этого сервер будут передавать сообщение ServerHelloDone, показывающее, что фаза сообщений hello при согласовании завершена. Далее сервер ждет отклика клиента. Если сервер передал сообщение CertificateRequest, клиент должен вернуть ему свой сертификат в сообщении Certificate. Далее передается сообщение ClientKeyExchange, содержимое которого будет зависеть от выбранного с помощью ClientHello и ServerHello алгоритма шифрования с открытыми ключами. Если клиент представил сертификат с возможностью подписи, передается сообщение CertificateVerify с цифровой подписью для явной проверки владения секретным ключом сертификата.

Клиент                                               Сервер

ClientHello                  -------->
                                                ServerHello
                                               Certificate*
                                         ServerKeyExchange*
                                        CertificateRequest*
                             <--------      ServerHelloDone
Certificate*
ClientKeyExchange
CertificateVerify*
[ChangeCipherSpec]
Finished                     -------->
                                         [ChangeCipherSpec]
                             <--------             Finished
Данные приложений            <------->    Данные приложений

* необязательное сообщение

Рисунок 1. Поток сообщений при полном согласовании.


После этого клиент передает сообщение ChangeCipherSpec и копирует ожидающее значение Cipher Spec в текущее значение Cipher Spec. Клиент после этого незамедлительно передает сообщение Finished с использованием новых алгоритмов, ключей и секретов. В ответ сервер будет передавать свое сообщение ChangeCipherSpec, переносить ожидающее значение Cipher Spec в текущее и передавать сообщение Finished с использованием нового Cipher Spec. На этом согласование завершается — клиент и сервер могут начать обмен данными приложений (см. Рисунок 1). Данные приложений недопустимо передавать до завершения первого согласования (до выбора шифронабора, отличного от TLS_NULL_WITH_NULL_NULL).

Примечание. Для предотвращения передачи ChangeCipherSpec в одной записи вместе с другими фрагментами согласования для ChangeCipherSpec выделен особый тип содержимого TLS — эти сообщения не относятся к согласующим сообщениям TLS. Во избежание простоев на соединениях сообщения ChangeCipherSpec передаются клиентом и сервером12.

Для случаев, когда клиент и сервер принимают решение возобновить предыдущую сессию или дублировать существующую (вместо согласования новых параметров защиты), поток сообщений описан ниже.

Клиент передает сообщение ClientHello, используя Session ID возобновляемой сессии. Сервер проверяет соответствие этой сессии своему кэшу. Если в кэше найден соответствующий идентификатор сессии и сервер согласен на ее возобновление в указанном состоянии, он передает сообщение ServerHello с таким же значением Session ID. Далее клиент и сервер должны передать сообщения о смене шифра и сразу же перейти к сообщениям о завершении. На этом восстановление сессии завершается, клиент и сервер могут обмениваться данными прикладных уровней (см. Рисунок 2). Если значение Session ID не найдено, сервер генерирует новый идентификатор, после чего клиент и сервер TLS выполняют полную процедуру согласования.

Клиент                                                Сервер

ClientHello                   -------->
                                                 ServerHello
                                          [ChangeCipherSpec]
                              <--------             Finished
[ChangeCipherSpec]
Finished                      -------->
Данные приложений             <------->    Данные приложений

Рисунок 2. Поток сообщений для сокращенного согласования.


Содержание и значимость каждого типа сообщений подробно рассматриваются в последующих параграфах.

7.4. Протокол согласования параметров

Протокол TLS Handshake является одним из определенных клиентов вышележащего уровня для протокола TLS Record. Этот протокол служит для согласования параметров защиты сессии. Сообщения Handshake передаются уровню TLS Record, где они инкапсулируются в одну или несколько структур TLSPlaintext, обрабатываемых и передаваемых в соответствии с текущим активным состоянием сессии.

      enum {
          hello_request(0), client_hello(1), server_hello(2),
          certificate(11), server_key_exchange (12),
          certificate_request(13), server_hello_done(14),
          certificate_verify(15), client_key_exchange(16),
          finished(20), (255)
      } HandshakeType;

      struct {
          HandshakeType msg_type;    /* тип сообщения */
          uint24 length;             /* число байтов в сообщении */
          select (HandshakeType) {
              case hello_request:       HelloRequest;
              case client_hello:        ClientHello;
              case server_hello:        ServerHello;
              case certificate:         Certificate;
              case server_key_exchange: ServerKeyExchange;
              case certificate_request: CertificateRequest;
              case server_hello_done:   ServerHelloDone;
              case certificate_verify:  CertificateVerify;
              case client_key_exchange: ClientKeyExchange;
              case finished:            Finished;
          } body;
      } Handshake;

Сообщения протокола согласования представлены ниже в том порядке, в котором они должны передаваться; нарушение порядка сообщений является критической ошибкой. Необязательные сообщения могут быть опущены. Описанный порядок имеет исключение — сообщение Certificate при согласовании используется дважды (одно от сервера клиенту, второе обратно), но описано только для первого случая. Сообщения Hello Request могут передаваться в любой момент, но клиенту следует игнорировать такие сообщения, приходящие посреди согласования.

Значения для новых типов сообщений выделяются агентством IANA, как описано в разделе 12.

7.4.1. Сообщения Hello

Сообщения фазы приветствия используются для обмена информацией о возможностях защиты между клиентом и сервером. В начале новой сессии для уровня Record алгоритмы шифрования, хэширования и компрессии инициализируются пустыми значениями (null). Для сообщений повторного согласования используются параметры текущего состояния соединения.

7.4.1.1. Запрос приветствия

Сообщение HelloRequest может быть передано сервером в любой момент.

HelloRequest является просто уведомлением клиента о том, что ему следует начать процесс согласования. В ответ клиент в удобное для него время передает сообщение ClientHello. Это сообщение не предназначено для указания стороны, являющейся клиентом или сервером, а служит просто для инициирования нового согласования. Серверам не следует передавать HelloRequest сразу после подключения клиента. Клиент сам должен отправить в этот момент сообщение ClientHello.

Запрос приветствия будет игнорироваться клиентом, если тот в настоящий момент согласует сессию. Клиент может игнорировать такое сообщение и в тех случаях, когда он не желает заново согласовывать сессию — в таких случаях клиент по своему усмотрению может отвечать сигналом no_renegotiation. Поскольку согласующие сообщения имеют преимущества при передаче по сравнению с данными приложений, предполагается, что согласование начнется до того, как от клиента будет получено не более нескольких записей. Если сервер передает HelloRequest, но не получает в ответ ClientHello, он может разорвать соединение с возвратом сигнала о критической ошибке.

После передачи запроса hello серверу не следует его повторять, пока согласование не будет завершено.

Структура сообщения

             struct { } HelloRequest;

Это сообщение недопустимо включать в хэши сообщений, поддерживаемые в процессе согласования и используемые в сообщениях Finished и сообщениях проверки сертификатов.

7.4.1.2. Приветствие от клиента

Когда клиент первый раз подключается к серверу, ему нужно передать сначала сообщение ClientHello. Клиент также может передать сообщение ClientHello в ответ на HelloRequest от сервера или по своей инициативе для согласования параметров защиты существующего соединения.

Сообщение ClientHello включает случайную структуру, которая будет позднее использоваться протоколом.

         struct {
             uint32 gmt_unix_time;
             opaque random_bytes[28];
         } Random;

gmt_unix_time

Текущее время и дата в 32-битовом формате UNIX (число секунд с полуночи 1 января 1970 по GMT без учета високосных секунд) по внутренним часам отправителя. Для базового протокола TLS корректность хода часов не имеет значения, однако протоколы вышележащих уровней могут вносить дополнительные требования. Отметим, что в силу исторических причин в имени используется обозначение GMT — предшественник современного UTC.

random_bytes

28 байтов, создаваемых защищенным генератором случайных чисел.

Сообщение ClientHello включает идентификатор сессии переменного размера. Если это значение не пусто, оно указывает сессию между этим клиентом и сервером, чьи параметры безопасности клиент желает использовать повторно. Идентификатор сессии может быть взят из прежнего соединения, текущего соединения или другого, активного в данный момент соединения. Второй вариант полезен в тех случаях, когда клиент желает лишь обновить случайные структуры и производные от них значения, а третий вариант позволяет организовать несколько независимых защищенных соединений без полного повтора протокола согласования. Эти независимые соединения могут происходить последовательно или одновременно — значение SessionID становится корректным, когда согласование завершается обменом сообщениями Finished и сохраняет корректность до удаления по сроку или в результате критической ошибки на связанном с сессией соединении. Реальное содержимое SessionID определяется сервером.

      opaque SessionID<0..32>;

Предупреждение. Поскольку SessionID передается без шифрования и непосредственной защиты MAC, для серверов недопустимо размещать конфиденциальную информацию в идентификаторах сессий или позволять использовать обманные идентификаторы для нарушения защиты (отметим, что содержимое согласования в целом, включая SessionID, защищено сообщениями Finished, обмен которыми происходит в конце согласования).

Список CipherSuite, передаваемый от клиента к серверу в сообщении ClientHello, содержит криптоалгоритмы, поддерживаемые клиентом в порядке их предпочтения (первым указывается самый предпочтительный). Каждый элемент CipherSuite определяет алгоритм обмена ключами, алгоритм шифрования данных (включая размер ключа), алгоритм MAC и PRF. Сервер будет выбирать один из предложенных клиентом шифронаборов или возвратит сообщение об отказе и разорвет соединение, если ни один из наборов не подходит. Если список содержит неизвестные серверу шифронаборы, сервер должен игнорировать такие наборы, обрабатывая остальные, как обычно.

       uint8 CipherSuite[2];    /* селектор шифронабора */

Сообщение ClientHello включает список поддерживаемых клиентом алгоритмов компрессии, упорядоченный по предпочтению.

      enum { null(0), (255) } CompressionMethod;

      struct {
          ProtocolVersion client_version;
          Random random;
          SessionID session_id;
          CipherSuite cipher_suites<2..2^16-2>;
          CompressionMethod compression_methods<1..2^8-1>;
          select (extensions_present) {
              case false:
                  struct {};
              case true:
                  Extension extensions<0..2^16-1>;
          };
      } ClientHello;

TLS позволяет размещать блок расширений вслед за полем compression_methods. Наличие расширений можно определить по присутствию в конце сообщения ClientHello байтов, расположенных после завершения поля compression_methods. Отметим, что этот метод обнаружения дополнительных данных отличается от обычного для TLS метода использования полей переменного размера и применяется для совместимости с определенными ранее расширениями TLS.

client_version

Версия протокола TLS, которую клиент желает использовать для взаимодействия с сервером в этой сессии. Следует использовать последнюю (с максимальным номером) из поддерживаемых клиентом версий. Для данной версии спецификации следует указывать номер версии протокола 3.3 (см. приложение E в части совместимости).

random

Генерируемая клиентом случайная структура.

session_id

Идентификатор сессии, который клиент желает использовать для данного соединения. Это поле следует оставлять пустым, если не доступно session_id или клиент хочет установить новые параметры защиты.

cipher_suites

Список криптографических опций, поддерживаемых клиентом, с указанием предпочитаемого клиентом варианта первым. Если поле session_id не пусто (запрос на восстановление сессии), этот вектор должен включать по крайней мере cipher_suite для данной сессии. Значения определены в Приложении A.5.

compression_methods

Список методов сжатия, поддерживаемых клиентом и отсортированных в порядке снижения предпочтений клиента. Если поле session_id не пусто (запрос на восстановление сессии), список должен включать по крайней мере compression_method для данной сессии. Этот вектор должен включать, а все реализации должны поддерживать метод сжатия CompressionMethod.null. Это позволяет клиенту и серверу согласовать сжатие во всех случаях.

extensions

Клиент может запросить у сервера расширенную функциональность, помещая данные в поле extensions, формат которого определен в параграфе 7.4.1.4.

Если клиент запрашивает дополнительные функции и такие функции не поддерживаются сервером, клиент может прервать согласование. Серверы должны воспринимать сообщения ClientHello как с полем extensions, так и без него и (как и для остальных сообщений) должны проверять точное соответствие объема данных в сообщении его формату — при наличии несоответствия должен отправляться критический сигнал decode_error.

После передачи клиентом сообщения ClientHello он ждет от сервера ответного сообщения ServerHello. Все прочие13 согласующие сообщения от сервера, за исключением HelloRequest, трактуются, как критические ошибки.

7.4.1.3. Приветствие от сервера

Отправитель будет передавать это сообщение в ответ на сообщение ClientHello, если он способен поддерживать приемлемый набор алгоритмов. Если соответствия алгоритмов не обнаружено, сервер будет отвечать сигналом об отказе при согласовании.

Структура сообщения

      struct {
          ProtocolVersion server_version;
          Random random;
          SessionID session_id;
          CipherSuite cipher_suite;
          CompressionMethod compression_method;
          select (extensions_present) {
              case false:
                  struct {};
              case true:
                  Extension extensions<0..2^16-1>;
          };
      } ServerHello;

Наличие расширений может быть определено по дополнительным байтам вслед за полем compression_method в конце сообщения ServerHello.

server_version

Это поле указывает низший из предложенных клиентом и высший из поддерживаемых сервером номер версии протокола. Для данной версии спецификации используется номер 3.3 (см. Приложение E в части совместимости).

random

Эта структура генерируется сервером и должна отличаться от ClientHello.random и не зависеть от нее.

session_id

Идентификатор сессии, соответствующий данному соединению. Если значение ClientHello.session_id было непусто, сервер будет искать соответствие в своем кэше сессий. Если соответствие найдено и сервер желает организовать новое соединение с использованием указанного состояния сессии, он будет возвращать представленный клиентом идентификатор сессии. Это указывает на восстанавливаемый сеанс и требует от сторон перехода непосредственно к сообщениям Finished. В остальных случаях данное поле будет содержать значение, идентифицирующее новую сессию. Сервер может возвратить пустое поле session_id, указывая на то, что сессия не была кэширована и, следовательно, не может быть восстановлена. Если сессия восстанавливается, в ней должен использоваться согласованный ранее шифронабор. Отметим, что сервер не обязан восстанавливать любую сессию даже при наличии session_id. Клиенты должны быть готовы к выполнению полного согласования (включая новые шифры) в любой процедуре согласования.

cipher_suite

Один шифронабор, выбранный сервером из списка в ClientHello.cipher_suites. Для восстанавливаемых сессий это поле включает значение из состояния восстанавливаемой сессии.

compression_method

Один алгоритм сжатия, выбранный сервером из списка в ClientHello.compression_methods. Для восстанавливаемых сессий это поле включает значение из состояния восстанавливаемой сессии.

extensions

Список расширений. Отметим, что в этом списке могут появляться только расширения из числа предложенных клиентом.

7.4.1.4. Расширения приветствий

Формат расширения показан ниже.

      struct {
          ExtensionType extension_type;
          opaque extension_data<0..2^16-1>;
      } Extension;

      enum {
          signature_algorithms(13), (65535)
      } ExtensionType;

где

extension_type указывает конкретный тип расширения;

extension_data содержит данные, специфические для конкретного типа расширения.

Начальный набор расширений определен в документе [TLSEXT]. Список типов расширений поддерживается агентством IANA, как описано в разделе 12.

В сообщениях ServerHello недопустимо указание типов расширений, которых не было в соответствующем сообщении ClientHello. Если клиент получает в ServerHello тип расширения, который не был указан в соответствующем ClientHello, он должен прервать согласование, используя критический сигнал unsupported_extension.

Тем не менее, в будущем в рамках этой схемы возможно появление «ориентированных на серверы» расширений. Такое расширение (скажем, типа x) будет требовать, чтобы клиент сначала указал в сообщении ClientHello тип x с пустым полем extension_data для индикации своей поддержки этого типа расширения. Таким способом клиент позволяет серверу понять тип расширения и сервер может включить его в свое предложение.

При наличии в сообщении ClientHello или ServerHello множества типов расширений они могут указываться в любом порядке. Недопустимо указывать более одного расширения каждого типа.

Наконец, следует отметить, что расширения могут указываться как при организации новой сессии, так и в запросах на восстановление. Запрашивающий восстановление сеанса клиент в общем случае не знает, примет ли сервер этот запрос и поэтому ему следует указывать те же расширения, которые бы он передавал при организации соединения.

В общем случае спецификация каждого типа расширения должна описывать его воздействие для случаев организации новой сессии и восстановления. Большинство современных расширений TLS применимо только при организации новой сессии, а при восстановлении сессий сервер просто не будет обрабатывать эти расширения в ClientHello и не будет включать их в ServerHello. Однако для некоторых расширений при восстановлении сессий может задаваться особое поведение.

Существует ряд хитрых (и не очень) деталей взаимодействия между существующими и новыми функциями, которые могут приводить к существенному снижению общего уровня защиты. Ниже рассмотрены аспекты, которые следует принимать во внимание при разработке новых расширений.

  • Некоторые случаи отказа серверов от поддержки расширения связаны с ошибками, а другие просто являются отказами сервера от поддержки конкретной функции. В общем случае для первой категории следует использовать сигналы об ошибках, а во втором — поле в расширенном отклике сервера.

  • При разработке расширений следует принимать меры по предотвращению атак с форсированием использования (или отказа) конкретной функции путем манипуляции с сообщениями в процессе согласования. Этого следует придерживаться независимо от предполагаемого влияния функции на защиту.

    Зачастую достаточно факта хэширования полей, обеспечивающих входную информацию для сообщений Finished, но следует принимать особые меры предосторожности в тех случаях, когда расширения меняют назначение сообщений, передаваемых в фазе согласования. Разработчикам следует принимать во внимание факт того, что активные атакующие могут изменять, добавлять, удалять или заменять сообщения, пока согласование не будет аутентифицировано.

  • Технически возможно использовать расширения для изменения основных аспектов работы TLS — например, согласования шифронаборов. Делать это не рекомендуется — лучше будет определить новую версию протокола TLS — в частности, потому, что алгоритмы согласования TLS имеют специфическую защиту от атак на снижение версии, связанных с номерами версий, и возможное понижение версии должна приниматься во внимание при любом изменении устройства протокола.

7.4.1.4.1. Алгоритмы подписи

Клиент использует расширение signature_algorithms для индикации пар алгоритмов «подписи-хэширования», которые могут применяться для цифровых подписей. Поле extension_data в таких расширениях содержит значение supported_signature_algorithms.

      enum {
          none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5), sha512(6), (255)
      } HashAlgorithm;

      enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) }
        SignatureAlgorithm;

      struct {
            HashAlgorithm hash;
            SignatureAlgorithm signature;
      } SignatureAndHashAlgorithm;

      SignatureAndHashAlgorithm
        supported_signature_algorithms<2..2^16-2>;

Каждое значение SignatureAndHashAlgorithm содержит одну пару «хэширование-подпись», которую клиент хочет проверить. Значения указываются в порядке снижения предпочтений.

Примечание. Поскольку не все комбинации алгоритмов хэширования и подписи могут восприниматься реализацией (например, DSA с SHA-1, но не с SHA-256), алгоритмы указываются парами.

hash

Это поле указывает алгоритм хэширования, который может быть использован. Значения включают нехэшируемые данные (none), MD5 [MD5], SHA-1, SHA-224, SHA-256, SHA-384 и SHA-512 [SHS]. Значение none предназначено для будущих расширений на случай использования алгоритмов подписи, которые не будут требовать предварительного хэширования.

signature

Это поле указывает алгоритм подписи, который может быть использован. Значения включают анонимную подпись (anonymous), RSASSA-PKCS1-v1_5 [PKCS1] DSA [DSS] и ECDSA [ECDSA]. Значение anonymous не имеет смысла в этом контексте, но используется в параграфе 7.4.3. Недопустимо применять это значение в данном расширении.

Семантика этого расширения несколько усложняется тем, что шифронаборы указывают приемлемые алгоритмы подписи, но не указывают алгоритмов хэширования. Описание связанных с этим правил приведено в параграфах 7.4.2 и 7.4.3.

Если клиент поддерживает лишь принятые по умолчанию алгоритмы хэширования и подписи (указаны в этом параграфе), он может опустить расширение signature_algorithms. Если же клиент не поддерживает используемых по умолчанию алгоритмов или поддерживает другие алгоритмы хэширования и подписи (и хочет применять их для верификации сообщений от сервера, т. е., сертификатов и сообщений обмена ключами), он должен передать расширение signature_algorithms, указав желаемые алгоритмы.

Клиент, не передающий расширение signature_algorithms, должен выполнять перечисленное ниже:

  • если согласован алгоритм обмена ключами RSA, DHE_RSA, DH_RSA, RSA_PSK, ECDH_RSA или ECDHE_RSA, клиент ведет себя так, будто он передал расширение {sha1,rsa};

  • если согласован алгоритм обмена ключами DHE_DSS или DH_DSS, клиент ведет себя так, будто он передал расширение {sha1,dsa};

  • если согласован алгоритм обмена ключами ECDH_ECDSA или ECDHE_ECDSA, клиент ведет себя так, будто он передал расширение {sha1,ecdsa}.

Примечание. Это отличается от TLS 1.1, где не было явных правил, но с практической точки зрения можно было предположить, что партнер поддерживает MD5 и SHA-1.

Примечание. Это расширение не имеет смысла для TLS до версии 1.2. Клиентам недопустимо предлагать его, если они используют более раннюю версию. Однако, если клиент предлагает это расширение, правила, заданные в [TLSEXT], требуют от сервера игнорировать расширение, которое он не понимает.

Серверам недопустимо передавать это расширение. Серверы TLS должны поддерживать прием этого расширения.

При восстановлении сессии это расширение не включается в ServerHello и сервер игнорирует его в ClientHello (при наличии).

7.4.2. Сертификат сервера

Сервер должен передавать сообщение Certificate всякий раз, когда согласованный метод обмена ключами использует сертификаты для проверки подлинности (это включает все определенные в данном документе методы обмена ключами, за исключением DH_anon). Это сообщение передается сразу после сообщения ServerHello.

Сообщение передает клиенту серверную цепочку сертификатов.

Сертификат должен подходить для согласованного шифронабора и всех согласованных расширений.

Структура сообщения

      opaque ASN.1Cert<1..2^24-1>;

      struct {
          ASN.1Cert certificate_list<0..2^24-1>;
      } Certificate;

certificate_list

Последовательность (цепочка — chain) сертификатов X.509v3. Сертификат отправителя должен быть в списке первым. Каждый последующий сертификат должен напрямую сертифицировать своего предшественника в списке. Поскольку проверка сертификатов требует независимого распространения корневых сертификатов, самоподписанный сертификат, задающий коневой удостоверяющий центр, может быть опущен в предположении, что удаленная сторона уже имеет этот сертификат и может выполнить проверку в любом случае.

Такой же тип и структура сообщений используются для клиентских откликов на запрос сертификата. Отметим, что клиент может не передавать сертификата в ответ на запрос аутентификации от сервера, если у него нет подходящего сертификата.

Примечание. PKCS #7 [PKCS7] не используется в качестве формата векторов сертификата, поскольку расширенные сертификаты PKCS #6 [PKCS6] не применяются. Кроме того, PKCS #7 определяет SET вместо SEQUENCE, что осложняет задачу разбора.

Для передаваемых сервером сертификатов применяются перечисленные ниже правила.

  • Сертификаты должны быть X.509v3, если явно не согласовано иное (например, [TLSPGP]).

  • Конечный элемент (end entity) сертификата открытого ключа (и связанные ограничения) должен быть совместим с выбранным алгоритмом обмена ключами.

Алгоритм обмена ключами

Тип сертификата ключа

RSA, RSA_PSK

Открытый ключ RSA; сертификат должен разрешать использование ключа для шифрования (бит keyEncipherment должен быть установлен при расширенном использовании ключа).

Примечание. RSA_PSK определен в [TLSPSK].

DHE_RSA, ECDHE_RSA

Открытый ключ RSA; сертификат должен разрешать использование ключа для подписи (бит digitalSignature должен быть установлен при расширенном использовании ключа) со схемой подписи и алгоритмом хэширования, которые будут применяться в серверном сообщении обмена ключами.

Примечание. ECDHE_RSA определен в [TLSECC].

DHE_DSS

Открытый ключ DSS; сертификат должен разрешать использование ключа для подписи с алгоритмом хэширования, который будет применяться в серверном сообщении обмена ключами.

DH_DSS, DH_RSA

Ключ Diffie-Hellman; бит keyAgreement должен быть установлен при расширенном использовании ключа.

ECDH_ECDSA, ECDH_RSA

Поддерживающий ECDH открытый ключ; этот ключ должен использовать формат кривой и точки, поддерживаемый клиентом, как описано в [TLSECC].

ECDHE_ECDSA

Поддерживающий ECDSA открытый ключ; сертификат должен разрешать использование ключа для подписи с алгоритмом хэширования, который будет применяться в серверном сообщении обмена ключами. Открытый ключ должен использовать формат кривой и точки, поддерживаемый клиентом, как описано в [TLSECC].

  • Расширения server_name и trusted_ca_keys [TLSEXT] используются для руководства выбором сертификата.

Если клиент представляет расширение signature_algorithms, все предоставляемые сервером сертификаты должны быть подписаны с использованием указанной в расширении пары алгоритмов хэширования и подписи. Это подразумевает, что сертификат, содержащий ключ для одного алгоритма подписи, может быть подписан с использованием другого алгоритма (например, ключ RSA подписан ключом DSA). Это отличается от стандарта TLS 1.1, который требовал использования одного алгоритма. Это также подразумевает, что алгоритмы обмена ключами DH_DSS, DH_RSA, ECDH_ECDSA и ECDH_RSA не ограничены в выборе алгоритма для подписания сертификата. Фиксированные сертификаты DH могут быть подписаны с использованием любой пары алгоритмов хэширования и подписи, появляющейся в расширении. Имена DH_DSS, DH_RSA, ECDH_ECDSA и ECDH_RSA сохраняются по историческим причинам.

Если сервер имеет множество сертификатов, он выбирает один из них на основе рассмотренных выше критериев (в дополнение к другим критериям типа конечной точки транспортного уровня, локальной конфигурации и предпочтений и т. п.). Если сервер имеет один сертификат, ему следует попытаться проверить его соответствие этим критериям.

Отметим существование сертификатов, использующих алгоритмы или комбинации алгоритмов, которые не могут в настоящее время применяться с TLS. Например, сертификат с ключом подписи RSASSA-PSS (id-RSASSA-PSS OID в SubjectPublicKeyInfo) не может использоваться, поскольку TLS не включает соответствующего алгоритма подписи.

Предполагается, что шифронаборы, задающие новые методы обмена ключами для протокола TLS, будут включать формат сертификатов и требуемую информацию о ключах.

7.4.3. Сообщение ServerKeyExchange

Это сообщение передается сразу же вслед за сообщением Certificate (или сообщением ServerHello при анонимном согласовании).

Сообщение ServerKeyExchange передается сервером только в тех случаях, когда сообщение Certificate от сервера (если оно передавалось) не содержит всех данных, позволяющих клиенту обменяться предварительным секретом (premaster secret). Это возникает при перечисленных ниже методах обмена ключами:

DHE_DSS;

DHE_RSA;

DH_anon.

Не допускается передача сервером сообщения ServerKeyExchange для следующих методов обмена ключами:

RSA;

DH_DSS;

DH_RSA.

Другие алгоритмы обмена ключами (типа определенных в [TLSECC]) должны указывать, передаются или нет сообщения ServerKeyExchange и при передаче сообщений определять их содержимое.

Это сообщение содержит криптографическую информацию, позволяющую клиенту обменяться предварительным секретом — с завершением обмена ключами с помощью открытого ключа Diffie-Hellman (результатом обмена будет предварительный секрет) или открытым ключом какого-либо иного алгоритма.

Структура сообщения

      enum { dhe_dss, dhe_rsa, dh_anon, rsa, dh_dss, dh_rsa
            /* может быть расширенным - например, для ECDH — см. [TLSECC] */
           } KeyExchangeAlgorithm;

      struct {
          opaque dh_p<1..2^16-1>;
          opaque dh_g<1..2^16-1>;
          opaque dh_Ys<1..2^16-1>;
      } ServerDHParams;     /* эфемерные параметры DH */

dh_p

Основной модуль для операций Diffie-Hellman.

dh_g

Генератор, используемый для операций Diffie-Hellman.

dh_Ys

Открытое значение Diffie-Hellman для сервера (g^X mod p).

      struct {
          select (KeyExchangeAlgorithm) {
              case dh_anon:
                  ServerDHParams params;
              case dhe_dss:
              case dhe_rsa:
                  ServerDHParams params;
                  digitally-signed struct {
                      opaque client_random[32];
                      opaque server_random[32];
                      ServerDHParams params;
                  } signed_params;
              case rsa:
              case dh_dss:
              case dh_rsa:
                  struct {} ;
                 /* сообщение опускается для rsa, dh_dss и dh_rsa */
              /* может быть расширенным - например, для ECDH — см. [TLSECC] */
          };
      } ServerKeyExchange;

params

Серверные параметры обмена ключами.

signed_params

Для неанонимного обмена ключами хэш соответствующих значений параметров с подписью, пригодной для использованного метода хэширования.

Если клиент предлагает расширение signature_algorithms, алгоритмы подписи и хэширования должны быть парой, указанной в этом расширении. Отметим, что здесь может возникать несогласованность. Например, клиент может предложить обмен ключами DHE_DSS, не указав ни одной пары с DSA в своем расширении signature_algorithms. Для корректного согласования сервер должен сравнивать все шифронаборы-кандидаты со списком пар в расширении signature_algorithms. Это не совсем изящно, но позволяет минимизировать изменения в устройстве шифров.

В дополнение к сказанному алгоритмы хэширования и подписи должны быть совместимы с ключом в серверном сертификате конечного элемента. Ключи RSA можно использовать со всеми разрешенными алгоритмами хэширования с учетом ограничений в сертификате, если они есть.

Поскольку подписи DSA не содержат защищенной индикации алгоритма хэширования, возникает риск подмены хэш-значения, если с одним ключом может использоваться множество таких значений. В настоящее время DSA [DSS] можно применять только с SHA-1. Предполагается, что будущие версии DSS [DSS-3] позволять применять с DSA другие алгоритмы, а также будут включать руководство по выбору алгоритма хэширования (digest), который следует применять для каждого размера ключа. В дополнение к этому будущие версии [PKIX] могут указывать в сертификатах механизмы для индикации алгоритмов хэширования, которые могут применяться с DSA.

По мере определения дополнительных шифронаборов для TLS, включающих новые методы обмена ключами, серверные сообщения обмена ключами будут передаваться тогда и только тогда, когда применяется алгоритм обмена ключами, не обеспечивающий клиента информацией, достаточной для создания предварительного секрета (premaster secret).

7.4.4. Запрос сертификата

Неанонимный сервер может запросить сертификат у клиента, если это приемлемо для выбранного шифронабора. При передаче этого сообщения оно следует непосредственно за серверным сообщением ServerKeyExchange (или, при его отсутствии, за серверным сообщением Certificate).

Структура сообщения

      enum {
          rsa_sign(1), dss_sign(2), rsa_fixed_dh(3), dss_fixed_dh(4),
          rsa_ephemeral_dh_RESERVED(5), dss_ephemeral_dh_RESERVED(6),
          fortezza_dms_RESERVED(20), (255)
      } ClientCertificateType;

      opaque DistinguishedName<1..2^16-1>;

      struct {
          ClientCertificateType certificate_types<1..2^8-1>;
          SignatureAndHashAlgorithm supported_signature_algorithms<2^16-2>;14
          DistinguishedName certificate_authorities<0..2^16-1>;
      } CertificateRequest;

certificate_types

Список типов сертификатов, которые клиент может представить:

rsa_sign сертификат с ключом RSA;

dss_sign сертификат с ключом DSA;

rsa_fixed_dh сертификат со статическим ключом DH;

dss_fixed_dh сертификат со статическим ключом DH.

supported_signature_algorithms

Список пар алгоритмов хэширования и подписи, которые сервер способен проверить, отсортированный в порядке снижения уровня предпочтений.

certificate_authorities

Список различаемых имен [X501] подходящих удостоверяющих центров (certificate_authorities) в представлении DER. Эти имена могут задавать желаемое имя корневого CA или подчиненного CA; таким образом, сообщение может использоваться для описания желаемого корневого УЦ и желаемой области проверки (authorization space). Когда список certificate_authorities пуст, клиент может передать любой сертификат подходящего типа ClientCertificateType, если нет каких-либо внешних соглашений, препятствующих этому.

Взаимодействие полей certificate_types и supported_signature_algorithms несколько усложнено. Поле certificate_types пришло в TLS из SSLv3, но не было достаточным образом описано. Большая часть его функциональности перекрывается supported_signature_algorithms. Ниже перечислены применимые к этим полям правила.

  • Любые сертификаты, представленные клиентом, должны быть подписаны с использованием пары алгоритмов хэширования и подписи из supported_signature_algorithms.

  • Предоставляемые клиентом сертификаты конечных элементов (end-entity) должны содержать ключ, совместимый с certificate_types. Если это ключ подписи, он должен быть применим с той или иной парой алгоритмов хэширования и подписи из supported_signature_algorithms.

  • В силу исторических причин имена некоторых типов клиентских сертификатов включают использованный для подписи сертификата алгоритм. Например, в ранних версиях TLS имя rsa_fixed_dh означает сертификат, подписанный с помощью RSA и содержащий статический ключ DH. В TLS 1.2 произошел отказ от этого в пользу применения supported_signature_algorithms, а также было снято ограничение на использование алгоритмов для подписи сертификатов. Например, если сервер передает тип сертификата dss_fixed_dh и типы подписей {{sha1, dsa}, {sha1, rsa}} , клиент может ответить сертификатом, содержащим статический ключ DH и подписанным с помощью RSA-SHA1.

Новые значения ClientCertificateType выделяются агентством IANA, как описано в разделе 12.

Примечание. Зарезервированные значения (RESERVED) не могут использоваться, они предназначены для SSLv3.

Примечание. Анонимному серверу, запрашивающему идентификацию клиента, возвращается критический сигнал handshake_failure.

7.4.5. Сообщение ServerHelloDone

Сообщение ServerHelloDone передается сервером для индикации завершения обмена ServerHello и связанными с ним сообщениями. После отправки данного сообщения сервер будет ждать отклика от клиента.

Это сообщение означает, что сервер завершил передачу сообщений для поддержки обмена ключами и клиент может начинать свою фазу обмена ключами.

При получении сообщения ServerHelloDone клиенту следует убедиться в предоставлении сервером пригодного сертификата (если это требуется) и проверить приемлемость серверных параметров hello.

Структура сообщения

      struct { } ServerHelloDone;

7.4.6. Сертификат клиента

Это первое сообщение, которое клиент может передать после получения сообщения ServerHelloDone. Сообщение передается только в тех случаях, когда сервер запрашивает сертификат. Если подходящий сертификат отсутствует, клиент должен передать сообщение без сертификата (со структурой certificate_list нулевого размера). Если клиент не передает никакого сертификата, сервер может по своему усмотрению продолжить согласование без проверки подлинности клиента или ответить критическим сигналом handshake_failure. Кроме того, в случаях, когда те или иные аспекты цепочки сертификатов не приемлемы (например, не подписаны известным, доверенным CA), сервер может продолжить согласование (считая клиента неаутентифицированным) или передать критический сигнал.

Сертификаты клиента передаются с использованием структуры Certificate, определенной в параграфе 7.4.2.

Это сообщение переносит клиентскую цепочку сертификатов на сервер, который будет использовать информацию при проверке сообщения CertificateVerify (когда аутентификация сервера основывается на подписи) или расчете предварительного секрета (для неэфемерных DH). Сертификат должен подходить для алгоритма обмена ключами согласованного шифра и всех расширений при согласовании.

В частности должны выполняться перечисленные ниже условия.

  • Сертификат должен иметь тип X.509v3, если явно не согласовано иное (например, [TLSPGP]).

  • Открытый ключ сертификата конечного элемента (и связанные с ним ограничения) совместим с типами сертификатов, указанными в CertificateRequest.

    Тип сертификата клиента

    Тип сертификата ключа

    rsa_sign

    Открытый ключ RSA; сертификат должен разрешать использование ключа для подписи с применением схемы подписи и алгоритма хэширования, которые будут указаны в сообщении проверки сертификата.

    dss_sign

    Открытый ключ DSA; сертификат должен разрешать использование ключа для подписи с алгоритмом хэширования, который будет указан в сообщении проверки сертификата.

    ecdsa_sign

    Открытый ключ, поддерживающий ECDSA; сертификат должен разрешать использование ключа для подписи с применением схемы подписи и алгоритма хэширования, которые будут указаны в сообщении проверки сертификата; открытый ключ должен иметь формат кривой и точки, поддерживаемый сервером.

    rsa_fixed_dh, dss_fixed_dh

    Открытый ключ Diffie-Hellman; ключ должен иметь такие же параметры, как ключ сервера.

    rsa_fixed_ecdh, ecdsa_fixed_ecdh

    Поддерживающий ECDH открытый ключ; этот ключ должен использовать формат кривой и точки, поддерживаемый сервером.

  • Если список certificate_authorities в запросе сертификата не пуст, одному из сертификатов цепочки следует быть изданным указанным у списке удостоверяющим центром (CA).

  • Сертификаты должны быть подписаны с использованием подходящей пары алгоритмов хэширования и подписи, как описано в параграфе 7.4.4. Отметим, что это снижает уровень ограничений на алгоритмы подписи сертификатов, присутствовавших в ранних версиях TLS.

Отметим, что как и для серверов, имеются сертификаты, которые используют алгоритмы или их комбинации, не применяемые в настоящее время с протоколом TLS.

7.4.7. Клиентское сообщение при обмене ключами

Это сообщение всегда передается клиентом и должно следовать сразу же за сообщением с сертификатом клиента, если оно передается. Если клиент не передает сертификата, данное сообщение должно быть первым сообщением клиента после получения сообщения ServerHelloDone.

С помощью этого сообщения задается предварительный секрет (premaster secret) путем прямой передачи с шифрованием RSA или передачи параметров Diffie-Hellman, позволяющих каждой стороне организовать общий секрет.

Когда клиент использует эфемерный показатель Diffie-Hellman, это сообщение содержит открытое значение Diffie-Hellman для клиента. Если клиент передает сертификат со статическим показателем DH (например, при использовании аутентификации клиента fixed_dh), это сообщение должно передаваться и должно быть пустым.

Выбор сообщений зависит от используемого метода обмена ключами. Определение KeyExchangeAlgorithm дано в параграфе 7.4.3.

Структура сообщения

      struct {
          select (KeyExchangeAlgorithm) {
              case rsa:
                  EncryptedPreMasterSecret;
              case dhe_dss:
              case dhe_rsa:
              case dh_dss:
              case dh_rsa:
              case dh_anon:
                  ClientDiffieHellmanPublic;
          } exchange_keys;
      } ClientKeyExchange;
7.4.7.1. Сообщение с зашифрованным (RSA) предварительным секретом

Если для согласования ключей и аутентификации будет использоваться RSA, клиент генерирует 48-байтовый предварительный секрет, шифрует его с использованием открытого ключа из сертификата сервера или временного ключа RSA из серверного сообщения обмена ключами и передает результат в данном сообщении. Приведенная ниже структура является вариантом сообщения ClientKeyExchange, а не сообщением, как таковым.

Структура сообщения

      struct {
          ProtocolVersion client_version;
          opaque random[46];
      } PreMasterSecret;

client_version

Последняя (самая новая) версия, поддерживаемая клиентом. Это поле используется для детектирования атак на понижение версии.

random

46 случайных байтов с защищенной генерацией.

      struct {
          public-key-encrypted PreMasterSecret pre_master_secret;
      } EncryptedPreMasterSecret;

pre_master_secret

Случайное значение, генерируемое клиентом и используемое для создания предварительного секрета, как описано в параграфе 8.1.

Примечание. Номер версии в PreMasterSecret должен совпадать с номером версии, предложенной клиентом в ClientHello.client_version, а не согласованной для соединения версии. Это сделано для предотвращения атак на снижение номера версии. К сожалению, многие разработчики все-таки используют согласованный номер версии, в результате чего проверка номера может приводить к отказам во взаимодействии с такими некорректными реализациями клиентов.

Реализации клиентов должны, а реализации серверов могут проверять номер версии в PreMasterSecret. Если в ClientHello.client_version указана версия TLS 1.1 или более высокая, реализация сервера должна проверить номер версии, как описано в примечании ниже. Если номер версии не выше TLS 1.0, реализации сервера следует проверить номер версии, но она может иметь конфигурационный параметр, отключающий такую проверку. Отметим, что при отрицательном результате проверки значение PreMasterSecret следует делать случайным, как описано ниже.

Примечание. Атаки, обнаруженные Bleichenbacher [BLEI] и Klima с соавторами [KPR03], можно использовать против серверов TLS, которые после расшифровки конкретного сообщения показывают факты корректного форматирования PKCS#1, наличия корректной структуры PreMasterSecret и номера версии.

Как было отмечено Klima [KPR03], этих уязвимостей можно избежать, трактуя искаженные блоки и/или несоответствие номеров версий так, чтобы эти случаи невозможно было отличить от корректно форматированных блоков RSA. Для этого выполняются перечисленные ниже действия.

  1. Генерируется строка R из 46 случайных байтов;

  2. сообщение расшифровывается для восстановления открытого текста M;

  3. если заполнение PKCS#1 некорректно или размер сообщение M отличается от 48 байтов,

    pre_master_secret = ClientHello.client_version || R

    иначе, если ClientHello.client_version <= TLS 1.0 и проверка номера версии явно отключена,

pre_master_secret = M

иначе

pre_master_secret = ClientHello.client_version || M[2..47].

Отметим, что явное создание pre_master_secret с ClientHello.client_version приводит к некорректному master_secret, если клиент неверно указал номер версии в исходном pre_master_secret.

Другим вариантом является трактовка несоответствия номера версии, как ошибки форматирования PKCS-1 и возврата случайного значения предварительного секрета. Для этого выполняются перечисленные ниже действия.

  1. Генерируется строка R из 46 случайных байтов;

  2. сообщение расшифровывается для восстановления открытого текста M;

  3. если заполнение PKCS#1 некорректно или размер сообщение M отличается от 48 байтов,

    pre_master_secret = R

    иначе, если ClientHello.client_version <= TLS 1.0 и проверка номера версии явно отключена,

premaster secret = M

иначе, если M[0..1] != ClientHello.client_version,

premaster secret = R

иначе

premaster secret = M.

Хотя практические атаки против такой конструкции не известны, Klima с соавторами [KPR03] описали некоторые теоретические атаки против нее и по этой причине рекомендуется использовать первую конструкцию.

В любом случае серверу TLS недопустимо генерировать сигнал при отказе во время обработки зашифрованного с помощью RSA предварительного секрета или получении неожиданного номера версии. Вместо этого сервер должен продолжать согласование со случайным значением предварительного секрета. Может оказаться полезным внесение в системный журнал сведений о реальной причине отказа для поиска неполадок, однако в таких случаях должны приниматься меры против утечки такой информации к злоумышленникам .

Схема шифрования RSAES-OAEP, определенная в [PKCS1], более защищена от атак Bleichenbacher. Однако для обеспечения максимальной совместимости с ранними версиями TLS в данной спецификации используется схема RSAES-PKCS1-v1_5. Информации об атаках Bleichenbacher на системы, выполняющие приведенные выше рекомендации, не известно.

Примечание для разработчиков. Зашифрованные с открытым ключом данные представляются в форме opaque-векторов <0..216-1> (см. параграф 4.7). Таким образом, зашифрованному с помощью RSA значению PreMasterSecret в ClientKeyExchange предшествуют два байта размера. Эти байты являются избыточными в случае RSA, поскольку EncryptedPreMasterSecret является единственным элементом данных в ClientKeyExchange и размер их, следовательно, определен однозначно. В спецификации SSLv3 нет четкого описания представления данных, зашифрованных с открытым ключом, и, следовательно, многие реализации SSLv3 не включают байтов размера, помещая зашифрованные с помощью RSA данные напрямую в сообщение ClientKeyExchange.

Данная спецификация требует корректного представления EncryptedPreMasterSecret с использованием байтов размера. Получающийся в результате блок данных PDU не совместим со многими реализациями SSLv3. Разработчики, обновляющие свои программы с SSLv3, должны изменить свой код для генерации и восприятия корректного представления. Разработчикам, желающим обеспечить совместимость одновременно с SSLv3 и TLS, следует сделать поведение своих реализаций зависящим от версии протокола.

Примечание для разработчиков. Сейчас известно, что возможны удаленные атаки на TLS с использованием временных параметров (time-based) по крайней мере для случаев размещения клиента и сервера в одной ЛВС. По этой причине реализации, применяющие статические ключи RSA, должны использовать «ослепление» RSA (blinding) или какой-либо иной метод, как описано в [TIMING].

7.4.7.2. Открытое значение Diffie-Hellman для клиента

Эта структура передает клиентское открытое значение Diffie-Hellman (Yc), если оно уже не было включено в сертификат клиента. Используемое для Yc кодирование определяется перечисляемым значением PublicValueEncoding. Эта структура является вариантом клиентского сообщения обмена ключами, а не сообщением, как таковым.

Структура сообщения

      enum { implicit, explicit } PublicValueEncoding;

implicit

Если сертификат клиента уже содержит подходящий ключ Diffie-Hellman (для аутентификации fixed_dh client), значение Yc неявно уже задано и нет необходимости передавать его снова. В этом случае должно передаваться пустое сообщение ClientKeyExchange.

explicit

Yc требуется передать явно.

      struct {
          select (PublicValueEncoding) {
              case implicit: struct { };
              case explicit: opaque dh_Yc<1..2^16-1>;
          } dh_public;
      } ClientDiffieHellmanPublic;

dh_Yc

Открытое значение Diffie-Hellman для клиента (Yc).

7.4.8. Проверка сертификата

Это сообщение служит для обеспечения явной верификации сертификата клиента. Сообщение передается только вслед за клиентским сертификатом, имеющим возможность подписи (т. е. для всех сертификатов, за исключением содержащих фиксированные параметры Diffie-Hellman). При передаче этого сообщения оно должно следовать сразу же за клиентским сообщением обмена ключами.

Структура сообщения.

      struct {
           digitally-signed struct {
               opaque handshake_messages[handshake_messages_length];
           }
      } CertificateVerify;

Здесь handshake_messages указывает все согласующие сообщения, переданные или принятые, начиная с клиентского hello, вплоть (но не включая) до данного сообщения с учетом полей типа и размера сообщений. Это будет конкатенацией всех структур Handshake, определенных в параграфе 7.4 и использованных в обмене. Отметим, что это требует от обеих сторон буферизовать сообщения или рассчитывать хэш-значения для всех потенциальных алгоритмов хэширования вплоть до момента расчета CertificateVerify. Серверы могут минимизировать эти расчеты, предлагая ограниченный набор алгоритмов подписи в сообщении CertificateRequest.

Алгоритмы, используемый для хэширования и подписи, должны быть в числе тех, которые указаны в поле supported_signature_algorithms сообщения CertificateRequest. Кроме того, алгоритмы хэширования и подписи должны быть совместимы с ключом в клиентском сертификате конечного элемента. Ключи RSA могут применяться с любым разрешенным алгоритмом хэширования с учетом имеющихся в этом сертификате ограничений (если они есть).

Поскольку подписи DSA не содержат защищенной индикации алгоритма хэширования, возникает риск подмены хэш-значения, если с одним ключом может использоваться множество таких значений. В настоящее время DSA [DSS] можно применять только с SHA-1. Предполагается, что будущие версии DSS [DSS-3] позволят применять с DSA другие алгоритмы, а также будут включать руководство по выбору алгоритма хэширования (digest), который следует применять для каждого размера ключа. В дополнение к этому будущие версии [PKIX] могут указывать в сертификатах механизмы для индикации алгоритмов хэширования, которые могут применяться с DSA.

7.4.9. Сообщение Finished

Сообщение Finished всегда передается сразу же после сообщения о смене шифра для проверки успешного завершения процедур обмена ключами и аутентификации. Важно, чтобы сообщение о смене шифра было получено между другими согласующими сообщениями и сообщением Finished.

Сообщение Finished является первым сообщением, защищенным с помощью согласованных алгоритмов, ключей и секретов. Получатель сообщения Finished должен проверить пригодность его содержимого. После передачи стороной сообщения Finished, а также приема и проверки такого сообщения от партнера можно начинать передачу и прием данных через соединение.

      struct {
          opaque verify_data[verify_data_length];
      } Finished;

verify_data

PRF(master_secret, finished_label, Hash(handshake_messages)) [0..verify_data_length-1];

finished_label

Для сообщений Finished, переданных клиентом, это строка client finished, а для серверных сообщений Finished — server finished.

Hash обозначает хэш-значение для согласующих сообщений. Для PRF, определенной в разделе 5, значение Hash должно создаваться на основе этой PRF. Все шифронаборы, определяющие свои функции PRF, должны определять также функцию Hash для расчета сообщения Finished.

В предыдущих версиях TLS поле verify_data всегда имело размер 12 октетов, а в текущей версии TLS оно зависит от шифронабора. Если шифр не задает явно verify_data_length, используется значение verify_data_length = 12 (это относится ко всем существующим шифрам). Отметим, что это представление использует такое же кодирование, какое применялось в прежних версиях. Будущие шифронаборы могут задавать другой размер, но он во всех случаях должен быть не менее 12 байтов.

handshake_messages

Все данные из всех согласующих сообщений (кроме HelloRequest), не включая текущего. Это только данные, видимые на уровне согласования и не включающие заголовков уровня записи. Это поле является конкатенацией всех структур Handshake, определенных в параграфе 7.4 и использованных при обмене.

Если сообщение Finished не защищено ChangeCipherSpec на соответствующем этапе согласования, возникает критическая ошибка.

Значение handshake_messages включает все согласующие сообщения от клиентского hello до (но не включая) данного сообщения Finished. Оно может отличаться от handshake_messages в параграфе 7.4.8, поскольку будет включать сообщение о проверке сертификата (если оно передавалось). Кроме того, handshake_messages для сообщений Finished от клиента будет отличаться от аналогичного параметра для серверного сообщения, поскольку одно из них передается раньше другого и не будет учитывать более позднее.

Примечание. Сообщения ChangeCipherSpec, сигналы и другие типы записей не относятся к согласующим сообщениям и не включаются в расчет хэш-значения. Не учитываются и сообщения HelloRequest.

8. Криптографические расчеты

Для того, чтобы начать защиту соединения, протоколу TLS Record требуется спецификация набора алгоритмов, первичный секрет, а также случайные значения от клиента и сервера. Алгоритмы аутентификации, шифрования и MAC определяются значением cipher_suite, выбранным сервером и показанным в сообщении ServerHello. Алгоритм сжатия согласуется в сообщениях hello, они же служат для обмена случайными значениями. Остается лишь рассчитать первичный секрет.

8.1. Расчет первичного секрета

Для всех методов обмена ключами используется один алгоритм преобразования pre_master_secret в master_secret. После расчета первичного секрета (master_secret) предварительный (pre_master_secret) следует удалить из памяти.

      master_secret = PRF(pre_master_secret, "master secret",
                          ClientHello.random + ServerHello.random)
                          [0..47];

Первичный секрет всегда имеет размер 48 байтов. Размер предварительного секрета зависит от метода обмена ключами.

8.1.1. RSA

При использовании RSA для аутентификации сервера и обмена ключами клиент генерирует 48-байтовое значение pre_master_secret, шифрует его с помощью открытого ключа сервера и передает серверу. Сервер использует секретный ключ для расшифровки pre_master_secret. Обе стороны могут преобразовать pre_master_secret в master_secret, как указано выше.

Цифровые подписи RSA вычисляются с использованием блоков PKCS #1 [PKCS1] типа 1. Шифрование RSA с открытым ключом выполняется с использованием блоков PKCS #1 типа 2.

8.1.2. Diffie-Hellman

Выполняется обычный расчет по методу Diffie-Hellman. Согласованный ключ (Z) используется в качестве pre_master_secret и преобразуется в master_secret, как указано выше. Ведущие байты Z, содержащие только нулевые биты, вырезаются до использования ключа Z в качестве pre_master_secret15.

Примечание: Параметры Diffie-Hellman задаются сервером и могут быть эфемерными или содержащимися в сертификате сервера.

9. Обязательные шифронаборы

В отсутствие профиля приложения, задающего иное, соответствующее спецификации TLS приложение должно реализовать шифронабор TLS_RSA_WITH_AES_128_CBC_SHA (см. определение в Приложении A.5).

10. Прикладной протокол

Сообщения с данными приложений передаются уровнем Record и фрагментируются, сжимаются, шифруются в соответствии с текущим состоянием соединения. Сообщения трактуются как прозрачные данные для уровня Record.

11. Вопросы безопасности

Вопросы безопасности обсуждаются на протяжении всего документа и, особенно, в Приложениях D, E и F.

12. Взаимодействие с IANA

В этом документе используются некоторые реестры, изначально созданные в [TLS1.1]. Агентство IANA обновило эти реестры в соответствии с настоящим документом. Эти реестры и правила распределения значений в них (сохранившиеся от [TLS1.1]) перечислены ниже.

  • TLS ClientCertificateType Identifiers. Будущие значения из диапазона 0-63 (десятичные), включительно, присваиваются по процедуре Standards Action [RFC2434]. Значения из диапазона 64-223 (десятичные), включительно, присваиваются по процедуре Specification Required [RFC2434]. Значения из диапазона 224-255 (десятичные), включительно, резервируются для частных применений [RFC2434].

  • TLS Cipher Suite. Будущие значения с первым байтом из диапазона 0-191 (десятичные), включительно, присваиваются по процедуре RFC 2434 Standards Action. Значения с первым байтом из диапазона 192-254 (десятичные), включительно, присваиваются по процедуре [RFC2434] Specification Required. Значения с первым байтом 255 (десятичное) резервируются для частных применений (RFC 2434 Private Use).

  • Этот документ добавляет новые шифронаборы на базе HMAC-SHA256, значения для которых (Приложение A.5) выделяются из реестра TLS Cipher Suite.

  • TLS ContentType. Будущие значения выделяются по процедуре Standards Action [RFC2434].

  • TLS Alert. Будущие значения выделяются по процедуре Standards Action [RFC2434].

  • TLS HandshakeType. Будущие значения выделяются по процедуре Standards Action [RFC2434].

Этот документ использует также реестр, созданный в [RFC4366]. Агентство IANA обновило этот реестр. Реестр и правила распределения значений в нем (сохранившиеся от [RFC4366]) указаны ниже.

  • TLS ExtensionType. Будущие значения выделяются по процедуре IETF Consensus [RFC2434]. Агентство IANA обновило этот реестр, включив расширение signature_algorithms и соответствующее ему значение (см. параграф 7.4.1.4).

В дополнение к этому документ определяет два новых реестра, поддерживаемых агентством IANA.

  • TLS SignatureAlgorithm. Реестр изначально включает значения, описанные в параграфе 7.4.1.4.1. Будущие значения из диапазона 0-63 (десятичные), включительно, присваиваются по процедуре Standards Action [RFC2434]. Значения из диапазона 64-223 (десятичные), включительно, присваиваются по процедуре Specification Required [RFC2434]. Значения из диапазона 224-255 (десятичные), включительно, резервируются для частных применений [RFC2434].

  • TLS HashAlgorithm. Реестр изначально включает значения, описанные в параграфе 7.4.1.4.1. Будущие значения из диапазона 0-63 (десятичные), включительно, присваиваются по процедуре Standards Action [RFC2434]. Значения из диапазона 64-223 (десятичные), включительно, присваиваются по процедуре Specification Required [RFC2434]. Значения из диапазона 224-255 (десятичные), включительно, резервируются для частных применений [RFC2434].

    Этот документ использует также реестр TLS Compression Method Identifiers, определенный в [RFC3749]. Агентство IANA выделило значение 0 для метода сжатия null.

Приложение A. Протокольные константы и структуры данных

В этом разделе описаны протокольные типы и константы.

A.1. Уровень Record

   struct {
       uint8 major;
       uint8 minor;
   } ProtocolVersion;

   ProtocolVersion version = { 3, 3 };     /* TLS v1.2*/

   enum {
       change_cipher_spec(20), alert(21), handshake(22), application_data(23), (255)
   } ContentType;

   struct {
       ContentType type;
       ProtocolVersion version;
       uint16 length;
       opaque fragment[TLSPlaintext.length];
   } TLSPlaintext;

   struct {
       ContentType type;
       ProtocolVersion version;
       uint16 length;
       opaque fragment[TLSCompressed.length];
   } TLSCompressed;

   struct {
       ContentType type;
       ProtocolVersion version;
       uint16 length;
       select (SecurityParameters.cipher_type) {
           case stream: GenericStreamCipher;
           case block:  GenericBlockCipher;
           case aead:   GenericAEADCipher;
       } fragment;
   } TLSCiphertext;

   stream-ciphered struct {
       opaque content[TLSCompressed.length];
       opaque MAC[SecurityParameters.mac_length];
   } GenericStreamCipher;

   struct {
       opaque IV[SecurityParameters.record_iv_length];
       block-ciphered struct {
           opaque content[TLSCompressed.length];
           opaque MAC[SecurityParameters.mac_length];
           uint8 padding[GenericBlockCipher.padding_length];
           uint8 padding_length;
       };
   } GenericBlockCipher;

   struct {
      opaque nonce_explicit[SecurityParameters.record_iv_length];
      aead-ciphered struct {
          opaque content[TLSCompressed.length];
      };
   } GenericAEADCipher;

A.2. Сообщение Change Cipher Specs

   struct {
       enum { change_cipher_spec(1), (255) } type;
   } ChangeCipherSpec;

A.3. Сообщения Alert

   enum { warning(1), fatal(2), (255) } AlertLevel;

   enum {
       close_notify(0),
       unexpected_message(10),
       bad_record_mac(20),
       decryption_failed_RESERVED(21),
       record_overflow(22),
       decompression_failure(30),
       handshake_failure(40),
       no_certificate_RESERVED(41),
       bad_certificate(42),
       unsupported_certificate(43),
       certificate_revoked(44),
       certificate_expired(45),
       certificate_unknown(46),
       illegal_parameter(47),
       unknown_ca(48),
       access_denied(49),
       decode_error(50),
       decrypt_error(51),
       export_restriction_RESERVED(60),
       protocol_version(70),
       insufficient_security(71),
       internal_error(80),
       user_canceled(90),
       no_renegotiation(100),
       unsupported_extension(110),           /* новое */
       (255)
   } AlertDescription;

   struct {
       AlertLevel level;
       AlertDescription description;
   } Alert;

A.4. Протокол Handshake

   enum {
       hello_request(0), client_hello(1), server_hello(2),
       certificate(11), server_key_exchange (12),
       certificate_request(13), server_hello_done(14),
       certificate_verify(15), client_key_exchange(16),
       finished(20),
       (255)
   } HandshakeType;

   struct {
       HandshakeType msg_type;
       uint24 length;
       select (HandshakeType) {
           case hello_request:       HelloRequest;
           case client_hello:        ClientHello;
           case server_hello:        ServerHello;
           case certificate:         Certificate;
           case server_key_exchange: ServerKeyExchange;
           case certificate_request: CertificateRequest;
           case server_hello_done:   ServerHelloDone;
           case certificate_verify:  CertificateVerify;
           case client_key_exchange: ClientKeyExchange;
           case finished:            Finished;
       } body;
   } Handshake;

A.4.1. Сообщения Hello

   struct { } HelloRequest;

   struct {
       uint32 gmt_unix_time;
       opaque random_bytes[28];
   } Random;

   opaque SessionID<0..32>;

   uint8 CipherSuite[2];

   enum { null(0), (255) } CompressionMethod;

   struct {
       ProtocolVersion client_version;
       Random random;
       SessionID session_id;
       CipherSuite cipher_suites<2..2^16-2>;
       CompressionMethod compression_methods<1..2^8-1>;
       select (extensions_present) {
           case false:
               struct {};
           case true:
               Extension extensions<0..2^16-1>;
       };
   } ClientHello;

   struct {
       ProtocolVersion server_version;
       Random random;
       SessionID session_id;
       CipherSuite cipher_suite;
       CompressionMethod compression_method;
       select (extensions_present) {
           case false:
               struct {};
           case true:
               Extension extensions<0..2^16-1>;
       };
   } ServerHello;

   struct {
       ExtensionType extension_type;
       opaque extension_data<0..2^16-1>;
   } Extension;

   enum {
       signature_algorithms(13), (65535)
   } ExtensionType;

   enum{
       none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5),
       sha512(6), (255)
   } HashAlgorithm;
   enum {
      anonymous(0), rsa(1), dsa(2), ecdsa(3), (255)
   } SignatureAlgorithm;

   struct {
         HashAlgorithm hash;
         SignatureAlgorithm signature;
   } SignatureAndHashAlgorithm;

   SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>16;

A.4.2. Сообщения при аутентификации сервера и обмене ключами

   opaque ASN.1Cert<1..2^24-1>;17

   struct {
       ASN.1Cert certificate_list<0..2^24-1>;
   } Certificate;

   enum { dhe_dss, dhe_rsa, dh_anon, rsa,dh_dss, dh_rsa
          /* может быть расширено — например, для ECDH — см. [TLSECC] */
        } KeyExchangeAlgorithm;

   struct {
       opaque dh_p<1..2^16-1>;
       opaque dh_g<1..2^16-1>;
       opaque dh_Ys<1..2^16-1>;
   } ServerDHParams;     /* Эфемерные параметры DH */

   struct {
       select (KeyExchangeAlgorithm) {
           case dh_anon:
               ServerDHParams params;
           case dhe_dss:
           case dhe_rsa:
               ServerDHParams params;
               digitally-signed struct {
                   opaque client_random[32];
                   opaque server_random[32];
                   ServerDHParams params;
               } signed_params;
           case rsa:
           case dh_dss:
           case dh_rsa:
               struct {} ;
              /* сообщение может быть опущено для rsa, dh_dss и dh_rsa */
           /* может быть расширено — например, для ECDH — см. [TLSECC] */
       }18
   } ServerKeyExchange;

   enum {
       rsa_sign(1), dss_sign(2), rsa_fixed_dh(3), dss_fixed_dh(4),
       rsa_ephemeral_dh_RESERVED(5), dss_ephemeral_dh_RESERVED(6),
       fortezza_dms_RESERVED(20),
       (255)
   } ClientCertificateType;

   opaque DistinguishedName<1..2^16-1>;

   struct {
       ClientCertificateType certificate_types<1..2^8-1>;
       SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>;19
       DistinguishedName certificate_authorities<0..2^16-1>;
   } CertificateRequest;

   struct { } ServerHelloDone;

A.4.3. Сообщения при аутентификации клиента и обмене ключами

   struct {
       select (KeyExchangeAlgorithm) {
           case rsa:
               EncryptedPreMasterSecret;
           case dhe_dss:
           case dhe_rsa:
           case dh_dss:
           case dh_rsa:
           case dh_anon:
               ClientDiffieHellmanPublic;
       } exchange_keys;
   } ClientKeyExchange;

   struct {
       ProtocolVersion client_version;
       opaque random[46];
   } PreMasterSecret;

   struct {
       public-key-encrypted PreMasterSecret pre_master_secret;
   } EncryptedPreMasterSecret;

   enum { implicit, explicit } PublicValueEncoding;

   struct {
       select (PublicValueEncoding) {
           case implicit: struct {};
           case explicit: opaque DH_Yc<1..2^16-1>;
       } dh_public;
   } ClientDiffieHellmanPublic;

   struct {
        digitally-signed struct {
            opaque handshake_messages[handshake_messages_length];
        }
   } CertificateVerify;

A.4.4. Сообщение о завершении согласования

   struct {
       opaque verify_data[verify_data_length];
   } Finished;

A.5. Шифронаборы

Ниже определены коды шифронаборов CipherSuite, используемых в сообщениях ClientHello и ServerHello.

Значение CipherSuite определяет спецификацию шифра, поддерживаемого протоколом TLS версии 1.2.

Код TLS_NULL_WITH_NULL_NULL определяет начальное состояние соединения TLS в процессе первого согласования для данного канала, но этот шифр недопустимо согласовывать, поскольку он не обеспечивает какой-либо защиты.

      CipherSuite TLS_NULL_WITH_NULL_NULL               = { 0x00,0x00 };

Приведенные ниже коды CipherSuite требуют от сервера обеспечения сертификата RSA, который может использоваться при обмене ключами. Сервер может запросить поддерживающий подписи сертификат в сообщении с запросом сертификата.

      CipherSuite TLS_RSA_WITH_NULL_MD5                 = { 0x00,0x01 };
      CipherSuite TLS_RSA_WITH_NULL_SHA                 = { 0x00,0x02 };
      CipherSuite TLS_RSA_WITH_NULL_SHA256              = { 0x00,0x3B };
      CipherSuite TLS_RSA_WITH_RC4_128_MD5              = { 0x00,0x04 };
      CipherSuite TLS_RSA_WITH_RC4_128_SHA              = { 0x00,0x05 };
      CipherSuite TLS_RSA_WITH_3DES_EDE_CBC_SHA         = { 0x00,0x0A };
      CipherSuite TLS_RSA_WITH_AES_128_CBC_SHA          = { 0x00,0x2F };
      CipherSuite TLS_RSA_WITH_AES_256_CBC_SHA          = { 0x00,0x35 };
      CipherSuite TLS_RSA_WITH_AES_128_CBC_SHA256       = { 0x00,0x3C };
      CipherSuite TLS_RSA_WITH_AES_256_CBC_SHA256       = { 0x00,0x3D };

Приведенные ниже значения CipherSuite используются для аутентифицируемого сервером (опционально, и клиентом) механизма Diffie-Hellman. DH обозначает шифронаборы, в которых сертификат сервера включает параметры Diffie-Hellman, подписанные удостоверяющим центром (CA). DHE обозначает эфемерные значения Diffie-Hellman, где параметры Diffie-Hellman подписаны сертификатом DSS или RSA, который, в свою очередь, подписан УЦ. Используемый алгоритм подписи задается после параметра DH или DHE. Сервер может запросить у клиента сертификат RSA или DSS с возможностью подписи для его аутентификации или запросить сертификат Diffie-Hellman. Любые сертификаты Diffie-Hellman, предоставляемые клиентом, должны использовать описанные сервером параметры (группа и генератор).

      CipherSuite TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA      = { 0x00,0x0D };
      CipherSuite TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA      = { 0x00,0x10 };
      CipherSuite TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA     = { 0x00,0x13 };
      CipherSuite TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA     = { 0x00,0x16 };
      CipherSuite TLS_DH_DSS_WITH_AES_128_CBC_SHA       = { 0x00,0x30 };
      CipherSuite TLS_DH_RSA_WITH_AES_128_CBC_SHA       = { 0x00,0x31 };
      CipherSuite TLS_DHE_DSS_WITH_AES_128_CBC_SHA      = { 0x00,0x32 };
      CipherSuite TLS_DHE_RSA_WITH_AES_128_CBC_SHA      = { 0x00,0x33 };
      CipherSuite TLS_DH_DSS_WITH_AES_256_CBC_SHA       = { 0x00,0x36 };
      CipherSuite TLS_DH_RSA_WITH_AES_256_CBC_SHA       = { 0x00,0x37 };
      CipherSuite TLS_DHE_DSS_WITH_AES_256_CBC_SHA      = { 0x00,0x38 };
      CipherSuite TLS_DHE_RSA_WITH_AES_256_CBC_SHA      = { 0x00,0x39 };
      CipherSuite TLS_DH_DSS_WITH_AES_128_CBC_SHA256    = { 0x00,0x3E };
      CipherSuite TLS_DH_RSA_WITH_AES_128_CBC_SHA256    = { 0x00,0x3F };
      CipherSuite TLS_DHE_DSS_WITH_AES_128_CBC_SHA256   = { 0x00,0x40 };
      CipherSuite TLS_DHE_RSA_WITH_AES_128_CBC_SHA256   = { 0x00,0x67 };
      CipherSuite TLS_DH_DSS_WITH_AES_256_CBC_SHA256    = { 0x00,0x68 };
      CipherSuite TLS_DH_RSA_WITH_AES_256_CBC_SHA256    = { 0x00,0x69 };
      CipherSuite TLS_DHE_DSS_WITH_AES_256_CBC_SHA256   = { 0x00,0x6A };
      CipherSuite TLS_DHE_RSA_WITH_AES_256_CBC_SHA256   = { 0x00,0x6B };

Приведенные ниже коды используются для завершения анонимных коммуникаций Diffie-Hellman, в которых аутентификация сторон не выполняется. Отметим, что этот режим уязвим для MITM-атак и, следовательно, его применение ограничено — эти шифры недопустимо применять в реализациях TLS 1.2, если прикладной уровень специально не запросил использование анонимных ключей (анонимный обмен ключами может быть приемлем в отдельных случаях, например, для поддержки условного (opportunistic) шифрования без использования аутентификации или в случаях применения TLS, как части более сложного протокола, обеспечивающего иные способы проверки подлинности).

      CipherSuite TLS_DH_anon_WITH_RC4_128_MD5          = { 0x00,0x18 };
      CipherSuite TLS_DH_anon_WITH_3DES_EDE_CBC_SHA     = { 0x00,0x1B };
      CipherSuite TLS_DH_anon_WITH_AES_128_CBC_SHA      = { 0x00,0x34 };
      CipherSuite TLS_DH_anon_WITH_AES_256_CBC_SHA      = { 0x00,0x3A };
      CipherSuite TLS_DH_anon_WITH_AES_128_CBC_SHA256   = { 0x00,0x6C };
      CipherSuite TLS_DH_anon_WITH_AES_256_CBC_SHA256   = { 0x00,0x6D };

Отметим, что использование неанонимных методов обмена ключами без реальной проверки этого обмена по сути дела равносильно анонимному обмену и требует таких же мер предосторожности. Хотя неанонимные методы обмена в общем случае включают больше расчетов по сравнению с анонимными, для обеспечения совместимости может представлять интерес отказ от отключения неанонимного обмена в тех случаях, когда прикладной уровень разрешает анонимный.

Новые коды шифронаборов выделяются агентством IANA, как описано в разделе 12.

Примечание. Значения кодов { 0x00, 0x1C } и { 0x00, 0x1D } зарезервированы для предотвращения конфликтов с шифрами на базе Fortezza в SSL3.

A.6. Параметры защиты

Параметры защиты определяются протоколом TLS Handshake и предоставляются протоколу уровня TLS Record для инициализации состояния соединения. Параметры защиты (SecurityParameters) включают:

   enum { null(0), (255) } CompressionMethod;
   enum { server, client } ConnectionEnd;
   enum { tls_prf_sha256 } PRFAlgorithm;
   enum { null, rc4, 3des, aes } BulkCipherAlgorithm;
   enum { stream, block, aead } CipherType;
   enum { null, hmac_md5, hmac_sha1, hmac_sha256, hmac_sha384, hmac_sha512} MACAlgorithm;
   /* К алгоритмам, указанным в CompressionMethod, PRFAlgorithm, BulkCipherAlgorithm и
   MACAlgorithm могут быть добавлены другие значения. */

   struct {
       ConnectionEnd          entity;
       PRFAlgorithm           prf_algorithm;
       BulkCipherAlgorithm    bulk_cipher_algorithm;
       CipherType             cipher_type;
       uint8                  enc_key_length;
       uint8                  block_length;
       uint8                  fixed_iv_length;
       uint8                  record_iv_length;
       MACAlgorithm           mac_algorithm;
       uint8                  mac_length;
       uint8                  mac_key_length;
       CompressionMethod      compression_algorithm;
       opaque                 master_secret[48];
       opaque                 client_random[32];
       opaque                 server_random[32];
   } SecurityParameters;

A.7. Отличия от RFC 4492

В RFC 4492 [TLSECC] в протокол TLS была добавлена поддержка шифронаборов на основе эллиптических кривых (Elliptic Curve). Данный документ меняет некоторые структуры, используемые в упомянутом документе. В этом параграфе описаны требуемые изменения для реализаций, поддерживающий одновременно RFC 4492 и TLS 1.2. Разработчики TLS 1.2, не реализующие RFC 4492, могут пропустить этот параграф.

Данный документ добавляет поле signature_algorithm в элементы с цифровой подписью для идентификации алгоритмов подписи и хэширования, использованных для создания подписи. Это изменение применимо также к цифровым подписям, созданным с использованием ECDSA, позволяя применять такие подписи с алгоритмами, отличными от SHA-1, когда это совместимо с сертификатами и всеми ограничениями, которые могут быть внесены в будущих версиях [PKIX].

Как было описано в параграфах 7.4.2 и 7.4.6, ограничения на алгоритмы цифровой подписи для сертификатов больше не привязаны к шифронабору (для серверов) или ClientCertificateType (для клиентов). Таким образом, ограничения на алгоритмы подписи сертификатов, заданные в разделах 2 и 3 RFC 4492, также смягчаются. Как и в настоящем документе, ограничения на ключи в сертификатах конечных элементов сохраняются.

Приложение B. Глоссарий

Advanced Encryption Standard (AES) — усовершенствованный стандарт шифрования

AES [AES] представляет собой широко распространенный симметричный алгоритм шифрования. Это блочный шифр с ключами размером 128, 192 или 256 битов и размером блока 16 байтов. TLS в настоящее время поддерживает только ключи размером 128 и 256 битов.

application protocol – прикладной протокол

Протокол, который обычно располагается непосредственно над транспортным уровнем (например, TCP/IP). Примерами прикладных протоколов могут служит HTTP, TELNET, FTP, SMTP.

asymmetric cipher – асимметричный шифр

См. public key cryptography.

authentication — аутентификация

Способность одного объекта проверить подлинность другого объекта.

authenticated encryption with additional data (AEAD) — аутентифицированное шифрование с дополнительными данными

Симметричный алгоритм шифрования, обеспечивающий защиту конфиденциальности и целостности сообщений.

block cipher – блочный шифр

Блочными шифрами называются алгоритмы шифрования, работающие с текстом (данными), как с группами битов, называемыми блоками. Типичный размер блока составляет 64 или 128 битов.

bulk cipher

Симметричный алгоритм, используемый для шифрования больших объемов данных.

cipher block chaining (CBC) — сцепка шифрованных блоков

В режиме CBC для каждого шифруемого блока сначала применяется логическая операция «Исключающее-ИЛИ» (XOR) с предыдущим зашифрованным блоком (или, при шифровании первого блока, с вектором инициализации — IV). При расшифровке блок сначала дешифруется, затем применяется операция XOR с предыдущим шифрованным блоком (или IV).

certificate — сертификат

Будучи частью протокола X.509 (модель аутентификации ISO), сертификат выделяется удостоверяющим центром (Certificate Authority) и обеспечивает строгую связь между его владельцем или некими иными атрибутами и открытым ключом.

client — клиент

Объект-приложение, инициирующий соединение TLS с сервером. При этом клиент может инициировать организацию нижележащего транспортного соединения. Основное различие между клиентом и сервером заключается в их аутентификации — для сервера она используется всегда, а для клиента — по желанию.

client write key — клиентский ключ записи

Ключ, используемый для шифрования данных, записываемых клиентом.

client write MAC secret — клиентский MAC-секрет для записи

Секретное значение, служащее для аутентификации данных, записываемых клиентом.

connection — соединение

Соединением называется транспорт (в терминологии модели OSI), обеспечивающий приемлемый тип обслуживания. Для TLS используются соединения «точка-точка». Соединения являются временными, каждое соединение связано с одной сессией.

Data Encryption Standard — стандарт шифрования данных

DES [DES] является широко распространенным симметричным алгоритмом шифрования. DES представляет собой блочный шифр с 56-битовым ключом и 8-байтовыми блоками. Отметим, что в TLS при генерации ключей размер ключей DES трактуется, как 8 байтов (64 бита), но реально для защиты обеспечивается лишь 56 битов (младший бит каждого байта ключа предполагается установленным для обеспечения нечетности данного байта). DES также может работать в режиме [3DES], где для каждого блока данных используется три независимых ключа и 3-кратное шифрование. В этом случае получается размер ключа 168 битов (24 байта при генерации ключей в TLS) и обеспечивается эквивалент защиты с использованием ключей размером 112 битов.

Digital Signature Standard (DSS) – стандарт цифровой подписи

Стандарт для цифровой подписи, включающий алгоритм цифровой подписи (Digital Signing Algorithm), одобренный NIST20 и опубликованный в январе 2000 г. Департаментом торговли США (U.S. Dept. of Commerce) в документе NIST FIPS PUB 186-2, Digital Signature Standard [DSS]. В марте 2006 г. был опубликован новый вариант предварительного стандарта с существенными обновлениями [DSS-3].

digital signatures – цифровые подписи

Цифровые подписи используют криптографию с открытым ключом и необратимые хэш-функции для создания подписи данных, которые требуют заверения. Цифровую подпись сложно подделать и от нее сложно отказаться.

handshake — согласование

Начальное согласование параметров транзакций между клиентом и сервером.

Initialization Vector (IV) – вектор инициализации

Для блочных шифров в режиме CBC вектор инициализации используется в операции XOR с первым шифруемым блоком до его шифрования.

IDEA

Блочный шифр с размером блока 64 бита, разработанный Xuejia Lai и James Massey [IDEA].

Message Authentication Code (MAC) – код аутентификации сообщения

Код аутентификации сообщения (MAC) представляет собой необратимое хэш-значение, рассчитанное с использованием содержимого сообщения и неких секретных данных. Такой код трудно подменить, не имея информации об использованных при его создании секретных данных. Код позволяет обнаружить изменение сообщения.

master secret — первичный секрет

Защищенные секретные данные, используемые для генерации ключей шифрования, секретов MAC и IV.

MD5

Защищенная функция хеширования MD5 [MD5] позволяет преобразовать поток данных произвольной длины в сигнатуру фиксированного размера (16 байтов). В результате существенного развития криптоанализа на момент публикации этого документа функция MD5 уже не считалась «безопасной» функцией хэширования.

public key cryptography – шифрование с открытым ключом

Класс криптографических методов, реализующих шифры с двумя ключами. Зашифрованное с использованием открытого ключа сообщение может быть расшифровано лишь с помощью связанного с этим открытым ключом секретного ключа. Подписи, созданные с помощью секретного ключа, можно проверить с открытым ключом.

one-way hash function – необратимая хэш-функция

Однонаправленное преобразование, которое конвертирует произвольное количество данных в хэш-значение фиксированного размера. Обращение преобразования или поиск коллизий21 будут требовать значительных вычислительных ресурсов. Примерами однонаправленных хэш-функций являются MD5 и SHA.

RC4

Потоковый шифр, разработанный Ron Rivest. Совместимый шифр описан в [SCH].

RSA

Широко используемый алгоритм с открытым ключом, который может служить для шифрования и подписи [RSA].

salt — затравка

Несекретные случайные данные, служащие для создания экспортируемых ключей шифрования, стойких к атакам.

server — сервер

Прикладной объект, принимающий запросы на соединения от клиентов. См. также client.

session – сессия, сеанс

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

session identifier – идентификатор сессии

Генерируемое сервером значение, которое служит для идентификации конкретной сессии.

server write key — серверный ключ записи

Ключ, служащий для шифрования данных, записываемых сервером.

server write MAC secret — серверный секрет MAC для записи

Секретный данные, служащие для аутентификации записываемых сервером данных.

SHA

Алгоритм защищенного хэширования SHA22, определенный в FIPS PUB 180-2. Выходное значение имеет размер 20 байтов. Отметим, что все ссылки на SHA (без указания номера) в реальности относятся к модификации алгоритма SHA-1 [SHA].

SHA-256

256-битовый вариант алгоритма SHA, определенный в FIPS PUB 180-2. Размер выходного значения составляет 32 байта.

SSL

Протокол защищенного сокета SSL23 [SSL3] компании Netscape. Протокол TLS основан на SSL версии 3.0.

stream cipher – потоковый шифр

Алгоритм шифрования, преобразующий ключ в (строго) криптографически защищенный поток, который применяется для логической операции XOR с незашифрованными данными.

symmetric cipher – симметричный шифр

См. bulk cipher на стр. 35.

Transport Layer Security (TLS) — защита транспортного уровня

Данный протокол, а также рабочая группа Transport Layer Security в IETF. См. параграф «Информация о рабочей группе» в конце документа.

Приложение C. Определения шифронаборов

CipherSuite

Обмен ключами

Шифр

Хэш

TLS_NULL_WITH_NULL_NULL

NULL

NULL

NULL

TLS_RSA_WITH_NULL_MD5

RSA

NULL

MD5

TLS_RSA_WITH_NULL_SHA

RSA

NULL

SHA

TLS_RSA_WITH_NULL_SHA256

RSA

NULL

SHA256

TLS_RSA_WITH_RC4_128_MD5

RSA

RC4_128

MD5

TLS_RSA_WITH_RC4_128_SHA

RSA

RC4_128

SHA

TLS_RSA_WITH_3DES_EDE_CBC_SHA

RSA

3DES_EDE_CBC

SHA

TLS_RSA_WITH_AES_128_CBC_SHA

RSA

AES_128_CBC

SHA

TLS_RSA_WITH_AES_256_CBC_SHA

RSA

AES_256_CBC

SHA

TLS_RSA_WITH_AES_128_CBC_SHA256

RSA

AES_128_CBC

SHA256

TLS_RSA_WITH_AES_256_CBC_SHA256

RSA

AES_256_CBC

SHA256

TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA

DH_DSS

3DES_EDE_CBC

SHA

TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA

DH_RSA

3DES_EDE_CBC

SHA

TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA

DHE_DSS

3DES_EDE_CBC

SHA

TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA

DHE_RSA

3DES_EDE_CBC

SHA

TLS_DH_anon_WITH_RC4_128_MD5

DH_anon

RC4_128

MD5

TLS_DH_anon_WITH_3DES_EDE_CBC_SHA

DH_anon

3DES_EDE_CBC

SHA

TLS_DH_DSS_WITH_AES_128_CBC_SHA

DH_DSS

AES_128_CBC

SHA

TLS_DH_RSA_WITH_AES_128_CBC_SHA

DH_RSA

AES_128_CBC

SHA

TLS_DHE_DSS_WITH_AES_128_CBC_SHA

DHE_DSS

AES_128_CBC

SHA

TLS_DHE_RSA_WITH_AES_128_CBC_SHA

DHE_RSA

AES_128_CBC

SHA

TLS_DH_anon_WITH_AES_128_CBC_SHA

DH_anon

AES_128_CBC

SHA

TLS_DH_DSS_WITH_AES_256_CBC_SHA

DH_DSS

AES_256_CBC

SHA

TLS_DH_RSA_WITH_AES_256_CBC_SHA

DH_RSA

AES_256_CBC

SHA

TLS_DHE_DSS_WITH_AES_256_CBC_SHA

DHE_DSS

AES_256_CBC

SHA

TLS_DHE_RSA_WITH_AES_256_CBC_SHA

DHE_RSA

AES_256_CBC

SHA

TLS_DH_anon_WITH_AES_256_CBC_SHA

DH_anon

AES_256_CBC

SHA

TLS_DH_DSS_WITH_AES_128_CBC_SHA256

DH_DSS

AES_128_CBC

SHA256

TLS_DH_RSA_WITH_AES_128_CBC_SHA256

DH_RSA

AES_128_CBC

SHA256

TLS_DHE_DSS_WITH_AES_128_CBC_SHA256

DHE_DSS

AES_128_CBC

SHA256

TLS_DHE_RSA_WITH_AES_128_CBC_SHA256

DHE_RSA

AES_128_CBC

SHA256

TLS_DH_anon_WITH_AES_128_CBC_SHA256

DH_anon

AES_128_CBC

SHA256

TLS_DH_DSS_WITH_AES_256_CBC_SHA256

DH_DSS

AES_256_CBC

SHA256

TLS_DH_RSA_WITH_AES_256_CBC_SHA256

DH_RSA

AES_256_CBC

SHA256

TLS_DHE_DSS_WITH_AES_256_CBC_SHA256

DHE_DSS

AES_256_CBC

SHA256

TLS_DHE_RSA_WITH_AES_256_CBC_SHA256

DHE_RSA

AES_256_CBC

SHA256

TLS_DH_anon_WITH_AES_256_CBC_SHA256

DH_anon

AES_256_CBC

SHA256


Шифр

Тип

Ключевой материал

IV (бит)

Размер блока

NULL

Поток

0

0

RC4_128

Поток

16

0

3DES_EDE_CBC

Блок

24

8

8

AES_128_CBC

Блок

16

16

16

AES_256_CBC

Блок

32

16

16


MAC

Алгоритм

mac_length

mac_key_length

NULL

0

0

MD5

HMAC-MD5

16

16

SHA

HMAC-SHA1

20

20

SHA256

HMAC-SHA256

32

32

Type — тип шифра

Показывает, является данных шифр потоковым или блочным в режиме CBC.

Key Material — размер ключевого материала

Число байтов из key_block, используемых для генерации ключей записи.

IV Size — размер векторов инициализации

Объем данных, требуемых для генерации вектора инициализации — 0 для потоковых шифров, размер блока для блочных (совпадает с SecurityParameters.record_iv_length).

Block Size — размер блока

Размер данных, шифруемых блочным шифром в один прием (chunk). Блочные шифры в режиме CBC могут шифровать только целое количество блоков.

Приложение D. Рекомендации для разработчиков

Протокол TLS не может предотвратить многие ошибки защиты общего плана. В этом приложении приведены некоторые рекомендации для разработчиков.

D.1. Генерация случайных чисел и «затравки»

TLS требует наличия криптографически защищенного генератора псевдослучайных чисел (PRNG24). Следует обращать пристальное внимание на устройство и начальное состояние (seeding) PRNG. Генераторы на основе защищенных хэш-операций (типа SHA-1) являются подходящими, но не могут обеспечить более надежную защиту, чем размер состояния генератора случайных чисел.

Для оценки объема создаваемого «затравочного» материала (seed) следует добавить множество битов непредсказуемой информации в каждом «затравочном» байте. Например, моменты нажатия клавиш, взятые от PC-совместимого таймера с частотой 18,2 Гц обеспечивают 1 или 2 защищенных бита каждый, даже если суммарное значение счетчика имеет размер 16 или более битов. Для «затравки» 128-битового PRNG будет требоваться около 100 таких значений.

В документе [RANDOM] приведены рекомендации по генерации случайных значений.

D.2. Сертификаты и аутентификация

Реализации отвечают за проверку целостности сертификатов и в общем случае им следует поддерживать сообщения отзыва сертификатов. Сертификаты всегда следует проверять на предмет наличия подписи доверенного УЦ (CA). Выбор и добавление доверенных удостоверяющих центров следует выполнять с осторожностью. Пользователи должны иметь возможность просмотра информации о сертификате и корневом УЦ.

D.3. Шифронаборы

TLS поддерживает широкий диапазон размеров ключей и уровней защиты, включая некоторые варианты с минимальной защитой или совсем без таковой. Корректная реализация может не поддерживать многие из шифронаборов. Например, анонимный механизм Diffie-Hellman настоятельно не рекомендуется использовать, поскольку он неустойчив к MITM-атакам. Приложениям следует также задавать верхнюю и нижнюю границу размера ключей. Например, цепочки сертификатов, содержащие 512-битовые ключи или подписи RSA, не подходят для приложений с требованиями надежной защиты.

D.4. «Подводные камни» реализации

Опыт реализации протокола показывает, что некоторые части ранних спецификаций TLS были непросты для понимания и служили источником проблем взаимодействия и защиты. Многие из таких вопросов прояснены в этом документе и данное приложение содержит краткий список наиболее важных из вопросов, требующих пристального внимания разработчиков.

  • Корректность обработки согласующих сообщений, разделенных по множеству записей (параграф 6.2.1). Экстремальные случаи типа разбиения сообщений ClientHello на несколько мелких фрагментов. Фрагментирование согласующих сообщений слишком большого размера (в частности сообщений с сертификатами и запросами сертификатов, которые могут быть достаточно велики).

  • Игнорирование номера версии на уровне TLS Records во всех записях TLS до сообщения ServerHello (Приложение E.1).

  • Корректность обработки расширений TLS в сообщениях ClientHello, включая полный пропуск поля расширений.

  • Поддержка согласования инициированного клиентом и сервером. Поддержка повторного согласования не является обязательной, но настоятельно рекомендуется.

  • Корректность обработки пустых сообщений Certificate в тех случаях, когда у клиента нет подходящего сертификата, запрошенного сервером (параграф 7.4.6).

Криптографические аспекты.

  • Корректность передачи и проверки номера версии в зашифрованных с помощью RSA предварительных секретах (Premaster Secret). Продолжение согласования в случае возникновения ошибок в связи с возможностью атак Bleichenbacher (параграф 7.4.7.1).

  • Меры противодействия timing-атакам против операций RSA, связанных с расшифровкой и подписями (параграф 7.4.7.1).

  • Восприятие значений NULL и пропущенных параметров при проверке подписей RSA (параграф 4.7). Проверка наличия в заполнении RSA дополнительных данных после хэш-значения [FI06].

  • Вырезание ведущих байтов со значением 0 из согласованных ключей при использовании обмена ключами Diffie-Hellman (параграф 8.1.2).

  • Проверка клиентом TLS пригодности переданных сервером параметров Diffie-Hellman (параграф F.1.1.3).

  • Генерация непредсказуемых значений IV для блочных шифров в режиме CBC (параграф 6.2.3.2).

  • Восприятие увеличенного заполнения в режиме CBC (вплоть до 255 байтов, см. параграф 6.2.3.2).

  • Предотвращение timing-атак в режиме CBC (параграф 6.2.3.2).

  • Использование качественного и, что более важно, с хорошей «затравкой» генератора случайных чисел (Приложение D.1) для создания предварительного секрета (при обмене ключами RSA), секретных значений Diffie-Hellman, параметра k для DSA и других, важных для защиты значений.

Приложение E. Совместимость с ранними версиями

E.1. Совместимость с TLS 1.0/1.1 и SSL 3.0

По причине наличия нескольких версий TLS (1.0, 1.1, 1.2 и любые будущие версии) и SSL (2.0 и 3.0) требуется согласовывать применение конкретного протокола. TLS обеспечивает встроенный механизм согласования, избавляющий остальные компоненты протокола от сложностей, связанных с выбором версии.

Протоколы TLS 1.0, 1.1, 1.2 и SSL 3.0 очень похожи и используют совместимые сообщения ClientHello, поддержка нескольких протоколов сравнительно проста. Серверы смогут обслуживать клиентов, пытающихся использовать будущие версии TLS, пока формат сообщений ClientHello остается совместимым, а клиенты поддерживают максимальную версию протокола, предлагаемую сервером.

Клиенты TLS 1.2, желающие получить согласование со старыми серверами, будут направлять серверу обычное сообщение TLS 1.2 ClientHello, содержащее { 3, 3 } (TLS 1.2) в поле ClientHello.client_version. Если сервер не поддерживает эту версию, он будет отвечать сообщением ServerHello, содержащим номер поддерживаемой версии. Если клиент согласен на применение этой версии, дальнейшее согласование выполняется как обычно.

Если выбранная сервером версия не поддерживается клиентом (или неприемлема для него), клиент должен передать сообщение с сигналом protocol_version и разорвать соединение.

Если сервер TLS получает сообщение ClientHello с номером версии выше максимально поддерживаемого им, он должен возвращать отклик в соответствии со старшей из поддерживаемых версий.

Сервер TLS может также получить сообщение ClientHello с номером версии меньше старшего из поддерживаемых им. Если сервер готов работать со старым клиентом, он будет обрабатывать сообщение в соответствии с максимальным из поддерживаемых им номеров версий, который не превышает указанного в ClientHello.client_version. Например, если сервер поддерживает TLS 1.0, 1.1 и 1.2, а клиент указал в client_version TLS 1.0, сервер будет отвечать сообщением TLS 1.0 ServerHello. Если сервер поддерживает (или готов использовать) только версии с номерами больше client_version, он должен передать сообщение с сигналом protocol_version и разорвать соединение.

Когда клиенту известен наивысший протокол, поддерживаемый сервером (например, при возобновлении сессии), ему следует инициировать соединение именно с таким протоколом.

Примечание. Известно, что некоторые реализации серверов не могут корректно согласовать версию. Например, имеются серверы TLS 1.0 с ошибками, которые просто разрывают соединение, если клиент предлагает версию выше TLS 1.0. Известно также, что некоторые серверы будут отвергать соединения при наличии любых расширений TLS в сообщении ClientHello. Взаимодействие с такими серверами является сложной задачей, выходящей за рамки этого документа, и может потребовать от клиента множества попыток организации соединения.

В предыдущих версиях спецификации TLS не было четко указано, что при передаче сообщений ClientHello (т. е., до того, как станет известна версия протокола) в них следует включать номер версии уровня записи (TLSPlaintext.version). По этой причине серверы TLS, соответствующие данной спецификации, должны воспринимать значение {03,XX} в качестве номера версии уровня записи для сообщений ClientHello.

TLS, которые хотят согласовать работу со старым сервером, могут передавать любое значение {03,XX} в качестве номера версии уровня записи. Обычно используется минимальный поддерживаемый клиентом номер {03,00} и значение ClientHello.client_version. Нет какого-либо конкретного значения, которое будет гарантировать совместимость со старыми серверами, но эта сложная тема выходит за рамки документа.

E.2. Совместимость с SSL 2.0

Клиенты TLS 1.2, желающие работать с серверами SSL 2.0, должны передавать сообщения CLIENT-HELLO версии2.0, определенные в [SSL2]. Такое сообщение должно включать тот же номер версии, который использовался бы для обычного сообщения ClientHello, и должно указывать поддерживаемые шифронаборы TLS в поле CIPHER-SPECS-DATA, как описано ниже.

Предупреждение. Возможность отправки сообщений CLIENT-HELLO версии 2.0 будет исключена в ближайшем будущем, поскольку новый формат ClientHello обеспечивает более эффективный механизм для перехода к новым версиям и согласования расширений. Клиентам TLS 1.2 не следует поддерживать SSL 2.0.

Однако даже серверы TLS, не поддерживающие SSL 2.0, могут воспринимать сообщения CLIENT-HELLO версии 2.0. Формат сообщения представлен ниже с достаточной для разработчиков серверов TLS детализацией, полное определение можно найти в [SSL2].

Для целей согласования сообщения CLIENT-HELLO версии 2.0 интерпретируются так же, как сообщения ClientHello с компрессией null и без расширений. Отметим, что такое сообщение должно передаваться непосредственно в канал без инкапсуляции в TLS Record. При расчете Finished и CertificateVerify поле msg_length не считается частью согласующего сообщения.

      uint8 V2CipherSpec[3];
      struct {
          uint16 msg_length;
          uint8 msg_type;
          Version version;
          uint16 cipher_spec_length;
          uint16 session_id_length;
          uint16 challenge_length;
          V2CipherSpec cipher_specs[V2ClientHello.cipher_spec_length];
          opaque session_id[V2ClientHello.session_id_length];
          opaque challenge[V2ClientHello.challenge_length;
      } V2ClientHello;

msg_length

Старший бит поля должен иметь значение 1, а остальные указывают размер следующих за полем данных в байтах.

msg_type

Это поле вместе с полем номера версии идентифицирует клиентское сообщение hello версии 2 (должно иметь значение 1).

version

Совпадает с ClientHello.client_version.

cipher_spec_length

Это поле указывает общий размер поля cipher_specs. Значение поля не может быть нулевым и должно быть кратно размеру V2CipherSpec (3).

session_id_length

Это поле должно иметь значение 0 для клиента, заявляющего поддержку TLS 1.2.

challenge_length

Размер (в байтах) клиентского запроса к серверу для аутентификации самого себя. Исторически допустимые значения берутся из диапазона 16 — 32 (включительно). При использовании совместимого с SSLv2 согласования клиенту следует устанавливать значение 32.

cipher_specs

Список всех шифров CipherSpec, которые клиент может и хочет поддерживать. В дополнение к шифронаборам версии 2.0, определенным в [SSL2], список включает шифры TLS, обычно передаваемые в ClientHello.cipher_suites, с добавлением префиксного байта со значением 0. Например, шифр TLS {0x00,0x0A} будет передаваться как {0x00,0x00,0x0A}.

session_id

Это поле должно быть пустым.

challenge

Соответствует ClientHello.random. Если размер запроса меньше 32 байтов, сервер TLS будет дополнять его нулями слева (в начале) до нужного размера.

Примечание. В запросах на восстановление сессии TLS должно использоваться клиентское сообщение TLS hello.

E.2. Предотвращение MITM-атак на снижение версии

При снижении клиентом TLS требований до режима совместимости с 2.0 следует использовать специальное форматирование блоков PKCS #1. В этом случае серверы TLS будут отвергать сессии 2.0 для поддерживающих TLS клиентов.

Когда клиенты TLS работают в режиме совместимости с версией 2.0, они должны устанавливать в правых (наименее значимых) 8 случайных байтах заполнения PKCS (не включая завершающий null-символ) для шифрования RSA в поле ENCRYPTED-KEY-DATA ключа CLIENT-MASTER-KEY значение 0x03 (остальная часть заполнения остается случайной).

Когда поддерживающий TLS сервер согласует режим SSL 2.0, ему следует после расшифровки ENCRYPTED-KEY-DATA проверить значение 8 последних байтов заполнения. Если значение отличается от 0x03, серверу следует генерировать случайное значение для SECRET-KEY-DATA и продолжить согласование (которое может завершиться отказом по причине несоответствия ключей). Отметим, что передача в таких случаях клиенту сообщения об ошибке может сделать сервер уязвимым к атаке, описанной в [BLEI].25

Приложение F. Анализ защиты

Протокол TLS предназначен для организации защищенных соединений между клиентом и сервером через незащищенные каналы. В этом документе приняты некоторые традиционные допущения, включая наличие значительных вычислительных ресурсов атакующих и невозможность получения ими секретной информации из иных источников, кроме протокола. Предполагается, что атакующие могут захватывать, изменять, удалять и повторно использовать перехваченные в коммуникационном канале сообщения. В этом приложении показано, как TLS будет препятствовать различным типам атак.

F.1. Протокол согласования

Протокол согласования отвечает за выбор CipherSpec и генерацию первичного секрета (Master Secret), которые совместно определяют основные криптографические параметры, связанные с защищаемой сессией. Протокол согласования может также служить для взаимной аутентификации сторон, имеющих подписанные доверенным удостоверяющим центром сертификаты.

F.1.1. Аутентификация и обмен ключами

TLS поддерживает три режима проверки подлинности — аутентификация обеих сторон, аутентификация только сервера и общая анонимность. При работе с аутентифицированным сервером канал будет защищен от MITM-атак, но анонимные сессии могут быть подвержены таким атакам. Анонимные серверы не могут аутентифицировать клиентов. Если сервер аутентифицирован, его сообщение с сертификатом должно содержать корректную цепочку сертификатов, ведущую к доверенному УЦ. Аналогично, аутентифицированные клиенты должны предоставлять сертификат, приемлемый для сервера. Каждая сторона отвечает за проверку того, что сертификат другой стороны не отозван и срок его действия не завершился.

Общей целью процесса обмена ключами является создание предварительного секрета pre_master_secret, известного сторонам и недоступного для атакующих. Значение pre_master_secret будет использоваться для генерации первичного секрета master_secret (см. параграф 8.1). Значение master_secret требуется для генерации сообщений Finished, ключей шифрования и секретов MAC (см. параграфы 7.4.9 и 6.3). Передачей корректного сообщения Finished стороны подтверждают наличие корректного предварительного секрета pre_master_secret.

F.1.1.1. Анонимный обмен ключами

Полностью анонимные сессии можно организовать с использованием обмена ключами Diffie-Hellman. Открытые параметры сервера содержатся в серверном сообщении обмена ключами, а параметры клиента передаются в клиентском сообщении обмена ключами. Перехватчики данных, которым не известны секретные значения, не смогут получить результат Diffie-Hellman (т. е. pre_master_secret).

Предупреждение. Полностью анонимные соединения обеспечивают защиту лишь от пассивного перехвата. В средах, где возможны активные атаки MITM, требуется аутентификация сервера, если нет независимого защищенного от перехвата канала для проверки подлинности сообщений Finished.

F.1.1.2. Обмен ключами и аутентификация RSA

При использовании RSA обмен ключами и аутентификация сервера выполняются совместно. Открытый ключ содержится в сертификате сервера. Отметим, что в тех случаях, когда не используется эфемерный RSA, компрометация статического серверного ключа RSA приводит к потере конфиденциальности всех сессий, защищаемых с помощью этого ключа. Пользователям TLS, желающим получить совершенную защиту (Perfect Forward Secrecy), следует применять шифронаборы DHE. Ущерб в случае раскрытия секретного ключа может снижен за счет частой смены секретного ключа (и сертификата).

После проверки серверного сертификата клиент шифрует pre_master_secret с использованием открытого ключа сервера. После декодирования pre_master_secret и создания корректного сообщения Finished сервер показывает, что он знает секретный ключ, соответствующий сертификату сервера.

При использовании RSA для обмена ключами клиенты аутентифицируются с помощью сообщения проверки сертификата (см. параграф 7.4.8). Клиент подписывает значение, полученное из master_secret и предшествующих согласующих сообщений. Согласующие сообщения включают сертификат сервера, который привязан к подписи сервера, и случайное значение ServerHello.random, которое привязывает подпись к текущему процессу согласования.

F.1.1.3. Обмен ключами и аутентификация Diffie-Hellman

При использовании для обмена ключами алгоритма Diffie-Hellman сервер может предоставить сертификат с фиксированными параметрами Diffie-Hellman или использовать серверное сообщение обмена ключами для установки временных параметров Diffie-Hellman, подписанных сертификатом DSS или RSA. Временные параметры хэшируются со значениями hello.random перед созданием подписи для предотвращения возможности использования атакующими старых параметров. В любом случае клиент может проверить сертификат или подпись для обеспечения гарантии того, что параметры принадлежат серверу.

Если у клиента имеется сертификат с фиксированными параметрами Diffie-Hellman, этого сертификата будет достаточно для завершения обмена ключами. Отметим, что в этом случае клиент и сервер будут генерировать одинаковый результат Diffie-Hellman (т. е. pre_master_secret) при каждом взаимодействии. Чтобы предотвратить сохранение в памяти значения pre_master_secret, после завершения работы с ним это значение следует как можно скорее преобразовать в master_secret. Клиентские параметры Diffie-Hellman должны быть совместимы с такими же параметрами, представленными сервером, чтобы обмен ключами прошел нормально.

Если у клиента имеется стандартный сертификат DSS или RSA, а также для случаев, когда клиент не аутентифицирован, этот клиент устанавливает для сервера временные параметры в клиентском сообщении обмена ключами. Опционально может также использоваться сообщение проверки сертификата для аутентификации клиента.

Если одна ключевая пара DH будет использоваться для множества согласований по причине наличия у клиента и сервера сертификатов с фиксированной ключевой парой DH или по причине повторного использования сервером ключей DH, следует предпринять меры защиты от атак, связанных с малым размером подгруппы (small subgroup attack). Разработчикам следует воспользоваться рекомендациями [SUBGROUP].

Атак на малые подгруппы можно легко избежать, используя один из шифров DHE и генерируя для каждого согласования свежий секретный ключ DH (X). Если выбрана подходящая база (например, 2), значение gX mod p можно рассчитать очень быстро и потеря производительности будет минимальной. Кроме того, применение нового ключа для каждого согласования обеспечивает совершенную защиту (Perfect Forward Secrecy). Реализациям следует генерировать новое значение X для каждого согласования с использованием шифронаборов DHE.

Поскольку TLS позволяет серверам обеспечивать произвольные группы DH, клиенту следует проверять, соответствует ли размер группы DH требованиям локальной политики. Клиенту также следует проверять адекватность размера открытого показателя DH. В [KEYSIZ] приведены полезные рекомендации по оценке размеров групп. Сервер может помочь клиенту в предоставлении тому известной группы, как это описано в [IKEALG] и [MODP]. Это можно проверить простым сравнением.

F.1.2. Атаки со снижением версии

Поскольку TLS вносит существенные улучшения по сравнению с SSL версии 2.0, атакующие могут пытаться вынудить поддерживающие TLS серверы и клиентов снизить используемую версию до 2.0. Возможность такой атаки может возникать тогда (и только тогда), когда две поддерживающих TLS стороны используют согласование SSL 2.0.

Хотя решение на основе использования неслучайного заполнения в блоках PKCS #1 типа 2 не является элегантным, оно обеспечивает для серверов версии 3.0 безопасный способ детектирования атак. Это решение не обеспечивает защиты от атакующих, которые могут подобрать (brute force) ключ и подменить сообщение ENCRYPTED-KEY-DATA, используя тот же ключ (но обычное заполнение) до того, как заданное приложением время ожидания истечет. Сторонам, озабоченным такими атаками, не следует использовать 40-битовые ключи шифрования. Изменение 8 младших байтов заполнения PKCS не влияет на защиту при размере подписанных хэшей и ключей RSA, используемом в протоколе, поскольку это эквивалентно увеличению размера входного блока на 8 байтов.

F.1.3. Детектирование атак на протокол согласования

Атакующий может предпринять попытку влияния на обмен в процессе согласования с целью вынудить стороны к использованию алгоритма шифрования, который бы они не избрали в нормальных обстоятельствах.

Для выполнения такой атаки нужно изменить содержимое одного или нескольких согласующих сообщений. Это может привести к тому, что клиент и сервер получат различные значения для хэшей согласующих сообщений. В результате согласующие стороны не воспримут сообщений Finished от другой стороны. Не имея значения master_secret, атакующий не сможет исправить сообщения Finished и атака будет раскрыта.

F.1.4. Возобновление сессий

Когда соединение организуется путем возобновления сессии, новые значения ClientHello.random и ServerHello.random хешируются с используем master_secret восстанавливаемой сессии. При условии того, что значение master_secret не было раскрыто, а для создания ключей шифрования и секретов MAC используются защищенные операции хэширования, соединение будет защищено и независимо от предыдущих соединений. Атакующий не сможет использовать известные ему ключи шифрования и секреты MAC для раскрытия master_secret без нарушения защищенных хэш-операций.

Сессия не может быть возобновлена без согласия обеих сторон — клиента и сервера. Если любая из сторон предполагает, что сессия могла быть скомпрометирована, сертификаты могли быть отозваны или срок их действия истек, ей следует инициировать полное согласование. В качестве верхнего предела времени жизни идентификаторов сессий предлагается 24 часа, поскольку получивший master_secret злоумышленник может представиться в качестве скомпрометированной стороны, пока соответствующий идентификатор сессии сохраняется. Приложениям, которые работают в слабо защищенной среде, не следует сохранять идентификаторы сессий в стабильных хранилищах.

F.2. Защита данных приложений

Значение master_secret хэшируется с ClientHello.random и ServerHello.random для генерации уникальных ключей шифрования данных и секретов MAC в каждом соединении.

Выходные данные до их передачи защищаются с помощью MAC. Для предотвращения атак с изменением или повторным использованием соединений значение MAC рассчитывается из секрета MAC, порядкового номера, размера сообщения и его содержимого, а также двух фиксированных символьных строк. Поле типа сообщения требуется для того, чтобы сообщения, предназначенные одному клиенту уровня TLS Record, не перенаправлялись другим. Порядковые номера позволяют детектировать попытки удаления сообщений или изменения их порядка. Поскольку размер порядковых номеров составляет 64 бита, значение номера никогда не переполняется. Сообщения одной стороны не могут быть помещены в вывод другой, поскольку для них используется независимый секрет MAC. Ключи записи у клиента и сервера также независимы, поэтому ключи потокового шифрования применяются только один раз.

Если атакующий раскрывает ключ шифрования, он может прочитать все зашифрованные с этим ключом сообщения. Подобно этому компрометация ключа MAC делает возможными атаки на изменение сообщений. Поскольку значения MAC шифруются, для атак с изменением сообщений обычно требуется раскрытие алгоритма шифрования в дополнение к MAC.

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

F.3. Явные IV

В [CBCATT] описана атака на TLS, основанная на знании вектора инициализации (IV) для записи. Предыдущие версии TLS [TLS1.0] использовали в качестве IV остаток цепочки CBC из предыдущей записи и, следовательно, были уязвимы для таких атак. Данная версия использует явные векторы инициализации для предотвращения таких атак.

F.4. Защищенность композитных режимов шифрования

TLS защищает передаваемые данные приложений с помощью функций симметричного шифрования и проверки подлинности согласованного шифра. Цель заключается в защите целостности и конфиденциальности передаваемых данных от деструктивных действий активных злоумышленников в сети. Для достижения этой цели оказывается важным порядок применения функций шифрования и аутентификации [ENCAUTH].

В наиболее надежном методе, называемом encrypt-then-authenticate26, данные сначала шифруются, а затем для шифрованного текста используется MAC. Этот метод обеспечивает сохранение целостности и конфиденциальности при использовании любой пары функций шифрования и MAC за счет того, что шифрование защищает от атак типа chosen plaintext, а MAC — от атак типа chosen-message. В TLS используется другой метод, называемый authenticate-then-encrypt27, в котором сначала рассчитывается код MAC для незашифрованных данных, а затем шифруется конкатенация этих данных и кода MAC. Защищенность этого метода проверена для некоторых комбинаций функций шифрования и MAC, но в общем случае защищенность не гарантируется. В частности, показано существование совершенно безопасных функций шифрования (защищенных даже с точки зрения теории информации), которые в комбинации с любой защищенной функцией MAC не обеспечивают защиты от активных атак. Следовательно, новые шифронаборы и режимы работы, адаптируемые в TLS, должны анализироваться с использованием метода authenticate-then-encrypt для защиты целостности и конфиденциальности.

К настоящему моменту защищенность метода authenticate-then-encrypt подтверждена для некоторых важных случаев. Одним из них является потоковое шифрование, при котором непредсказуемое вычислительным путем заполнение размера сообщения плюс размер тега MAC создается с использованием генератора псевдослучайных чисел, а затем это случайное заполнение используется в операции XOR с нешифрованными данными и кодом MAC. Другим примером является режим CBC для защищенного блочного шифра. В этом случае защищенность может быть обеспечена, если применяется один проход шифрования CBC к конкатенации нешифрованных данных и кода MAC, для каждой такой пары используется новое, независимое и непредсказуемое значение IV. В версиях TLS до 1.1 режим CBC использовался корректно, по применялся предсказуемый вектор инициализации IV в форме последнего блока ранее зашифрованных данных. Это делало TLS открытым для атак типа chosen plaintext. Данная версия протокола устойчива к таким атакам. Подробная информация о защищенности режимов шифрования приведена в [ENCAUTH].

F.5. Атаки на отказ служб

Протокол TLS подвержен множеству атак, нацеленных на отказ служб (DoS28). В частности, атакующий, который инициирует большое число соединений TCP, может вызвать на сервере высокую загрузку процессора (CPU) расшифровкой RSA. Однако, благодаря тому, что TLS обычно работает «поверх» TCP, атакующему сложно скрыть себя, если в стеке TCP используется подходящая генерация случайных чисел для пакетов TCP SYN [SEQNUM].

По причине работы протокола TLS на основе TCP, он подвержен также множеству DoS-атак на отдельные соединения. В частности, злоумышленники могут использовать обманные пакеты RST для сброса соединений или обманные неполные записи TLS для «замораживания» соединения. В общем случае нет возможности защититься от таких атак средствами протокола TCP. Озабоченным этим классом атак разработчикам и пользователям следует применять IPsec AH [AH] или ESP [ESP].

F.6. Заключительные замечания

Чтобы протокол TLS мог обеспечивать защиту соединений, клиентская и серверная системы, ключи и приложения должны быть защищены. Кроме того, в приложениях не должно быть снижающих уровень безопасности ошибок.

Уровень защиты системы зависит от качества (стойкости) поддерживаемых алгоритмов обмена ключами и аутентификации, поэтому следует использовать только проверенные криптографические функции. Короткие открытые ключи, 40-битовые ключи шифрования данных и анонимные серверы следует использовать с большой осторожностью. Реализации и пользователи должны быть осторожны с сертификатами и подтверждающими их УЦ, поскольку доверие к обманному сертификату может нанести серьезный ущерб.

Нормативные документы

[AES] National Institute of Standards and Technology, «Specification for the Advanced Encryption Standard (AES)» FIPS 197. November 26, 2001.

[3DES] National Institute of Standards and Technology, «Recommendation for the Triple Data Encryption Algorithm (TDEA) Block Cipher», NIST Special Publication 800-67, May 2004.

[DSS] NIST FIPS PUB 186-2, «Digital Signature Standard», National Institute of Standards and Technology, U.S. Department of Commerce, 2000.

[HMAC] Krawczyk, H., Bellare, M., and R. Canetti, «HMAC: Keyed-Hashing for Message Authentication», RFC 2104, February 1997.

[MD5] Rivest, R., «The MD5 Message-Digest Algorithm», RFC 1321, April 1992.

[PKCS1] Jonsson, J. and B. Kaliski, «Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography Specifications Version 2.1», RFC 3447, February 2003.

[PKIX] Housley, R., Polk, W., Ford, W., and D. Solo, «Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile», RFC 3280, April 2002.

[SCH] B. Schneier. «Applied Cryptography: Protocols, Algorithms, and Source Code in C, 2nd ed.», Published by John Wiley & Sons, Inc. 1996.

[SHS] NIST FIPS PUB 180-2, «Secure Hash Standard», National Institute of Standards and Technology, U.S. Department of Commerce, August 2002.

[REQ] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, March 1997.

[RFC2434] Narten, T. and H. Alvestrand, «Guidelines for Writing an IANA Considerations Section in RFCs», BCP 26, RFC 2434, October 1998.

[X680] ITU-T Recommendation X.680 (2002) | ISO/IEC 8824-1:2002, Information technology — Abstract Syntax Notation One (ASN.1): Specification of basic notation.

[X690] ITU-T Recommendation X.690 (2002) | ISO/IEC 8825-1:2002, Information technology — ASN.1 encoding Rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER).

Дополнительная литература

[AEAD] McGrew, D., «An Interface and Algorithms for Authenticated Encryption», RFC 5116, January 2008.

[AH] Kent, S., «IP Authentication Header», RFC 4302, December 2005.

[BLEI] Bleichenbacher D., «Chosen Ciphertext Attacks against Protocols Based on RSA Encryption Standard PKCS #1» in Advances in Cryptology — CRYPTO’98, LNCS vol. 1462, pages: 1-12, 1998.

[CBCATT] Moeller, B., «Security of CBC Ciphersuites in SSL/TLS: Problems and Countermeasures», http://www.openssl.org/~bodo/tls-cbc.txt.

[CBCTIME] Canvel, B., Hiltgen, A., Vaudenay, S., and M. Vuagnoux, «Password Interception in a SSL/TLS Channel», Advances in Cryptology — CRYPTO 2003, LNCS vol. 2729, 2003.

[CCM] «NIST Special Publication 800-38C: The CCM Mode for Authentication and Confidentiality», http://csrc.nist.gov/publications/nistpubs/800-38C/SP800-38C.pdf

[DES] National Institute of Standards and Technology, «Data Encryption Standard (DES)», FIPS PUB 46-3, October 1999.

[DSS-3] NIST FIPS PUB 186-3 Draft, «Digital Signature Standard», National Institute of Standards and Technology, U.S. Department of Commerce, 2006.

[ECDSA] American National Standards Institute, «Public Key Cryptography for the Financial Services Industry: The Elliptic Curve Digital Signature Algorithm (ECDSA)», ANS X9.62-2005, November 2005.

[ENCAUTH] Krawczyk, H., «The Order of Encryption and Authentication for Protecting Communications (Or: How Secure is SSL?)», Crypto 2001.

[ESP] Kent, S., «IP Encapsulating Security Payload (ESP)», RFC 4303, December 2005.

[FI06] Hal Finney, «Bleichenbacher’s RSA signature forgery based on implementation error», ietf-openpgp@imc.org mailing list, 27 August 2006, http://www.imc.org/ietf-openpgp/mail-archive/msg14307.html.

[GCM] Dworkin, M., NIST Special Publication 800-38D, «Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC», November 2007.

[IKEALG] Schiller, J., «Cryptographic Algorithms for Use in the Internet Key Exchange Version 2 (IKEv2)», RFC 4307, December 2005.

[KEYSIZ] Orman, H. and P. Hoffman, «Determining Strengths For Public Keys Used For Exchanging Symmetric Keys», BCP 86, RFC 3766, April 2004.

[KPR03] Klima, V., Pokorny, O., Rosa, T., «Attacking RSA-based Sessions in SSL/TLS», http://eprint.iacr.org/2003/052/, March 2003.

[MODP] Kivinen, T. and M. Kojo, «More Modular Exponential (MODP) Diffie-Hellman groups for Internet Key Exchange (IKE)», RFC 3526, May 2003.

[PKCS6] RSA Laboratories, «PKCS #6: RSA Extended Certificate Syntax Standard», version 1.5, November 1993.

[PKCS7] RSA Laboratories, «PKCS #7: RSA Cryptographic Message Syntax Standard», version 1.5, November 1993.

[RANDOM] Eastlake, D., 3rd, Schiller, J., and S. Crocker, «Randomness Requirements for Security», BCP 106, RFC 4086, June 2005.

[RFC3749] Hollenbeck, S., «Transport Layer Security Protocol Compression Methods», RFC 3749, May 2004.

[RFC4366] Blake-Wilson, S., Nystrom, M., Hopwood, D., Mikkelsen, J., and T. Wright, «Transport Layer Security (TLS) Extensions», RFC 4366, April 2006.

[RSA] R. Rivest, A. Shamir, and L. M. Adleman, «A Method for Obtaining Digital Signatures and Public-Key Cryptosystems», Communications of the ACM, v. 21, n. 2, Feb 1978, pp. 120-126.

[SEQNUM] Bellovin, S., «Defending Against Sequence Number Attacks», RFC 1948, May 1996.

[SSL2] Hickman, Kipp, «The SSL Protocol», Netscape Communications Corp., Feb 9, 1995.

[SSL3] A. Freier, P. Karlton, and P. Kocher, «The SSL 3.0 Protocol», Netscape Communications Corp., Nov 18, 1996.

[SUBGROUP] Zuccherato, R., «Methods for Avoiding the «Small-Subgroup» Attacks on the Diffie-Hellman Key Agreement Method for S/MIME», RFC 2785, March 2000.

[TCP] Postel, J., «Transmission Control Protocol», STD 7, RFC 793, September 1981.

[TIMING] Boneh, D., Brumley, D., «Remote timing attacks are practical», USENIX Security Symposium 2003.

[TLSAES] Chown, P., «Advanced Encryption Standard (AES) Ciphersuites for Transport Layer Security (TLS)», RFC 3268, June 2002.

[TLSECC] Blake-Wilson, S., Bolyard, N., Gupta, V., Hawk, C., and B. Moeller, «Elliptic Curve Cryptography (ECC) Cipher Suites for Transport Layer Security (TLS)», RFC 4492, May 2006.

[TLSEXT] Eastlake, D., 3rd, «Transport Layer Security (TLS) Extensions: Extension Definitions», Work in Progress, February 2008.

[TLSPGP] Mavrogiannopoulos, N., «Using OpenPGP Keys for Transport Layer Security (TLS) Authentication», RFC 5081, November 2007.

[TLSPSK] Eronen, P., Ed., and H. Tschofenig, Ed., «Pre-Shared Key Ciphersuites for Transport Layer Security (TLS)», RFC 4279, December 2005.

[TLS1.0] Dierks, T. and C. Allen, «The TLS Protocol Version 1.0», RFC 2246, January 1999.

[TLS1.1] Dierks, T. and E. Rescorla, «The Transport Layer Security (TLS) Protocol Version 1.1», RFC 4346, April 2006.

[X501] ITU-T Recommendation X.501: Information Technology — Open Systems Interconnection — The Directory: Models, 1993.

[XDR] Eisler, M., Ed., «XDR: External Data Representation Standard», STD 67, RFC 4506, May 2006.

Информация о рабочей группе

Список рассылки группы IETF TLS доступен по адресу <tls@ietf.org>. Информация о группе и способах подписки приведена на странице <https://www1.ietf.org/mailman/listinfo/tls>.

Архивы списка рассылки доступны по ссылке <http://www.ietf.org/mail-archive/web/tls/current/index.html>.

Участники работы

Christopher Allen ( соавтор TLS 1.0)

Alacrity Ventures

ChristopherA@AlacrityManagement.com

Martin Abadi

University of California, Santa Cruz

abadi@cs.ucsc.edu

Steven M. Bellovin

Columbia University

smb@cs.columbia.edu

Simon Blake-Wilson

BCI

sblakewilson@bcisse.com

Ran Canetti

IBM

canetti@watson.ibm.com

Pete Chown

Skygate Technology Ltd

pc@skygate.co.uk

Taher Elgamal

taher@securify.com

Securify

Pasi Eronen

pasi.eronen@nokia.com

Nokia

Anil Gangolli

anil@busybuddha.org

Kipp Hickman

Alfred Hoenes

David Hopwood

Independent Consultant

david.hopwood@blueyonder.co.uk

Phil Karlton (соавтор SSLv3)

Paul Kocher (соавтор SSLv3)

Cryptography Research

paul@cryptography.com

Hugo Krawczyk

IBM

hugo@ee.technion.ac.il

Jan Mikkelsen

Transactionware

janm@transactionware.com

Magnus Nystrom

RSA Security

magnus@rsasecurity.com

Robert Relyea

Netscape Communications

relyea@netscape.com

Jim Roskind

Netscape Communications

jar@netscape.com

Michael Sabin

Dan Simon

Microsoft, Inc.

dansimon@microsoft.com

Tom Weinstein

Tim Wright

Vodafone

timothy.wright@vodafone.com

Адреса редакторов

Tim Dierks

Independent

EMail: tim@dierks.org

Eric Rescorla

RTFM, Inc.

EMail: ekr@rtfm.com

Перевод на русский язык

Николай Малых

nmalykh@gmail.com

Полное заявление авторских прав

Copyright (C) The IETF Trust (2008).

К этому документу применимы права, лицензии и ограничения, указанные в BCP 78, и, за исключением указанного там, авторы сохраняют свои права.

Этот документ и содержащаяся в нем информация представлены «как есть» и автор, организация, которую он/она представляет или которая выступает спонсором (если таковой имеется), Internet Society и IETF отказываются от каких-либо гарантий (явных или подразумеваемых), включая (но не ограничиваясь) любые гарантии того, что использование представленной здесь информации не будет нарушать чьих-либо прав, и любые предполагаемые гарантии коммерческого использования или применимости для тех или иных задач.

Интеллектуальная собственность

IETF не принимает какой-либо позиции в отношении действительности или объема каких-либо прав интеллектуальной собственности (Intellectual Property Rights или IPR) или иных прав, которые, как может быть заявлено, относятся к реализации или использованию описанной в этом документе технологии, или степени, в которой любая лицензия, по которой права могут или не могут быть доступны, не заявляется также применение каких-либо усилий для определения таких прав. Сведения о процедурах IETF в отношении прав в документах RFC можно найти в BCP 78 и BCP 79.

Копии раскрытия IPR, предоставленные секретариату IETF, и любые гарантии доступности лицензий, а также результаты попыток получить общую лицензию или право на использование таких прав собственности разработчиками или пользователями этой спецификации, можно получить из сетевого репозитория IETF IPR по ссылке http://www.ietf.org/ipr.

IETF предлагает любой заинтересованной стороне обратить внимание на авторские права, патенты или использование патентов, а также иные права собственности, которые могут потребоваться для реализации этого стандарта. Информацию следует направлять в IETF по адресу ietf-ipr@ietf.org.


1Pseudorandom function.

2Network или big endian, когда первым указывается старший байт.

3Неинтерпретируемые данные – Прим. перев.

4Authenticated encryption with additional data.

5Digital Signing Algorithm — алгоритм цифровой подписи

6Исключающее-ИЛИ.

7Cipher Block Chaining — цепочка шифрованных блоков.

8Message Authentication Code — код аутентификации сообщения.

9С помощью MAC. Прим. перев.

10В оригинале это предложение содержит ошибки. См. https://www.rfc-editor.org/errata_search.php?eid=2390. Прим. перев.

11A man in the middle.

12В оригинале это примечание содержит ошибки. См. https://www.rfc-editor.org/errata_search.php?eid=4007. Прим. перев.

13В оригинале это слово ошибочно пропущено. См. https://www.rfc-editor.org/errata_search.php?eid=4507. Прим. перев.

14В оригинале ошибочно указано «2^16-1». См. https://www.rfc-editor.org/errata_search.php?eid=2865 . Прим. перев.

15В оригинале этот абзац по ошибке не включал последнего предложения. См. https://www.rfc-editor.org/errata_search.php?eid=3481. Прим. перев.

16В оригинале ошибочно указано <2..2^16-1>. См. https://www.rfc-editor.org/errata_search.php?eid=4912. Прим. перев.

17В оригинале ошибочно указано <2^24-1>. См. https://www.rfc-editor.org/errata_search.php?eid=4109. Прим. перев.

18В оригинале эта строка ошибочно пропущена. См. https://www.rfc-editor.org/errata_search.php?eid=3123. Прим. перев.

19В оригинале эта строка ошибочно пропущена. См. https://www.rfc-editor.org/errata_search.php?eid=1585 и https://www.rfc-editor.org/errata_search.php?eid=2864. Прим. перев.

20National Institute of Standards and Technology — Национальный институт стандартов и технологии США.

21Совпадение хэш-значений для разных входных данных. Прим. перев.

22Secure Hash Algorithm.

23Secure Socket Layer.

24Pseudorandom number generator.

25В оригинале этот абзац содержит ошибку. См. https://www.rfc-editor.org/errata_search.php?eid=2643. Прим. перев.

26Шифровать, потом аутентифицировать.

27Аутентифицировать, затем шифровать.

28Denial of service.

Рубрика: RFC | Комментарии к записи RFC 5246 The Transport Layer Security (TLS) Protocol Version 1.2 отключены

RFC 5292 Address-Prefix-Based Outbound Route Filter for BGP-4

Network Working Group                                           E. Chen
Request for Comments: 5292                                    S. Sangli
Category: Standards Track                                 Cisco Systems
                                                            August 2008

 

 

Основанный на префиксах маршрутов выходной фильтр для BGP-4

Address-Prefix-Based Outbound Route Filter for BGP-4

PDF

Статус документа

В этом документе содержится проект стандарта протокола Internet для сообщества Internet и приглашение к дискуссии в целях развития и совершенствования. Текущее состояние стандартизации протокола и его статус можно узнать из документа Internet Official Protocol Standards (STD 1). Документ может распространяться свободно.

Аннотация

В этом документе определен новый тип выходного фильтра маршрутов (ORF1) для протокола BGP, названный выходным фильтром по префиксам адресов2, который может применяться для фильтрации маршрутов на выходе по префиксам адресов. Этот тип ORF поддерживает соответствия по размеру префикса или диапазону, соответствия шаблону префиксов, а также точного соответствия адресных префиксов для семейств адресов.

1. Введение

Возможность выходной фильтрации маршрутов3, определенная в [BGP-ORF], обеспечивает узлам BGP возможность передать своим партнерам BGP набор фильтров ORF, которые могут использоваться этими партнерами для фильтрации маршрутных обновлений, передаваемых данному узлу.

В этом документе определен новый тип ORF4 для протокола BGP, названный «Выходным фильтром по адресным префиксам (ORF по адресным префиксам)5«, которым может использоваться для фильтрации маршрутов на основе адресных префиксов. Address Prefix ORF поддерживает проверку соответствия по размеру префикса, диапазону адресов, шаблону адресов и совпадению префикса для семейств адресов [BGP-MP].

2. Address Prefix ORF-Type

Address Prefix ORF-Type позволяет выражать фильтры ORF в терминах адресных префиксов. Т. е., данный тип обеспечивает фильтрацию маршрутов по префиксам адресов, включая проверку совпадения размеров префиксов, принадлежности к диапазону, а также соответствия шаблонам префиксов.

Концептуально элемент Address Prefix ORF состоит из полей <Sequence, Match, Length, Prefix, Minlen, Maxlen>6.

Поле Sequence задает относительный порядок элемента среди других элементов Address Prefix ORF.

Поле Match задает действие при соответствии — PERMIT (разрешить, 0) или DENY (отвергнуть, 1).

Поле Length показывает размер адресного префикса в битах. Нулевое значение показывает префикс, которому соответствуют все (как указано в спецификации семейства адресов) адреса (сам префикс является пустым).

Поле Prefix содержит адресный префикс семейства адресов.

Поле Minlen указывает минимальный размер префикса (в битах), который требуется для соответствия. Нулевое значение говорит о том, что минимальный размер не задан.

Поле Maxlen указывает максимальный размер префикса (в битах), который требуется для соответствия. Нулевое значение говорит о том, что максимальный размер не задан.

Поля Sequence, Length, Minlen и Maxlen трактуются как целые числа без знака.

В этом документе вводятся следующие требования к значениям полей размера:

0 <= Length < Minlen <= Maxlen

Однако проверки значений Minlen или Maxlen не выполняются, если значение соответствующего поля не задано (0).

Кроме того, значение поля Maxlen не может превышать максимальный размер (в битах) адреса хоста для данного семейства адресов [BGP-MP].

3. Представление Address Prefix ORF

Значение ORF-Type для Address Prefix ORF-Type равно 64.

Представление элемента Address Prefix ORF показано на рисунке 1. Поле Match элемента представляется в поле Match общей части [BGP-ORF], а остальные поля помещаются в специфическую для данного типа часть, как показано на рисунке 1.

+--------------------------------+
|   Sequence (4 октета)          |
+--------------------------------+
|   Minlen   (1 октет)           |
+--------------------------------+
|   Maxlen   (1 октет)           |
+--------------------------------+
|   Length   (1 октет)           |
+--------------------------------+
|   Prefix   (переменный размер) |
+--------------------------------+

Рисунок 1: Представление Address Prefix ORF

Отметим, что поле Prefix дополняется справа (после значимых битов) для выравнивания по границе октета. Значение бита заполнения может быть любым.

4. Соответствие Address Prefix ORF

В дополнение к общим правилам соответствия, определенным в [BGP-ORF], для Address Prefix ORF вводятся рассмотренные ниже правила.

Рассмотрим элемент Address Prefix ORF и маршрут, поддерживаемый узлом BGP со значением NLRI7 в формате <Prefix, Length>.

Маршрут считается не соответствующим элементу ORF, если NLRI не является более специфичным и не совпадает со значениями полей <Prefix, Length> элемента ORF.

Если поле NLRI менее специфично или совпадает с полями <Prefix, Length> элемента ORF, маршрут считается соответствующим ORF, если NLRI соответствует условиям, приведенным в таблице 1.

Таблица 1: Соответствие Address Prefix ORF

Элемент ORF

Условие соответствия NLRI

Minlen

Maxlen

Не задан

Не задан

NLRI.length == ORF.length

Задан

Не задан

NLRI.length >= ORF.Minlen

Не задан

Задан

NLRI.length <= ORF.Maxlen

Задан

Задан

NLRI.length >= ORF.Minlen и NLRI.length <= ORF.Maxlen

При соответствии нескольких элементов Address Prefix ORF значению NLRI в маршруте, применяется первое правило. Т. е., элемент ORF с меньшим порядковым номером (из числа соответствующих элементов ORF) рассматривается единственный соответствующий и определяет судьбу анонсирования маршрута.

Распределение порядковых номеров элементов определяется локальной политикой узла BGP, передающего элементы Address Prefix ORF.

5. Согласование с IANA

Этот документ задает новый тип выходной фильтрации маршрутов (ORF) — Address Prefix ORF. Значение ORF-type для этого типа — 64.

6. Вопросы безопасности

Данное расширение BGP не отражается на вопросах безопасности, рассмотренных в [BGP-4].

7. Нормативные документы

[BGP-4] Rekhter, Y., Ed., Li, T., Ed., and S. Hares, Ed., «A Border Gateway Protocol 4 (BGP-4)», RFC 4271, January 2006.

[BGP-MP] Bates, T., Chandra, R., Katz, D., and Y. Rekhter, «Multiprotocol Extensions for BGP-4», RFC 4760, January 2007.

[BGP-ORF] Chen, E., and Y. Rekhter, «Outbound Route Filtering Capability for BGP-4», RFC 5291, August 2008.

Адреса авторов

Enke Chen

Cisco Systems, Inc.

170 W. Tasman Dr.

San Jose, CA 95134

EMail: enkechen@cisco.com

Srihari R. Sangli

Cisco Systems, Inc.

170 W. Tasman Dr.

San Jose, CA 95134

EMail: rsrihari@cisco.com


Перевод на русский язык

Николай Малых

nmalykh@protokols.ru

Полное заявление авторских прав

Copyright (C) The IETF Trust (2008).

К этому документу применимы права, лицензии и ограничения, указанные в BCP 78, и, за исключением указанного там, авторы сохраняют свои права.

Этот документ и содержащаяся в нем информация представлены «как есть» и автор, организация, которую он/она представляет или которая выступает спонсором (если таковой имеется), Internet Society и IETF отказываются от каких-либо гарантий (явных или подразумеваемых), включая (но не ограничиваясь) любые гарантии того, что использование представленной здесь информации не будет нарушать чьих-либо прав, и любые предполагаемые гарантии коммерческого использования или применимости для тех или иных задач.

Интеллектуальная собственность

IETF не принимает какой-либо позиции в отношении действительности или объема каких-либо прав интеллектуальной собственности (Intellectual Property Rights или IPR) или иных прав, которые, как может быть заявлено, относятся к реализации или использованию описанной в этом документе технологии, или степени, в которой любая лицензия, по которой права могут или не могут быть доступны, не заявляется также применение каких-либо усилий для определения таких прав. Сведения о процедурах IETF в отношении прав в документах RFC можно найти в BCP 78 и BCP 79.

Копии раскрытия IPR, предоставленные секретариату IETF, и любые гарантии доступности лицензий, а также результаты попыток получить общую лицензию или право на использование таких прав собственности разработчиками или пользователями этой спецификации, можно получить из сетевого репозитория IETF IPR по ссылке http://www.ietf.org/ipr.

IETF предлагает любой заинтересованной стороне обратить внимание на авторские права, патенты или использование патентов, а также иные права собственности, которые могут потребоваться для реализации этого стандарта. Информацию следует направлять в IETF по адресу ietf-ipr@ietf.org.


1Outbound Router Filter.

2Address Prefix Outbound Route Filter.

3Outbound Route Filtering Capability.

4ORF-type.

5Address Prefix Outbound Route Filter (Address Prefix ORF).

6<Порядковый номер, Действие при соответствии, Размер, Префикс, Минимальный размер, Максимальный размер>.

7Network Layer Reachability Information — информация о доступности на сетевом уровне.

Рубрика: RFC | Оставить комментарий

RFC 5291 Outbound Route Filtering Capability for BGP-4

Network Working Group                                        E. Chen
Request for Comments: 5291                             Cisco Systems
Category: Standards Track                                 Y. Rekhter
                                                    Juniper Networks
                                                         August 2008

 

 

Возможность выходной фильтрации маршрутов для BGP-4

Outbound Route Filtering Capability for BGP-4

PDF

Статус документа

В этом документе содержится проект стандарта протокола Internet для сообщества Internet и приглашение к дискуссии в целях развития и совершенствования. Текущее состояние стандартизации протокола и его статус можно узнать из документа Internet Official Protocol Standards (STD 1). Документ может распространяться свободно.

Аннотация

В этом документе определен основанный на протоколе BGP механизм, позволяющий узлу BGP передавать своим партнерам набор фильтров ORF1, которые этот партнер будет использовать для ограничения/фильтрации исходящих маршрутных обновлений для данного узла.

1. Введение

В настоящее время обычной практикой для узлов BGP [BGP-4] является прием маршрутных обновлений от партнера с последующей фильтрацией нежелательных обновлений на основе локальной политики маршрутизации. Поскольку генерация и передача маршрутных обновлений отправителем, равно как их обработка получателем, потребляют ресурсы, отказ от генерации нежелательных маршрутных обновлений может давать преимущества.

В этом документе определен основанный на протоколе BGP механизм, позволяющий узлу BGP передать своему партнеру BGP набор фильтров ORF. Партнер будет применять полученные фильтры в дополнение к фильтрам, заданным в его локальной конфигурации (если таковые имеются), для ограничения/фильтрации маршрутных обновлений, передаваемых данному узлу.

2. Спецификация требований

Ключевые слова необходимо (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не следует (SHALL NOT), следует (SHOULD), не нужно (SHOULD NOT), рекомендуется (RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе интерпретируются в соответствии с RFC 2119 [RFC2119].

3. Фильтр ORF

В контексте этого документа термины «идентификатор семейства адресов» (AFI2) и «дополнительный идентификатор семейства адресов» (SAFI3) трактуются в соответствии с [BGP-MP].

Концептуально элемент ORF представляет собой последовательность полей <AFI/SAFI, ORF-Type4, Action, Match, ORF-value5> и ORF состоит из одного или множества элементов ORF с совпадающими значениями AFI/SAFI и ORF-Type. Фильтр ORF идентифицируется парой <AFI/SAFI, ORF-Type>.

Компонента AFI/SAFI обеспечивает грубый контроль за счет выбора только тех маршрутов, в которых значения NLRI6 соответствуют компоненте AFI/SAFI в фильтре ORF.

Компонента ORF-Type определяет содержимое поля ORF-value.

Компонента Action7 управляет обслуживанием запросов ORF Request удаленным партнером. В качестве действия могут служить операции ADD, REMOVE, REMOVE-ALL. Операция ADD добавляет элемент ORF в фильтр ORF удаленного партнера, REMOVE удаляет ранее установленный для удаленного партнера элемент ORF, а REMOVE-ALL удаляет все ранее установленные для заданного ORF элементы.

Компонента Match используется для управления действиями на уровне элемента ORF и может принимать значения PERMIT или DENY. Значение PERMIT используется для запроса у партнера передачи обновлений для маршрутов, соответствующих записи ORF. Значение DENY используется для запроса у партнера фильтрации (отказа от передачи) обновлений, соответствующих элементу ORF.

При определении ORF конкретные правила соответствия для данного ORF должны быть заданы так, чтобы не возникало неоднозначностей при определении элемента ORF, по отношению к которому проверяется соответствие при прохождении маршрута через ORF.

4. Передача элементов ORF в BGP

Элементы ORF передаются в сообщениях BGP ROUTE-REFRESH [BGP-RR].

Узел BGP может отличать входящие сообщения ROUTE-REFRESH с одним или несколькими элементами ORF от обычных сообщений ROUTE-REFRESH с помощью поля Message Length8 в заголовке сообщения BGP.

В одном сообщении ROUTE-REFRESH может содержаться множество элементов ORF для одного или множества фильтров ORF, при условии, что для всех этих элементов значения AFI/SAFI совпадают.

С точки зрения кодирования каждый элемент ORF состоит из общей части и зависимой от типа части, как показано на рисунках 1 и 2.

Общая часть включает поля <AFI/SAFI, ORF-Type, Action, Match> и представляется следующим образом:

Компонента AFI/SAFI элемента ORF представляется полями AFI/SAFI сообщения ROUTE-REFRESH.

Вслед за компонентой AFI/SAFI размещается 1-октетное поле When-to-refresh9, которое может принимать значения IMMEDIATE (0x01) или DEFER (0x02). Семантика значений IMMEDIATE и DEFER обсуждается ниже в параграфе «Функционирование».

Вслед за полем When-to-refresh помещается один или множество ORF, сгруппированных по ORF-Type.

Компонента ORF-Type представляет 1 октетом.

Компонента Length of ORF entries представляет собой 2-октетное поле, содержащую общий размер последующих однотипных элементов ORF в октетах.

+------------------------------------------------+
| Address Family Identifier (2 октета)           |
+------------------------------------------------+
| Резерв (1 октет)                               |
+------------------------------------------------+
| Subsequent Address Family Identifier (1 октет) |
+------------------------------------------------+
| When-to-refresh (1 октет)                      |
+------------------------------------------------+
| ORF Type (1 октет)                             |
+------------------------------------------------+
| Length of ORF entries (2 октета)               |
+------------------------------------------------+
| Первый элемент ORF (перем.)                    |
+------------------------------------------------+
| Второй элемент ORF (перем.)                    |
+------------------------------------------------+
| ...                                            |
+------------------------------------------------+
| N-й элемент ORF (перем.)                       |
+------------------------------------------------+
| ORF Type (1 октет)                             |
+------------------------------------------------+
| Length of ORF entries (2 октета)               |
+------------------------------------------------+
| Первый элемент ORF (перем.)                    |
+------------------------------------------------+
| Второй элемент ORF (перем.)                    |
+------------------------------------------------+
| ...                                            |
+------------------------------------------------+
| N-й элемент ORF (перем.)                       |
+------------------------------------------------+
| ...                                            |
+------------------------------------------------+

Рисунок 1: Передача элементов ORF в сообщении ROUTE-REFRESH

Остальные компоненты общей части кодируются в первом октете каждого элемента ORF (отсчет от старшего бита), как показано на рисунке 2.

Поле Action занимает 2 бита и может принимать значения 0 (ADD), 1 (REMOVE) и 2 (REMOVE-ALL).

Поле Match занимает 1 бит. Значение 0 означает операцию PERMIT, а 1 — DENY. Это поле имеет смысл только в тех случаях, когда в поле Action указано значение ADD или REMOVE.

Резервное поле занимает 5 битов и должно содержать нулевые значения при передаче и игнорироваться на приемной стороне.

+---------------------------------+
|   Action (2 бита)               |
+---------------------------------+
|   Match (1 бит)                 |
+---------------------------------+
|   Резерв (5 битов)              |
+---------------------------------+
| Зависящая от типа часть (перем) |
+---------------------------------+

Рисунок 2: Представление записи ORF

Если компонента Action записи ORF задает значение REMOVE-ALL, данный элемент содержит только общую часть.

5. Возможность выходной фильтрации маршрутов

Узел BGP, желающий получать элементы ORF от своего партнера, или узел BGP, желающий передавать элементы ORF своему партнеру анонсирует поддержку Outbound Route Filtering Capability, как описано ниже.

Outbound Route Filtering Capability10 представляет собой новую возможность BGP11 [BGP-CAP], определяемую следующим образом:

Capability code: 3

Capability length: переменное значение

Capability value: один или множество элементов фильтрации, как показано на рисунке 3.

+------------------------------------------------+
| Address Family Identifier (2 октета)           |
+------------------------------------------------+
| Резерв (1 октет)                               |
+------------------------------------------------+
| Subsequent Address Family Identifier (1 октет) |
+------------------------------------------------+
| Number of ORFs (1 октет)                       |
+------------------------------------------------+
| ORF Type (1 октет)                             |
+------------------------------------------------+
| Send/Receive (1 октет)                         |
+------------------------------------------------+
| ...                                            |
+------------------------------------------------+
| ORF Type (1 октет)                             |
+------------------------------------------------+
| Send/Receive (1 октет)                         |
+------------------------------------------------+

Рисунок 3: Представление Outbound Route Filtering Capability

Значения полей описаны ниже.

Address Family Identifier (AFI)

Смысл этого поля совпадает с описанным в [BGP-MP].

Subsequent Address Family Identifier (SAFI)

Смысл этого поля совпадает с описанным в [BGP-MP].

Number of ORF Types

Это поле содержит количество типов фильтров в последующих полях сообщения.

ORF Type

Это поле указывает тип ORF.

Send/Receive

Это поле показывает желаемую роль данного узла для указанного типа ORF — 1 означает желание узла принимать элементы ORF от своего партнера, 2 говорит о намерении передавать элементы ORF, а 3 — о намерении принимать и передавать.

6. Функционирование

Узлу BGP, желающему получать элементы ORF от своего партнера или передавать элементы ORF своему партнеру следует анонсировать партнеру возможность фильтрации маршрутов (Outbound Route Filtering Capability) с использованием механизма BGP Capabilities [BGP-CAP].

Узел BGP, реализующий выходную фильтрацию маршрутов, должен поддерживать сообщения BGP ROUTE-REFRESH в соответствии с [BGP-RR]. Узел BGP, анонсирующий партнеру выходную фильтрацию маршрутов с использованием BGP Capabilities [BGP-CAP], не анонсирует этому партнеру BGP Route Refresh Capability.

Рассмотрим узел BGP, который анонсирует Outbound Route Filtering Capability, указывая свое желание получать от партнера определенный набор <AFI/SAFI, ORF-Type>, и получает анонсы Outbound Route Filtering Capability, показывающие, что партнер передает определенный набор <AFI/SAFI, ORF-Type> данному узлу. Если для данных значений AFI/SAFI пересечение двух анонсируемых множеств не пусто, узлу BGP не следует анонсировать своему партнеру никаких маршрутов с данными AFI/SAFI до получения от этого партнера сообщения ROUTE-REFRESH с данными AFI/SAFI; это сообщение может не включать элементов ORF или включать один или множество элементов ORF и поле When-to-refresh = IMMEDIATE. С другой стороны, если для данных AFI/SAFI пересечение двух множеств пусто, узел должен следовать обычным процедурам BGP.

Узел BGP может передавать своему партнеру сообщение ROUTE-REFRESH с одним или множеством элементов ORF только в тех случаях, когда этот партнер передал данному узлу анонс Outbound Route Filtering Capability, показывающий желание получать элементы ORF, а сам узел анонсировал Outbound Route Filtering Capability с указанием желания передавать партнеру элементы ORF. Сообщение может содержать только элементы ORF с <AFI/SAFI, ORF-type>, которые партнер желает получать в соответствии с полученным от него анонсом Outbound Route Filtering Capability.

Когда узел BGP получает от своего партнера сообщение ROUTE-REFRESH с одним или множеством элементов ORF, он выполняет перечисленные ниже операции. Если значения <AFI/SAFI, ORF-type> в сообщении не соответствуют значениям <AFI/SAFI, ORF-type>, которые узел желает получать от партнера (как было указано в анонсе Outbound Route Filtering Capability), соответствующие элементы ORF в полученном сообщении игнорируются. При совпадении значений узел изменяет соответствующие ORF, полученные ранее, согласно элементам ORF из принятого сообщения. Если любое из полей элемента ORF в сообщении содержит нераспознанное значение, соответствующий фильтр ORF, полученный ранее, полностью удаляется.

Если компонента Action элемента ORF имеет значение REMOVE, но полученный ранее фильтр ORF не содержит указанного элемента, запись ORF в сообщении игнорируется.

Элементы ORF со значениями REMOVE или REMOVE-ALL не могут удаляться локально сконфигурированными выходными фильтрами маршрутов.

Если поле When-to-refresh содержит значение IMMEDIATE, после обработки всех элементов ORF, содержащихся в сообщении, узел повторно анонсирует партнеру маршруты из Adj-RIB-Out, связанные с партнером, которые имеют такие же значения AFI/SAFI, какие были получены в сообщении, и принимает во внимание все элементы ORF для значений AFI/SAFI, принятых от партнера. Узел должен повторно анонсировать все маршруты, на которые оказывают влияние элементы ORF из принятого сообщения, и может также реанонсировать маршруты, на которые элементы ORF из сообщения не воздействуют.

Если When-to-refresh = DEFER, после обработки всех элементов ORF в сообщении узел отказывается от реанонсирования партнеру маршрутов из Adj-RIB-Out, связанных с партнером, который имеет такие же значения AFI/SAFI, что были получены в сообщении, и принимает во внимание все элементы ORF, полученные от партнера, до тех пор пока не будет принято следующее сообщение ROUTE-REFRESH с такими же значениями AFI/SAFI, но без элементов ORF или с одним или множеством элементов ORF и When-to-refresh = IMMEDIATE.

Если узел получает от партнера сообщение ROUTE-REFRESH без элементов ORF, этот узел передает партнеру все маршруты из Adj-RIB-Out, связанные с партнером, для которых значения AFI/SAFI совпадают с полученными в сообщении, и принимает во внимание все ранее принятые от партнера ORF (если таковые имеются).

Набор элементов ORF, которые узел передает партнеру, выражает локальные предпочтения узла, которые этот партнер может принимать или не принимать во внимание.

В течение сеанса BGP узел может передавать партнеру множество элементов ORF.

После того, как узел BGP меняет элементы ORF, переданные ранее партнеру, он должен передать этому партнеру обновленные элементы ORF с (a) When-to-refresh = IMMEDIATE или (b) When-to-refresh = DEFER с последующим обычным сообщением ROUTE-REFRESH. Второй вариант должен использоваться узлом в тех случаях, когда имеются другие изменения в политике (в дополнение к элементам ORF), требующие реанонсирования партнеру всех маршрутов.

Время жизни фильтров ORF ограничивается продолжительностью сессии BGP, в которой происходил обмен ORF.

Фильтр ORF удаляется при удалении последнего элемента ORF (с помощью REMOVE-ALL или последовательности REMOVE).

Если отдельный маршрут, поддерживаемый узлом BGP, не соответствует ни одному элементу ORF ни в одном из (непустых) фильтров ORF, связанных с определенным партнером, такой маршрут не следует анонсировать данному партнеру.

Если узел BGP поддерживает множество ORF с разными ORF-Type для одного партнера, решение об анонсировании маршрута такому партнеру принимается путем просмотра маршрута всеми ORF и объединения полученных результатов (при объединении PERMIT и DENY результатом будет DENY).

7. Согласование с IANA

В этом документе определяется новая возможность BGP12 — Outbound Route Filtering Capability. Значение Capability Code для Outbound Route Filtering Capability равно 3.

Как указано в этом документе, элемент ORF содержит поле ORF-Type, для которого агентство IANA создало и поддерживает реестр BGP Outbound Route Filtering (ORF) Types.

IANA поддерживает и регистрирует значения поля ORF-Type в соответствии с приведенными ниже условиями:

  • Значение ORF-Type = 0 является резервным.
  • Значения ORF-Type от 1 до 63 выделяются IANA с использованием процедуры Standards Action, определенной в RFC 5226 [RFC5226], или процедуры Early IANA Allocation, определенной в RFC 4020 [RFC4020].
  • Значения ORF-Type от 64 до 127 выделяются IANA с использованием процедуры First Come First Served, определенной в RFC 5226 [RFC5226].
  • Значения ORF-Type от 128 до 255 являются специфическими для производителей и не распределяются IANA.

8. Вопросы управления

Объекты управления для фильтров BGP ORF будут определены в отдельном документе. Однако предполагается, что будут определены следующие объекты:

Объект ORF Capability, которые описывает ORF Capability, передаваемые в сессии BGP, должен включать типы ORF и значения Send/Receive, анонсируемые и принимаемые узлом BGP.

Объект ORF должен включать элементы ORF каждого фильтра ORF, передаваемого и принимаемого узлом BGP.

9. Вопросы безопасности

Данное расширение BGP не отражается на вопросах безопасности, рассмотренных в [BGP-4].

10. Благодарности

Часть материалов этого документа является адаптацией предложения для селективных обновлений, подготовленного Yakov Rekhter, Kannan Varadhan и Curtis Villamizar.

11. Нормативные документы

[BGP-4] Rekhter, Y., Ed., Li, T., Ed., and S. Hares, Ed., «A Border Gateway Protocol 4 (BGP-4)», RFC 4271, January 2006.

[BGP-MP] Bates, T., Chandra, R., Katz, D., and Y. Rekhter, «Multiprotocol Extensions for BGP-4», RFC 4760, January 2007.

[BGP-CAP] Chandra, R. and J. Scudder, «Capabilities Advertisement with BGP-4», RFC 3392, November 2002.

[BGP-RR] Chen, E., «Route Refresh Capability for BGP-4», RFC 2918, September 2000.

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, March 1997.

[RFC4020] Kompella, K. and A. Zinin, «Early IANA Allocation of Standards Track Code Points», BCP 100, RFC 4020, February 2005.

[RFC5226] Narten, T. and H. Alvestrand, «Guidelines for Writing an IANA Considerations Section in RFCs», BCP 26, RFC 5226, May 2008.

Адреса авторов

Enke Chen

Cisco Systems, Inc.

170 W. Tasman Dr.

San Jose, CA 95134

Email: enkechen@cisco.com

Yakov Rekhter

Juniper Networks

1194 N. Mathilda Ave

Sunnyvale, CA 94089

Email: yakov@juniper.net


Перевод на русский язык

Николай Малых

nmalykh@ptotokols.ru

Полное заявление авторских прав

Copyright (C) The IETF Trust (2008).

К этому документу применимы права, лицензии и ограничения, указанные в BCP 78, и, за исключением указанного там, авторы сохраняют свои права.

Этот документ и содержащаяся в нем информация представлены «как есть» и автор, организация, которую он/она представляет или которая выступает спонсором (если таковой имеется), Internet Society и IETF отказываются от каких-либо гарантий (явных или подразумеваемых), включая (но не ограничиваясь) любые гарантии того, что использование представленной здесь информации не будет нарушать чьих-либо прав, и любые предполагаемые гарантии коммерческого использования или применимости для тех или иных задач.

Интеллектуальная собственность

IETF не принимает какой-либо позиции в отношении действительности или объема каких-либо прав интеллектуальной собственности (Intellectual Property Rights или IPR) или иных прав, которые, как может быть заявлено, относятся к реализации или использованию описанной в этом документе технологии, или степени, в которой любая лицензия, по которой права могут или не могут быть доступны, не заявляется также применение каких-либо усилий для определения таких прав. Сведения о процедурах IETF в отношении прав в документах RFC можно найти в BCP 78 и BCP 79.

Копии раскрытия IPR, предоставленные секретариату IETF, и любые гарантии доступности лицензий, а также результаты попыток получить общую лицензию или право на использование таких прав собственности разработчиками или пользователями этой спецификации, можно получить из сетевого репозитория IETF IPR по ссылке http://www.ietf.org/ipr.

IETF предлагает любой заинтересованной стороне обратить внимание на авторские права, патенты или использование патентов, а также иные права собственности, которые могут потребоваться для реализации этого стандарта. Информацию следует направлять в IETF по адресу ietf-ipr@ietf.org.


1Outbound Route Filters — выходные фильтры маршрутов.

2Address Family Identifier.

3Subsequent Address Family Identifier.

4Тип ORF.

5Значение ORF.

6Network Layer Reachability Information — информация о доступности на сетевом уровне.

7Действие.

8Размер сообщения.

9Когда обновлять.

10Фильтрация маршрутов на выходе.

11BGP Capability.

12BGP Capability.

Рубрика: RFC | Оставить комментарий