
что TCP – дуплексный протокол, так как безо всяких ограничений позволяет обмен данными между
двумя участниками соединения.
На основании рассмотренных примеров Вам может показаться, что в ответ на КАЖДЫЙ
сегмент с данными необходимо послать сегмент с квитанцией, рассмотрим пример,
иллюстрирующий объединение квитанций. Отметим, что в TCP отправитель обычно может
отсылать более одного не квитированного сегмента, т.е. ожидание квитанции на отправленный
сегмент с данными НЕ является обязательным условием для отправки нового сегмента с данными
(отметим, что детально об этом мы будем говорить позже).
Подчеркнем, что сегмент номер 6 на данной диаграмме является объединенной квитанцией
на сегменты 4 и 5, посланные клиентом. Использование объединенных квитанций дает уменьшение
количества служебных пакетов в сети – как следствие уменьшение нагрузки на сеть.
Отметим еще один важный момент. В том случае, если TCP на стороне получателя заведомо
уверен, что потерял какой то сегмент (например, у полученного сегмента не совпала контрольная
сумма), он НЕ имеет механизма для того, чтобы уведомить отправителя о потерянном сегменте,
иными словами в TCP не существует понятия отрицательной квитанции. Отправитель повторит
этот сегмент по таймауту, когда истечет время, в течение которого отправитель сегмента ожидает
на него положительную квитанцию. Безусловно, такой подход страдает излишними задержками
при повторной передаче сегментов – действительно, в случае, если используются явные
отрицательные квитанции, отправитель может быстрее повторить сегмент, нежели в том случае,
если повтор делается по таймауту на отсутствие положительной квитанции. Отметим, что в TCP
существует договоренность об искусственных отрицательных квитанциях, но об этом мы будем
говорить позже. Так же важно отметить, что в TCP нельзя квитировать полученные сегменты в том
случае, если сегменты с меньшими последовательными номерами еще не получены. Действительно,
как нам известно, заполнение поля Acknowledged Number некоторым значением говорит о том, что
ВСЕ байты с номерами, меньшими этого значения получены успешно, таким образом в случае, если
в приятом наборе сегментов есть «пробел» (пропущенный сегмент), получатель имеет право
квитировать байта вплоть до пропущенного сегмента (не включительно, разумеется), а затем ждать
повтора пропущенного сегмента для того, чтобы затем квитировать целый блок сегментов.
Подводим общий итог. Данная тема рассмотрена нами с целью понять, каким образом
используется нумерация передаваемых данных и квитирование в протоколе TCP, фактически нашей
целью было лишь простейшее понимание механизма использования полей Sequence Number и
Acknowledged Number протоколом TCP. Важно понять, что мы еще не изучили квитирование в
полном объеме, мы не рассмотрели главного – стратегий квитирования, вопросов оптимизации