Ответ
Размер окна TCP (TCP Window Size) — это ключевой параметр механизма управления потоком данных (flow control
), который определяет, какой объем данных (в байтах) отправитель может передать, не дожидаясь подтверждения (ACK) от получателя.
Этот механизм называется «скользящее окно» (Sliding Window).
Как это работает:
- Получатель сообщает отправителю о размере своего свободного буфера в поле
Window Size
TCP-заголовка. - Отправитель может посылать данные, пока их суммарный объем не превысит заявленный размер окна.
- По мере того как получатель обрабатывает данные из своего буфера, он отправляет подтверждения (ACK), в которых указывает новый, увеличившийся размер окна.
- Окно как бы «скользит» вперед, позволяя отправлять новые порции данных.
Основная цель — предотвратить переполнение буфера получателя и, как следствие, потерю пакетов. Это обеспечивает надежную и эффективную передачу данных, адаптируясь к скорости работы получателя.
Ключевые аспекты:
- Динамичность: Размер окна постоянно меняется в зависимости от загруженности получателя.
- Нулевое окно (Zero Window): Если получатель сообщает окно размером 0, отправитель приостанавливает передачу данных до получения нового, ненулевого значения.
- Масштабирование окна (Window Scaling, RFC 7323): Опция, позволяющая использовать окна размером более 64 КБ, что критично для высокоскоростных сетей.
Пример в Go:
Хотя в большинстве случаев ОС и рантайм Go управляют размером буферов автоматически и эффективно, можно задать их вручную для специфических задач.
// Пример установки размера буферов для TCP-соединения
conn, _ := net.Dial("tcp", "example.com:80")
tcpConn, ok := conn.(*net.TCPConn)
if !ok {
// Обработка ошибки
return
}
// Установка размера буфера чтения (влияет на анонсируемое окно)
tcpConn.SetReadBuffer(16384) // 16 KB
// Установка размера буфера записи
tcpConn.SetWriteBuffer(16384) // 16 KB