Скачиваний:
0
Добавлен:
04.02.2026
Размер:
221.68 Кб
Скачать

Диаграмма медленного старта

text

CWND (размер окна)

│ ╱╱╱╱ ssthresh достигнут

│ ╱╱╱╱╱

│ ╱╱╱╱╱

│ ╱╱╱╱╱

│ ╱╱╱╱╱

│ ╱╱╱╱╱

└──────────────────────────────────────時間

1 2 4 8 16 32 64 128 256

Медленный старт (экспонентный рост):

CWND = 1, 2, 4, 8, 16, 32, ...

Медленный старт с порогом (ssthresh)

text

CWND = 1 MSS

ssthresh = 65535 байт

Когда CWND < ssthresh → Медленный старт (экспоненциальный рост)

Когда CWND = ssthresh → Переход

Когда CWND > ssthresh → Congestion Avoidance (линейный рост)

Пример процесса:

text

Инициал: CWND = 1, ssthresh = 32

RTT 1: Отправить 1, получить ACK

CWND = 2 (< 32, продолжить Slow Start)

RTT 2: Отправить 2, получить 2 ACK

CWND = 4 (< 32, продолжить)

RTT 3: Отправить 4, получить 4 ACK

CWND = 8 (< 32, продолжить)

RTT 4: Отправить 8, получить 8 ACK

CWND = 16 (< 32, продолжить)

RTT 5: Отправить 16, получить 16 ACK

CWND = 32 (= ssthresh, переход!)

RTT 6: Отправить 32, получить 32 ACK

CWND = 33 (> ssthresh, Congestion Avoidance)

RTT 7: Отправить 33, получить 33 ACK

CWND = 34 (линейный рост в Congestion Avoidance)

...

Три состояния tcp управления потоком

1. Медленный старт (Slow Start)

text

Условие: CWND ≤ ssthresh

Рост: CWND += 1 MSS за каждый полученный ACK

Скорость роста: Экспоненциальная (удвоение каждый RTT)

Цель: Быстро найти приблизительную полосу пропускания

2. Предотвращение перегрузки (Congestion Avoidance)

text

Условие: CWND > ssthresh

Рост: CWND += (1 MSS / CWND) за каждый полученный ACK

(или CWND += 1 MSS за каждый RTT в целом)

Скорость роста: Линейная

Цель: Аккуратно увеличивать пока не будет потери

3. Быстрое восстановление (Fast Recovery)

text

Событие: 3 duplicate ACKs

Действие:

1. ssthresh = CWND / 2

2. CWND = ssthresh + 3

3. Для каждого последующего duplicate ACK: CWND += 1 MSS

4. Когда получен ACK на переотправленный пакет: CWND = ssthresh

Цель: Продолжить отправку, но осторожнее

Практический пример: полный цикл tcp

text

Сценарий: Отправка 100 МБ файла через Интернет

Этап 1: Установление соединения (3-way handshake)

TCP устанавливает соединение

CWND = 1 MSS (1460 байт)

ssthresh = 65535

Этап 2: Медленный старт (начальная передача)

Отправить 1 пакет, получить ACK → CWND = 2

Отправить 2 пакета, получить 2 ACK → CWND = 4

Отправить 4 пакета, получить 4 ACK → CWND = 8

...

После ~10 RTT: CWND = 1024 пакета (1.5 МБ)

Этап 3: Congestion Avoidance (нормальная передача)

Медленный линейный рост

CWND растёт на 1 пакет в RTT

Передача идёт в пиковом режиме

Этап 4: Обнаружение потери (3 duplicate ACKs)

Пакет потерян

Отправитель получает 3 одинаковых ACK

ssthresh = CWND / 2 (уменьшение)

CWND = ssthresh + 3

Этап 5: Быстрое восстановление

Переотправка потерянного пакета

CWND медленно растёт

После подтверждения: CWND = ssthresh

Этап 6: Продолжение Congestion Avoidance

Передача продолжается

CWND снова растёт

Этап 7: Завершение

Все данные отправлены

Корректное завершение соединения (FIN)

Почему такая сложность?

Без этих механизмов:

  • TCP бы перегружал сеть → потери → таймауты → еще хуже

  • Интернет был бы значительно медленнее

С этими механизмами:

  • TCP учится приспосабливаться к каждому соединению

  • Автоматическое снижение при проблемах

  • Справедливое распределение пропускной способности между пользователями

  • Результат: Интернет работает относительно стабильно несмотря на миллиарды соединений!

Это равновесие между агрессивностью (быстрая передача) и осторожностью (не перегружать) делает TCP таким мощным и универсальным протоколом.

Соседние файлы в предмете Открытые информационные системы и сети