Получатель - A, отправитель - B
Получатель устанавливает размер окна равным 1000, и B отправляет сегменты.
Предположим, что сегмент с 500 по 521 потерян.
Тогда получатель A отправит ack
из 501 отправителю. Как только отправитель получит ack
501 он затем снова начнет отправлять сегменты с 501 по 1000.
Отправляет ли отправитель все от 501 до 1000, не ожидая подтверждения в середине?
Нет, отправитель будет ожидать подтверждения в обычном режиме.
Лучше всего думать об этом в большинстве основных примитивов для отправителя: отправить, получить подтверждение, пометить как полученное (многие последовательности, конечно, выполняются параллельно). Если отправлено, но не подтверждено, попробуйте снова всю процедуру.
Это также работает не только с данными, но и с потерей пакетов при подтверждении. TCP (= большинство реализаций) справляется с большими потерями пакетов лучше всего описывается как «почти не работает»
Мне любопытно, зачем вам такие подробные знания, применимы ли они к практической задаче?
Это больше похоже на домашнее задание:> Если это не упражнение, было бы лучше сказать нам, какой TCP вы используете (Рино, Вегас, Тахо, ...)?
Просто чтобы ответить на ваш вопрос ... Отправитель будет ждать таймаута перед повторной передачей пакета. Чтобы ограничить эту задержку (в некоторых случаях), некоторые реализации поддерживают тройное подтверждение. Если Receiver обнаруживает поврежденный пакет, вместо того, чтобы ничего делать, он отправляет обратно тройное подтверждение. Таким образом, когда отправитель получает это, он немедленно начинает передачу.
Более того, это зависит от того, использует ли ваша реализация go-back-n, выборочное повторение и т. Д. В каждом случае используются разные подходы.