Я недавно исследовал контроль перегрузки TCP, но меня мучает один вопрос ...
Если я все правильно понимаю, 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 полный пакет], самый старый отправленный, но неподтвержденный пакет будет повторно отправлен, rto будет удвоен, и таймер повторной передачи будет сброшен. Поэтому, если мы скажем, что rto было 1 секунда, когда таймер отключился, он будет обновлен до 2 секунд, и таймер повторной передачи снова запустится со временем ожидания 2 секунды.
Вот почему я запутался:
В описанной выше ситуации TCP отправит только один пакет. Даже если этот пакет получает ACK сразу, TCP не может отправить НОВЫЕ данные, потому что cwnd по-прежнему меньше, чем flightSize. Так что же это делает? Сядьте и подождите, пока 2-секундный таймер повторной передачи снова не сработает, прежде чем отправлять другой пакет? Вызывает ли это повторную отправку старых данных, поскольку не может отправить новые данные? Сбрасывает ли FlightSize и пересматривает ли все ранее отправленные данные для отправки?
Я прочитал все RFC, которые смог найти, и всевозможные руководства и пояснения по TCP. Должно быть, я что-то пропустил где-то ...
Разъяснение:
Я рассматривал множественные потери, когда TCP не использует SACK.
Если получены дубликаты подтверждения, TCP отправит самый старый подтверждение 3-го дублирования подтверждения (быстрая повторная передача) и отправит новые данные после 4-го дублирования подтверждения (быстрое восстановление). Мой вопрос касается того, что произойдет, если отправитель TCP получит менее 3-х дублирующих подтверждений?