1

Если tcp-программа A отправляет два пакета данных другой TCP-программе B, пакет 1: порядковый номер от 1000 до 2000; пакет 2: следующий номер от 2000 до 3000.

Обычно B должен ответить 2 ACK, один для подтверждения пакета 1, а другой для пакета 2. Теперь, если А получит только второй ACK, будет ли A ждать первого ACK или нет?

Я знаю, что TCP является байтово-ориентированным потоковым протоколом. так что не стоит ждать первого ACK, верно? Теоретически это так, как на счет реального реализованного стека TCP?

Кстати, у меня есть особый вопрос. Если A отправляет B B ACK с номером подтверждения 3001(это для подтверждения пакета 2). Но кто-то посередине меняет номер ack seq на 2501, то есть B подтверждает половину TCP-пакета. Тогда будет ли A повторная передача из байта, что соответствует 2000 или 2501?

3 ответа3

5

TCP будет подтверждать порядковые номера, а не пакеты. Таким образом, даже без «кого-то посередине» программа А может получить только часть принятого пакета (т. Е. Сокету не хватает места в буфере для всего пакета). В вашем примере 2501 будет повторно передан программой B.

TCP также поддерживает Selective Ack, поэтому необходимо передать только отсутствующий сегмент (в пространстве номеров seq)

3

Нет, TCP применяет механизм "скользящего окна", чтобы уменьшить количество необходимых подтверждений.

Хорошая визуализация и объяснение: http://histrory.visualland.net/tcp_swnd.html

0

B предлагает «окно» (буферного пространства) для A в своем подтверждении. Не нужно ждать определенного подтверждения перед отправкой последующих пакетов, если оно не превышает текущее окно B.

Предостережение: Гораздо проще, как в интересах краткости, так и из-за моего несколько ограниченного понимания протокола. RFC: 813 - СТРАТЕГИЯ ОКНА И ПОДТВЕРЖДЕНИЯ В TCP говорит об этой самой технике.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .