Алексей Барабанов
Есть расхожее мнение, что сетевые туннели выгоднее делать на основе
протоколов низкого уровня с минимальными размерами заголовков и очень простым
протоколом. Считается, что TCP как несущий протокол создает много
проблем. Так ли это?
Использование TCP стало столь привычным, что большинство просто не
задумывается о заложенных в этот протокол механизмах и во всех случаях
полагается на «интеллект» системы. Одновременно с этим, если встречаются
какие-то сведения, объясняющие что-то в его поведении, или теории, построенные
на основе, так сказать, «упрощенных» представлений, то у многих просто
недостает знаний правильно оценить полученную информацию. Что приводит к
появлению технологических мифов. Один из которых, порожденный статьей [1] Олафа
Титца (Olaf Titz), здесь и попробуем опровергнуть. К сожалению, в России
все, что написано на иностранном языке да еще размещено на зарубежном
сайте, воспринимается как святое откровение. Хотя многие далее вынесенного в ее
заголовок тезиса «Why TCP Over TCP Is A Bad Idea» и не читают. Чтобы
уравнять шансы тех, кто имеет затруднения с английским языком, предложим
дословный технический перевод упомянутого опуса [2]. В переводе не
использовались никакие литературные экстраполяции, чтобы максимально точно
донести идеи автора и ни в коем случае не исправить на этапе перевода что-то из
многочисленных его ошибок. Разберем текст этой статьи.
Суть проблемы
Итак, первое, что по мнению Олафа, мешает эффективной работе TCP
в качестве туннеля, это повторные передачи. Если отбросить туманные
рассуждения о насыщении канала (meltdown) из-за мифического фиксированного
тайм-аута, которого нет в TCP, то в «сухом остатке» в первом разделе
статьи лишь утверждение об экспоненциальном росте тайм-аута, если,
цитирую, «сегмент задерживается сверх тайм-аута». Рассмотрим подробнее. Автор
упорно не желает использовать общепринятую терминологию и предпочитает
изъясняться как колдун-друид. Но так как в тексте упоминается
RFC2001, то можно воспользоваться ссылкой [3] и попытаться догадаться, на что
намекает Олаф Титц. Единственный показатель, имеющий в RFC2001
экспоненциальный рост, – это CWND (congestion window). Но окно насыщения, или
CWND, связано с пропускной способностью прямой зависимостью. Автор же намекает,
что задержки растут по экспоненте и это якобы приводит к снижению темпа
передачи. Задержки – это RTT (round trip time), или время обращения, на
основании которых высчитывается RTO (retransmission time out), или таймер
повтора. Об этом нет ничего в RFC2001. Но по другим документам можно
узнать, как это происходит. Например, в RFC793 [4], упоминаемом также в статье,
описан метод расчета RTO для каждого текущего пакета. Так вот, там
используется показатель SRTT (smooted round trip time), или взвешенное время
обращения. Подчеркиваю – взвешенное! Где тут Олаф «раскопал» экспоненту?
Конечно, можно догадаться, что автор спутал расчет RTO при задержке с расчетом
RTO при потере! Вот, если бы сегмент вообще пропал и от получателя нет
никаких ответов, тогда алгоритм TCP на самом деле требует произвести
повторы с экспоненциальным замедлением. Но, не смущаясь мелкими
деталями, Олаф связывает увеличение периодов проверки на обрыв соединения с
борьбой с насыщением, то есть с тем самым meltdown, который, как ружье со
стены в известной пьесе, если упомянуто в первом акте, то далее обязательно
«выстрелит». Таким образом, поскольку экспоненциального роста задержек передачи
в TCP нет, то измышления первой части обсуждаемой статьи [1] не имеют отношения
к реализации TCP в нашей с вами Вселенной.