RFC: 1122
Оригинал: Requirements for Internet Hosts - Communication Layers
Категория: Стандарт Интернета
Дата публикации:
Автор:
Перевод: Николай Малых
4.2.3.4 Когда передавать данные

Протокол TCP должен поддерживать механизм предотвращения SWS на приемной стороне.

Для протокола TCP рекомендуется реализация алгоритма Nagle [RFC896], позволяющего объединять короткие сегменты. Однако, приложениям должен обеспечиваться способ запрета алгоритма Nagle для отдельных соединений. Во всех случаях для передачи данных действуют также ограничения, вносимые алгоритмом Slow Start (см. 4.2.2.15).

  • Обсуждение:
  • Алгоритм Nagle в общем случае действует следующим образом:

    При наличии неподтвержденных данных (т. е., SND.NXT > SND.UNA) в буферы TCP передаются все пользовательские данные (не принимая во внимание бит PSH), пока остающиеся данные не будут подтверждены или пока TCP не сможет передать сегмент полного размера (Eff.snd.MSS байтов; см. 4.2.2.6).

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

  • Реализация
  • Алгоритм предотвращения SWS на передающей стороне реализуется сложней, нежели на приемной, поскольку отправитель не знает (явно) размер буферного пространства RCV.BUFF на приемной стороне. Проверенным вариантом является расчет отправителем значения максимального окна передачи для соединения Max(SND.WND) и использование полученного значения для оценки RCV.BUFF. К сожалению, возможна только оценка буфера, поскольку приемная сторона может время от времени менять значение RCV.BUFF. Чтобы избежать застоя соединений в результате этого, необходимо использовать значение тайм-аута для форсирования передачи данных, имеющего преимущество перед алгоритмом предотвращения SWS. На практике форсирование передачи по тайм-ауту должно происходить редко.

    Доступное окно (useable window) имеет размер ([RFC813]):

    U = SND.UNA + SND.WND - SND.NXT

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

    1. при достижении максимального размера передаваемого сегмента, т. е.:

      min(D,U) >= Eff.snd.MSS;
    2. или установлен флаг push и все данные из очереди могут быть переданы, т. е.:

      [SND.NXT = SND.UNA and] PUSHED and D <= U

      (условие в квадратных скобках вносится алгоритмом Nagle);

    3. или по крайней мере Fs-ая часть максимального окна может быть передана, т. е.:

      [SND.NXT = SND.UNA and] min(D.U) >= Fs * Max(SND.WND);
    4. или установлен флаг PUSH и достигнут тайм-аут.

      Fs представляет собой часть, рекомендуемое значение которой составляет 1/2. Значение тайм-аута должно составлять 0.1-1.0 сек. Может оказаться удобным объединение этого таймера с таймером проверки нулевого окна, описанным в параграфе 4.2.2.17.

    В заключение отметим, что использование алгоритма предотвращения SWS рекомендуется взамен алгоритма sender-side, описанного в работе [RFC813].

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