Каков порядок пакетов в буфере отправителя TCP и почему пакеты в буфере получателя не являются непрерывными?

#tcp

#tcp

Вопрос:

Сценарий касается скользящего окна на уровне TCP. Левая сторона изображения удалена — это буфер отправителя (заполненный пустыми и светло-синими областями), затем правая сторона — буфер получателя. Как мы знаем, данные, которые мы хотим передать, должны быть разделены на несколько пакетов, и они помечены в последовательности, готовой к передаче. Однако я сомневаюсь в следующих проблемах.

  1. Почему в буфере отправителя такой порядок пакетов, расположены ли пакеты в порядке номера seq?

(Я имею в виду, что буфер отправителя пакетов должен упорядочиваться по отмеченному порядковому номеру? или не по порядку?)

  1. Почему пакеты в буфере получателя не являются непрерывными, когда это могло произойти? Взорванная картинка — это буфер отправителя (слева) и буфер получателя (справа) tcp-соединения.

(Я имею в виду, что получатель пакетов получает и сохраняет в буфере в порядке порядкового номера пакетов? если да, означает ли это, что буфер облегчает повторную сборку пакетов?)


введите описание изображения здесь

Комментарии:

1. Непонятно, о чем вы спрашиваете. Изображение могло бы быть полезным, но ссылка нарушена (по крайней мере, для пользователей, которые не вошли в gitee.com ).

2. @Steffen Ullrich, спасибо за напоминание, изображение доступно уже сейчас .

3. Вопрос все еще не ясен, поскольку в нем отсутствует существенный контекст. О каком буфере отправки и приема вы вообще говорите (для конкретного сокета)? Это изображение специфично для некоторого выбранного стека TCP или в целом…

4. Я добавил еще немного контекста для объяснения моего вопроса, надеюсь, это понятнее. Извините за мелочи.

Ответ №1:

К сожалению, в вашем вопросе не так много контекста, и неясно, откуда взято это изображение. Но я предполагаю, что изображение относится к буферу отправки и приема сокетов в ядре.

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

В отличие от этого, ядро не контролирует, в каком порядке принимаются данные, и может случиться, что более поздние данные (с более высоким порядковым номером) будут получены раньше, чем предыдущие данные, поскольку предыдущие данные были потеряны или из-за изменения порядка при передаче. Таким образом, в принятых данных могут быть пробелы, которые, как мы надеемся, будут заполнены после получения оставшихся данных.

Комментарии:

1. Спасибо, Штеффен. Вот мое понимание, пожалуйста, исправьте это при необходимости. Буфер сохраняет места для предыдущих пакетов, которые не были получены. И даже если пакеты с более высоким порядковым номером прибыли, получатель не передаст отправителю подтверждение на основе пакетов с более высоким порядковым номером, пока не поступят обратные места для пакетов с более низким порядковым номером. В противном случае, как только отправитель получит ACK пакетов с более высоким порядковым номером, подтвердите отправку пакетов до того, как все они будут получены правильно. Этот механизм гарантирует корректность и безопасность.