Протокол Go-back-N может существенно повысить степень использования канала. Однако, при определенных условиях его эффективность может стать низкой. Например, если размер окна достаточно большой, а скорость канала низкая, в канале одновременно находится много сегментов. Потеря всего одного сегмента может привести к необходимости повторной передачи достаточно большого количества сегметов, которые были доставлены ресиверу без ошибок.
Подобные недостатки стали причиной создания нового протокола гарантированной доставки данных «выборочный повтор» (Selective Repeat, далее - SR). Как можно понять из названия, этот протокол позволяет избегать повторной передачи тех сегментов, которые безошибочно, но вне очереди, были приняты ресивером. Повторно передаются только сегменты, переданные с ошибками.
Таким образом, для подтверждения повторно переданного сегмента ресивер должен послать передатчику индивидуальное подтверждение, и сегменты, пришедшие без ошибок, но вне очереди, должны быть подтверждены. Так же как и в протоколе Go-back-N в SR окно размера N используется для ограничения количества посланных, но не подтвержденных сегментов. Очевидно, что отличие SR от Go-back-N состоит в том, что в окне протокола SR могут находиться посланные и подтвержденные сегменты. Рассмотрим подробнее алгоритм «скользящее окно» с точки зрения передатчика и ресивера (см. рис. 1.12).
Алгоритм «скользящее окно», реализованный в SR, обеспечивает посылку подтверждения сегмента, принятого без ошибок, невзирая на его номер. Сегменты, поступающие в ресивер вне очереди, буферизируются до тех пор, пока не поступят сегменты с необходимым порядковым номером. Как только в ресивер поступят необходимые (пропущенные) сегменты - данные будут доставлены на прикладной уровень. Далее для понимания функционирования протокола SR необходимо рассмотреть алгоритмы передатчика и ресивера. Существует три события, которые передатчик должен обрабатывать:
• событие «запрос сверху»: прикладной уровень извещает транспортный уровень о необходимости осуществления передачи дан-
Рис. 1.12. Функционирование протокола ЭЯ: а) сторона передатчика; б) сторона ресивера ных и перелает их ему. Передатчик проверяет, какой номер может быть присвоен новому сегменту. Если этот номер не превышает значение эепсЫэазе + N. т.е. не выходит за рамки окна, то поступившие данные упаковываются в сегмент и посылаются. Иначе, либо передатчик может возвратить данные верхнему уровню и известить его о занятости ресурсов транспортного уровня, либо, при наличии возможности, буферизировать данные для последующей посылки. Также возможно реализовать функцию «семафора», когда транспортный уровень будет иметь возможность извещать прикладной уровень о доступности своих ресурсов;
• событие «получение сегмента подтверждения АСК»: в окне передатчик маркирует сегмент, для которого было получено подтверждение, как подтвержденный. Если номер пакета равен значению параметра sendjoase, окно сдвигается по направлению к неподтвержденным сегментам. Если после сдвига окна в него попадают еще непосланньге сегменты, то инициируется их передача;
• событие «истечение таймера»: индивидуальный таймер запускается при посылке каждого сегмента. При поступлении сегмента подтверждения соответствующий этому сегменту таймер обнуляется. Если же значение таймера истекло до получения сегмента подтверждения, то протокол принимает решение, что сегмент потерян и осуществляет его повторную передачу. Возможные сценарии рассмотрены ниже.
Так же как в протоколе Go-back-N, в SR существует всего одно событие «запрос снизу», которое должен обрабатывать ресивер. Различается три случая, в зависимости от номера поступившего сегмента:
• номер сегмента принадлежит интервалу [rev base, rcv_base+N-l] и этот сегмент принят без ошибок: это означает, что он принадлежит окну ресивера - передатчику посылается сегмент подтверждения, называемый «выборочным» (selective acknowledgement segment), в связи с тем, что при помощи этого сегмента осуществляется подтверждение успешного поступления в ресивер одного конкретного сегмента данных.
Если поступивший сегмент не имеет более ранней копии, т.е. поступил в первый раз, то он буферизируется. Далее, если номер этого сегмента равен значению параметра rcv_base, т.е. очередность поступления сегментов не нарушена, данные из этого сегмента и из последующих ранее поступивших сегментов, если такие существуют, передаются на уровень приложений. Значение параметра rcv_base сдвигается на количество сегментов, данные которых были переданы на прикладной уровень. Например, на рис. 1.13 приведен пример, когда сегменты поступают в ресивер, размер окна которого равен пяти.
Сегментам присваиваются номера от 0 до 9. Пусть эти сегменты поступают в следующей последовательности: 0, 1, 3, 4, 2, 5. Сегмент номер 2 потерян. Сегменты 0, 1, 3, 4 приняты и подтверждены сегментами АСКО, АСК1, АСКЗ, АСК4. Когда в ресивер поступает сегмент номер 2 (его повторная передача осуществляется после истечения таймера передатчика), данные из сегментов 2, 3, 4 и 5 передаются на прикладной уровень.
Посылается сегмент подтверждения сегмента номер 2 - АСК2. Параметр гс^Ьаэе принимает значение 6;
• номер сегмента пренадлежит интервалу [ гсу_Ьазе-К, гсу_Ьазе-1]: в этом случае ресивер должен послать сегмент подтверждения, несмотря даже на то, что этот сегмент уже был ранее принят и подтвержден;
• номер сегмента отличен от вышеобозначенных интервалов: сегмент сбрасывается.
Рис. 1.13. Пример функционирования протокола Эй Необходимо обратить особое внимание на случай, рассмотренный вторым при анализе события «запрос снизу» протокола БЯ. Ресивер посылает повторно сегмент подтверждения уже ранее подтвержденного сегмента, номер которого ниже значения параметра начала окна ресивера гсу_Ьазе. Подобные действия могут показаться странными и поэтому рассмотрим этот момент более внимательно.
Обратимся к рис. 1.12. Если для сегмента с номером зег.сЫэазе, посланного передатчиком ресиверу, в передатчик не поступает сегмент подтверждения, то через некоторый промежуток времени, определенный таймером, передатчик повторно осуществляет передачу этого сегмента. Это точка зрения передатчика. С точки зрения ресивера, например, можно предположить, что этот сегмент был успешно получен и подтвержден, но сегмент подтверждения был потерян в результате передачи. Таким образом, в данном случае имеем ситуацию, когда окно ресивера сдвинуто относительно окна передатчика. Для передатчика сегмент с номером Бепсі_Ьазе принадлежит окну, а для ресивера этот сегмент не принадлежит окну.
Выше был описан случай, объясняющий возможные недостатки протокола БИ., конкретно - отсутствие достаточной синхронизации между передатчиком и приемником. Это не единственный недостаток. В связи с тем, что далее нами будет рассмотрен реальный протокол ТСР, базирующийся в том числе и на БЯ, необходимо досконально понимать принципы и тонкости функционирования протоколов АІІС).
Рассмотренный пример будет неполным, если не учитывать нумерацию сегментов, выполняемую протоколом транспортного уровня. Как было отмечено выше, нумерация сегментов осуществляется циклически, т.е. по достижении заранее определенного максимального номера сегмента последующему сегменту присваивается номер ‘О’. Далее предположим, что размер окна равен трем, а сегментам присваиваются номера от 0 до 3. Пусть сегменты номер 0, 1 и 2 были переданы передатчиком и безошибочно поступили в ресивер, после чего эти сегменты были подтверждены и окно ресивера было сдвинуто на три позиции, т.е. значение параметра гс^_Ьазе стало равно 3. Таким образом, в окно ресивера теперь входят четвертый, пятый и шестой сегменты, имеющие порядковые номера 3, 0 и 1, соответственно. Рассмотрим два частных случая, иллюстрации к которым приведены на рис. \A4.a и 1.14.6, соответственно:
• сегменты подтверждения для первых трех поступивших в ресивер сегментов были потеряны. Вследствие этого через некоторые интервалы времени, определенные таймерами, сегменты будут повторно посланы. Далее, в ресивер после сегмента номер 2 опять поступит сегмент 0 - копия первого переданного сегмента;
• сегменты подтверждения для первых трех поступивших в ресивер сегментов были безошибочно доставлены передатчику. Вследствие этого передатчик сдвинул окно на три сегмента и начал передачу четвертого, пятого и шестого сегментов, имеющих порядковые номера 3, 0 и 1, соответственно. Далее, пусть сегмент с номером 3 был потерян, а сегменты с номерами 0 и 1 были доставлены безошибочно.
Рис. 1.14. Дилемма протокола ЭЯ при большом размере окна: новый сегмент или копия?
Теперь рассмотрим сложившиеся ситуации с точки зрения ресивера. Очевидно, что ресивер никак не может быть осведомлен о том что происходит в передатчике, кроме как посредством анализа информации, которая содержится в сегментах, поступающих от передатчика. Таким образом, два случая, рассмотренные выше, с точки зрения передатчика, являются идентичными, т.е. для него не существует различия между поступающими сегментами с номером ‘0’, хотя в первом случае это - копия первого сегмента, подтверждение которого было потеряно, а во втором - пятый сегмент, если последовательно считать с первого переданного.
С точки зрения транспортного уровня не существует никакого способа различить эти сегменты, ибо их заголовки одинаковы. Возникает вопрос, почему же это произошло и каким образом избежать такой ситуации? Очевидно, что самый простой вывод, который может быть сделан, может быть сформулирован следующим образом: если значение размера окна меньше значения размера цикла нумерации сегментов, протокол SR не сможет корректно функционировать. Поэтому, в реализациях протоколов в соответствии с SR рекомендуется использовать размер окна равный или меньший половины размера цикла нумерации сегментов.
Как было отмечено ранее, между транспортными уровнями источника и приемника в сетях на базе протокола IP используется ненадежный канал, т.е. возможны потери сегментов и доставка их в неправильном порядке. Поэтому проблема корректного выбора размеров окна и цикла нумерации сегментов как никогда остра.
⇐Протокол go-back-n | Управление трафиком и качество обслужевания в сети | Обработка сегментов подтверждения аск в tcp⇒