Реализация метода скользящего окна в протоколе TCP
В протоколе TCP этот метод имеет некоторые существенные особенности. Хотя единицей передаваемых данных протокола TCP является сегмент, окно определено на множестве нумерованных байтов неструктурированного потока данных передаваемого приложения протоколу TCP. В ходе переговорного процесса модули TCP договариваются между собой о параметрах процедуры обмена данными, одним из таких параметров является начальный номер байта, с которого будет вестись отсчёт в течение всего функционирования данного соединения. Нумерация осуществляется начиная от заголовка. Когда отправитель посылает TCP сегмент, он помещает в поле последовательного номера номер первого байта данного сегмента, который служит идентификатором сегмента. На основании этих номеров получатель TCP сегмента не только отличает данный сегмент от других, но и позиционирует полученный фрагмент относительно общего потока байтов. В качестве квитанции получатель сегмента отсылает ответное сообщение, где в поле подтверждённого номера помещается число, на единицу превышающее максимальный номер байта в полученном сегменте. Подтверждённый номер интерпретируется не только как оповещение о благополучной доставке, но и как номер следующего ожидаемого байта данных. Квитанция в протоколе TCP отсылается в случае только правильного приёма данных.
В соответствии с определённым форматом один и тот же TCP сегмент может нести в себе как пользовательские данные, так и квитанцию, которой подтверждается получение данных другой стороной.
Т.к. протокол TCP дуплексный, то у каждой стороны есть пара буферов, один для хранения принятых сегментов, другой для хранения сегментов, которые предстоит отправить. Кроме того, есть буфер для хранения копий сегментов, которые были отправлены, но квитанция о получении которых ещё не поступает.
При установлении соединения участники обмениваются окнами приёма, в этом окне указывается сколько байтов разрешается отправить с момента получения последней квитанции. Из потока байтов, поступающих от приложения в выходной буфер, модуль TCP нарезает последовательность сегментов и поочерёдно отправляет их приложению-получателю. В этом потоке можно указать следующие логические границы:
1) Отделяет сегменты, которые уже были отправлены и на которые уже пришли квитанции.
2) Располагается вслед за 1-ой границей и определяется размером окна, т.е. количеством байт, составляющих сегменты, которые отправлены, но квитанции на которые ещё не получены
3) Это сегменты, которые не отправлены, но могут быть отправлены, т.к. входят в пределы окна
4) Указывает на начало последовательности сегментов, ни один из которых не может быть отправлен до тех пор, пока не придёт очередная квитанция и окно не будет сдвинуто.
Дата добавления: 2015-11-28; просмотров: 1523;