Исключения из механизма нумерации последовательностей TCP?
В ситуации, когда и клиент, и сервер устанавливают свои соответствующие порядковые номера на 0, я прочитал, что верно следующее:
C-->S: SYN=1, SEQ=0 (No data bytes)
C<--S: SYN=1, SEQ=0, ACK=1 (No data bytes)
C-->S: SEQ=1, ACK=1 (Data bytes optional)
В третьей части я понимаю, что сервер ожидает следующий порядковый номер 1
, но это не порядковые номера, которые должны быть установлены в initial_seq_num + sent_data_bytes_num
? Поскольку в первой части рукопожатия не было отправлено ни одного байта данных, не должен ли seq # быть 0?
Является ли это исключением во время рукопожатия или сегменты отправляются без байтов данных, которые должны увеличить порядковый номер на 1, если они вообще могут быть отправлены?
(Существуют аналогичные вопросы и ответы, но в ответе не объясняется, является ли это исключением на этапе установления связи или ИЛИ, если это происходит после установления соединения TCP. Я даже не уверен, может ли сегмент без байтов данных даже быть отправленным. Я предполагаю, что вы не можете)
ДОБАВЛЕНО Кажется, что пакеты TCP keep-alive также не имеют полезной нагрузки. RFC 1122 говорит в этих пакетах, SEG.SEQ = SND.NXT-1
и поскольку этот порядковый номер будет уже номером ACK, и будет отправлен дублированный ACK, чтобы сохранить порядковый номер сервера.
В противном случае я не смог бы найти никаких указаний на то, что нужно сделать, если порядковый номер правильный, но полезной нагрузки нет. Я могу ошибаться, так как я только кратко отсканировал документ, но нет также правила правил нумерации последовательностей во время рукопожатия, за исключением примеров.
В RFC 1122 говорится
К сожалению, некоторые неправильно реализованные реализации TCP не могут ответить на сегмент с SEG.SEQ = SND.NXT-1, если сегмент не содержит данных.
Так что я предполагаю, что это зависит от каждой реализации, но если есть какое-либо утверждение а) нумерации последовательностей во время рукопожатия и б) как вести себя, когда последовательность # верна, но нет полезной нагрузки, я был бы очень признателен, если бы кто-то может указать мне на эту часть.
Спасибо!
1 ответ
Первый ACK (который происходит как часть рукопожатия) подтверждает прием SYN с другого конца. Сегмент SYN не несет никаких данных. Но для обеспечения возможности подтверждения приема SYN первый ACK увеличивается, хотя никакой полезной нагрузки нет.