2009-02-11 2 views
3

Я исследовал контроль перегрузки TCP в последнее время, однако один вопрос мучает меня ...Как TCP обрабатывает таймауты с помощью cwnd?

Если я все понимаю правильно, TCP не будет посылать новые данные, если не разрешено CWnd (заторы окна) и rwnd (прием сообщений боковое окно). Иными словами:

if(flightSize < MIN(cwnd, rwnd)) 
{ 
    // Send some new data (if possible) 
    // Taking into account other details that we don't need 
    // to get into such as Nagle's algorithm, etc. 
} 

Где flightSize - это объем данных, которые были отправлены, но еще не подтверждены.

Предположим, что TCP идет, отправляя данные и увеличивая cwnd соответствующим образом. Скажем, cwnd = [10 полных пакетов] и flightSize == cwnd. Затем происходит потеря пакетов в сети, и таймер повторной передачи отправителя отключается. Как/Когда New Reno повторно передает неподтвержденные данные?

Вот мое нынешнее понимание/непонимание:

Когда таймер гаснет, CWnd будет сброшен в [1 полный пакет], самый старый Sent, но непризнанный пакет будет повторно, то RTO будет удвоено, и таймер повторной передачи будет сброшен. Поэтому, если мы говорим, что rto составлял 1 секунду, когда таймер погас, он будет обновлен до 2 секунд, и таймер повторной передачи снова начнется с временем ожидания 2 секунды.

Вот почему я запутался:

В описанной выше ситуации, TCP будет повторно передать только один пакет. Даже если этот пакет сразу получает ACKed, TCP не может отправлять какие-либо НОВЫЕ данные, потому что cwnd все еще меньше, чем FlightSize. Так что же он делает? Сядьте и подождите, пока второй таймер повторной передачи не погаснет, прежде чем повторно отправить другой пакет? Заставляет ли он повторно отправлять старые данные, поскольку не может отправлять новые данные? Сбрасывает ли он FlightSize и пересматривает все ранее отправленные данные как неотправленные?

Я прочитал все RFC, которые я мог найти, и всевозможные руководства и объяснения TCP. Должно быть, я пропустил что-то где-то ...


Разъяснение: Я рассматривал несколько потерь, где TCP не использует МЕШОК.

Если получены дубликаты, TCP отправит самую старую акцию на третий дубликат ack (быстрый retrasmit) и отправит новые данные и после 4-го дубликата ack (быстрое восстановление). Мой вопрос касается того, что произойдет, если TCP-отправитель получит меньше 3 дубликатов?

+0

Я сделал все возможное, чтобы ваше название. Это может быть выключено, но ваш оригинал был почти бесполезен. Не стесняйтесь редактировать его дальше, чтобы уточнить. – GEOCHET

ответ

3

Я нашел ответ в книге "TCP/IP Illustrated, Volume 2", раздел 25.11, страницы 842-844:

[На тайм-аута повторной передачи] следующий номер последовательности (snd_nxt) устанавливается на старую непризнанную последовательность номер (snd_una). ... Перемещая snd_nxt назад, [TCP может начинаться с повторно передавать все неподтвержденные данные].

Другими словами, flightSize будет сброшен, поэтому данные могут продолжать отправляться (в режиме медленного запуска). Просто некоторые из этих данных могут быть данными, которые уже были отправлены ранее. Накопительная сумма может возникнуть, что предотвращает все данные от повторного присутствия.

0

Просьбы уточнить: вы рассматриваете потерю одного пакета? Или несколько потерь в окне?

В случае единственной потери будут получены дублированные подтверждения, полученные из-за пакетов, полученных после утерянного. Я считаю, что New Reno будет передавать последующие пакеты («НОВЫЕ данные») в ответ на дубликаты. Затем происходит сброс таймера тайм-аута.

+0

Я рассматривал несколько потерь, когда TCP не использует SACK. Если получены дубликаты, TCP отправит самую старую акцию на третий дубликат ack (быстрый retrasmit) и отправит новые данные и после 4-го дублирования ack (быстрое восстановление). Но что, если отправитель TCP получает всего 2 дубликата? –

+0

Я рассматривал несколько потерь, когда TCP не использует SACK. Если получаются дубликаты, TCP отправит самую старую акцию на третий дубликат ack (быстрый retrasmit) и отправит новые данные и после 4-го дублирования ack (быстрое восстановление). Но что, если отправитель TCP получает всего 2 дубликата? –

+0

Вы получите только прекращение получения дубликатов, если пульт больше не получает пакеты (например, потеря или конец окна). Но если вы действительно видите несколько потерь, это должно указывать на перегрузку, и вы, вероятно, столкнетесь с медленным запуском. –

Смежные вопросы