RFC: 4340
Оригинал: Datagram Congestion Control Protocol (DCCP)
Категория: Предложенный стандарт
Дата публикации:
Авторы: , ,
Перевод: Николай Малых

6.6.2. Обработка полученных опций

Для каждого признака конечная точка DCCP может находиться в одном из трех состояний.

Стабильное состояние (STABLE) является нормальным состоянием каждого признака — обе конечные точки знают значение признака и считают, что другая сторона согласна с этим значением. Конечная точка переходит в состояние CHANGING после передачи первой опции Change для признака и возвращается в состояние STABLE после получения соответствующей опции Confirm. Нестабильное состояние (UNSTABLE) показывает, что конечная точка, находящаяся в состоянии CHANGING, изменила свой список предпочтений, но еще не передала опцию Change с новым списком.

                                                         timeout/
rcv Confirm R      app/protocol evt : snd Change L       rcv non-ack
: ignore      +---------------------------------------+  : snd Change L
     +----+   |                                       |  +----+
     |    v   |                   rcv Change R        v  |    v
  +------------+  rcv Confirm R   : calc new value, +------------+
  |            |  : accept value    snd Confirm L   |            |
  |   STABLE   |<-----------------------------------|  CHANGING  |
  |            |        rcv empty Confirm R         |            |
  +------------+        : revert to old value       +------------+
      |    ^                                            |    ^
      +----+                                  pref list |    | snd
rcv Change R                                  changes   |    | Change L
: calc new value, snd Confirm L                         v    |
                                                    +------------+
                                                +---|            |
                           rcv Confirm/Change R |   |  UNSTABLE  |
                           : ignore             +-->|            |
                                                    +------------+

Смена состояния признака в точке его реализации (feature location) происходит в соответствии с приведенным выше рисунком. На этой схеме не учитываются вопросы корректности порядковых номеров и опций — они отдельно описываются приведенным ниже псевдокодом.

Поддерживающей признак стороне (feature location) следует использовать приведенный здесь псевдокод, который соответствует диаграмме состояний, для реагирования на каждую корректную опцию согласования признаков, полученную в корректном пакете, не относящемся к непосредственной передаче данных (non-Data). Псевдокод содержит обозначения P.seqno и P.ackno, относящиеся к свойствам пакета, O.type и O.len, относящиеся к свойствам опции, FGSR и FGSS, относящиеся к свойствам соединения и обеспечивающие обработку случаев нарушения порядка доставки в соответствии с параграфом 6.6.4. F.state обозначает состояние признака (STABLE, CHANGING, UNSTABLE), а F.value — его значение.

Сначала проверяется, что данный признак известен (параграф 6.6.7).

Если F неизвестно
    Если опция помечена, как Mandatory, /* параграф 6.6.9 */
        Сброс соединения (Reset) и возврат
    Иначе, если O.type == Change R
        Передача пустой опции Confirm L в будущем пакете
    Возврат

Далее проверяется порядок доставки (параграф 6.6.4).

Если F.state == UNSTABLE или P.seqno <= FGSR или (O.type == Confirm R и P.ackno < FGSS)
    Игнорировать опцию и вернуться

После этого проверяется опция Change R.

Если O.type == Change R
    Если значение опции корректно /* параграф 6.6.8 */
        Рассчитать новое значение
        Передать опцию Confirm L в будущем пакете
        Установить F.state := STABLE
    Иначе, если опция была помечена, как Mandatory
        Сброс соединения (Reset) и возврат
    Иначе
        Передача пустой опции Confirm L в будущем пакете
        /* Сохраняется существующее состояние. Если состояние CHANGING, данная
           конечная точка позднее будет повторять передачу своей опции Change L. */

Далее обрабатывается опция Confirm R (только в состоянии CHANGING).

Если F.state == CHANGING и O.type == Confirm R
    Если O.len > 3 /* непустая опция */
        Если значение опции корректно
            Установить F.value := новое значение
        Иначе
            Сброс соединения (Reset) и возврат
        Установить F.state := STABLE

Варианты этой диаграммы состояний и псевдокода используются также для feature remote — в этом случае просто меняются местами обозначения L и R, чтобы они относились к опциям Change R и Confirm L.

2007 - 2017 © Русские переводы RFC, IETF, ISOC.