Я исследовал контроль перегрузки 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 дубликатов?
Я сделал все возможное, чтобы ваше название. Это может быть выключено, но ваш оригинал был почти бесполезен. Не стесняйтесь редактировать его дальше, чтобы уточнить. – GEOCHET