Справочник по сетевым протоколам

       

Номер очереди


Основополагающей идеей в проектировании протокола является то, что каждый октет данных, посылаемый на TCP соединение, имеет номер очереди. Поскольку каждый октет пронумерован, то каждый из них может быть опознан. Приемлемый механизм опознания является накопительным, так что опознание номера X означает, что все октеты с предыдущими номерами уже получены. Этот механизм позволяет регистрировать появление дубликатов в условиях повторной передачи. Нумерация октетов в пределах сегмента осуществляется так, чтобы первый октет данных сразу вслед за заголовком имел наименьший номер, а следующие за ним октеты имели номера по возрастающей.

Важно помнить о том, что количество номеров для очереди, хоть и велико, но ограничено. Диапазон номеров - от 0 до 2**32-1. Поскольку набор ограничен, то все арифметические операции с номерами очередей должны осуществляться по модулю 2**32. Это совсем не означает всякий раз предварительную арифметическую проверку номеров очереди на попадание в диапазон от 2**32-1 до 0. В работе с модульной арифметикой есть некие тонкости, поэтому нужно аккуратно программировать сравнение столь больших величин. Так символ '=<' означает "меньше или равно" (по модулю 2**32).

Протокол TCP должен осуществлять следующие типы сравнения для номеров очереди:



(a) является ли номер в подтверждении номером очереди для октетов, уже отправленных, но еще не получивших подтверждения;
(b) получили ли все октеты в сегменте подтверждение своих номеров (т.е. следует ли удалить данный сегмент из очереди на повторную посылку);
(c) содержит ли пришедший сегмент ожидаемые нами номера (т.е. "перекрывает" ли этот сегмент окно получателя).

В ответ на посылку данных протокол TCP будет получать их подтверждение. Для работы с полученным подтверждением необходимо уметь делать сравнение для

SND.UNA

SND.NXT

SEG.ACK

SEG.SEQ

SEG.LEN

SEG.SEQ+SEG.LEN-1

самого старого из номеров, не имевших подтверждения,
следующего номера очереди, ждущего посылки,
номера подтверждения, полученного от чужой принимающей программы TCP (следующего номера очереди, ожидаемого чужой программой TCP),
номера очереди первого октета в сегменте,
количества октетов в поле данных сегмента (учитывая SYN и FIN),
номера очереди последнего октета из сегмента.
<


/p>

Новое подтверждение (называемое "подтверждением приемлемости") - это подтверждение выполнимости неравенств

SND.UNA < SEG.ACK =< SND.NXT

Сегмент из очереди повторной посылки получает полное подтверждение, если сумма его номера в очереди и длины поля данных меньше или равна номеру подтверждения из пришедшего сегмента.

При получении данных необходимо производить операции сравнения для следующих величин:

RCV.NXT

RCV.NXT+RCV.WND-1

SEG.SEQ

SEG.SEQ+SEG.LEN-1

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

RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND или

RCV.NXT =< SEG.SEQ+SEG.LEN-1 < RCV.NXT+RCV.WND

Первая часть этого текста смотрит, попадает ли начало сегмента на окно, а вторая часть - попадает ли в окно задняя часть сегмента. Если выполняется какая-либо часть теста, то сегмент попадает в окно.

Действительность несколько сложнее. Выбирая окно нулевой длины или сегмент нулевой длины, мы получаем четыре варианта проверки на приемлемость для приходящих сегментов

длина

сегмента
окно

получения
тест
0 0 SEG.SEQ = RCV.NXT
0 >0 RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND
>0 0 неприемлемо
>0 >0 RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND или

RCV.NXT =< SEG.SEQ+SEG.LEN-1 < RCV.NXT+RCV.WND
Заметим, что когда окно, получения нулевое, никакие сегменты приниматься не будут за исключением ACK сегментов. Таким образом, протокол TCP может устанавливать нулевое окно получения при передаче данных и получении подтверждений. Однако даже когда окно получения нулевое, программа протокола TCP обязана обрабатывать поля RST и URG всех приходящих сегментов.



Мы получили преимущество данной схемы нумерации в том, что она допускает также защиту для определенной управляющей информации. Это достигается косвенным образом посредством включения некоторых контрольных флагов в очередь, так что они могут быть повторно посланы и подтверждены без сбоя (т.е. будет задействована одна или несколько копий).

Управляющая информация реально находится не в поле данных сегмента. Следовательно, мы должны принять правила косвенного присвоения номеров очереди сегментам управления. SYN и FIN являются единственными управляющими сигналами, приемлемыми для такой защиты, и они используются только при открытии и закрытии соединения. Для целей поддержания очередности, сигнал SYN рассматривается как стоящий перед первым действительным октетом данных в сегменте, куда оба они были помещены. В то же время FIN считается стоящим после последнего реального октета данных в сегменте. Длина сегмента (SEG.LEN) учитывает как данные, так и номера очереди, отведенные под управление. В случае, когда присутствует SYN, значение SEG.SEQ соответствует номеру в очереди для сигнала SYN.


Содержание раздела