Каждое TCP-соединение поддерживает в управляющем блоке TCP большой набор переменных последовательности. Эта информация включает состояние соединения, таймеры, опции и флаги состояния, очередь, в которой хранятся внеочередные данные, и несколько переменных номеров последовательностей.
Переменные последовательности используются для определения пространства номеров последовательности отправки и получения, включая текущее окно для каждого. Окно находится в диапазоне номеров последовательности данных, которые разрешено передавать в настоящий момент, от первого октета еще не подтвержденных данных вплоть до конца диапазона, который был предоставлен в поле окна заголовка.
Переменные последовательности, использованные в FreeBSD для определения окон, представляют собой надмножество переменных, использованных в спецификации протокола. Значения переменных последовательности перечислены в таблице.
|
Переменная sndjina sndnxt sndwnd sndjnax rcvnxt rcv_wnd rcvjjdv tsjecent ts recent age |
Описание Наименьший еще не подтвержденный номер последовательности Следующий номер последовательности для отправки Число октетов данных, которые получит узел, начиная с snduna Наибольший отправленный номер последовательности Следующий ожидающийся номер последовательности для приема Число октетов после rcvnxt, которые могут быть приняты Последний октет приемного окна, сообщенный другому узлу Последняя отметка времени, полученная от другого узла Время, когда было получено ts_recent |
Область между snduna и sndjuna + sndjwnd известна как окно отправки. Данные для диапазона от sndjma до sndmax были отправлены, но еще не подтверждены и хранятся в буфере отправки сокета вместе с еще не переданными данными. Поле sndjixt обозначает следующий номер переменной последовательности для отправки и увеличивается по мере отправки данных.
Область от sndnxt до sndjina + sndwnd является оставшейся частью окна, годной для использования, и ее размер определяет, можно ли отправлять дополнительные данные. Значения sndnxt и sndjnax обычно сохраняются вместе, за исключением повторной передачи TCP. Область между rcvjixt и rcvjixt + rcv_wnd известна как приемное окно.
Эти номера последовательности используются в выходном модуле для принятия решения о том, можно ли отправлять данные, а во входном модуле для принятия решения о том, можно ли принять полученные данные. Когда получатель обнаруживает, что пакет принять нельзя из-за того, что данные выходят за пределы окна, он уничтожает пакет, но отправляет копию своего последнего подтверждения.
Если пакет содержал старые данные, первое подтверждение, возможно, было потеряно, и поэтому его нужно повторить. Подтверждение включает также обновление окна, синхронизацию состояния отправителя с состоянием получателя.
Если для соединения применяется опция отметок времени, тесты приемлемости входящего пакета подкрепляются проверками отметок времени. Каждый раз, когда входящий пакет принимается в качестве следующего ожидавшегося пакета, его отметка времени записывается в поле tsrecent управляющего блока протокола TCP. Если входящий пакет включает отметку времени, она сравнивается с последней полученной отметкой времени. Если отметка времени меньше, чем предыдущее значение, пакет уничтожается как старый дубликат, а в ответ отправляется текущее подтверждение. Таким образом, отметка времени служит в качестве расширения номера переменной последовательности, позволяя избежать случайного принятия старого дубликата, когда окно большое или номера последовательности могут быстро использоваться повторно.
Однако из-за степени детализации значения отметки времени временная отметка, полученная более 24 дней назад, не может сравниваться с новым значением, и этот тест пропускается. Текущее время записывается, когда tsrecent обновляется из входящей отметки времени для выполнения этого теста. Конечно, соединения редко бывают бездействующими в течение более 24 дней.