Основополагающей идеей в проектировании протокола является то, что каждый октет данных, посылаемый на TCP соединение, имеет номер очереди. Поскольку каждый октет пронумерован, то каждый из них может быть опознан. Приемлемый механизм опознания является накопительным, так что опознание номера X означает, что все октеты с предыдущими номерами уже получены. Этот механизм позволяет регистрировать появление дубликатов в условиях повторной передачи. Нумерация октетов в пределах сегмента осуществляется так, чтобы первый октет данных сразу вслед за заголовком имел наименьший номер, а следующие за ним октеты имели номера по возрастающей.
Важно помнить о том, что количество номеров для очереди, хоть и велико, но ограничено. Диапазон номеров - от 0 до 2**32-1. Поскольку набор ограничен, то все арифметические операции с номерами очередей должны осуществляться по модулю 2**32. Это совсем не означает всякий раз предварительную арифметическую проверку номеров очереди на попадание в диапазон от 2**32-1 до 0. В работе с модульной арифметикой есть некие тонкости, поэтому нужно аккуратно программировать сравнение столь больших величин. Так символ '=<' означает "меньше или равно" (по модулю 2**32).
Протокол TCP должен осуществлять следующие типы сравнения для номеров очереди:
(a) | является ли номер в подтверждении номером очереди для октетов, уже отправленных, но еще не получивших подтверждения; |
(b) | получили ли все октеты в сегменте подтверждение своих номеров (т.е. следует ли удалить данный сегмент из очереди на повторную посылку); |
(c) | содержит ли пришедший сегмент ожидаемые нами номера (т.е. "перекрывает" ли этот сегмент окно получателя). |
В ответ на посылку данных протокол TCP будет получать их подтверждение. Для работы с полученным подтверждением необходимо уметь делать сравнение для
самого старого из номеров, не имевших подтверждения, |
следующего номера очереди, ждущего посылки, |
номера подтверждения, полученного от чужой принимающей программы TCP (следующего номера очереди, ожидаемого чужой программой TCP), |
номера очереди первого октета в сегменте, |
количества октетов в поле данных сегмента (учитывая SYN и FIN), |
номера очереди последнего октета из сегмента. |
следующий номер из очереди приходящих сегментов, а также левая или нижняя граница окна получения, |
номер очереди последнего сегмента, ожидаемого в приходящем сегменте, а также правая или верхняя граница окна получения, |
первый номер в очереди, принесенный пришедшим сегментом, |
последний номер в очереди, принесенный пришедшим сегментом. |
длина сегмента |
окно получения |
тест |
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 |