Самый низкий размер окна приема TCP - PullRequest
0 голосов
/ 22 марта 2019

Какой минимальный размер окна приема TCP может быть объявлен ядром Linux в стеке TCP / IP и как я могу настроить его, чтобы он объявлял такое? Моя цель - добиться низкой задержки и снизить пропускную способность?

1 Ответ

1 голос
/ 22 марта 2019

Прямо сейчас мое тестовое клиентское приложение читает примерно 128 байтов каждую секунду из буфера, и стек TCP ждет, пока не освободится свободное место в байтах SO_RCVBUF / 2, прежде чем уведомлять сервер о новом размере окна. Я хотел бы, чтобы мой клиент объявил размер окна меньше, чем SO_RCVBUF / 2, если это возможно.

Я не думаю, что изменение размера окна приема повлияет на задержку.

Однако, поскольку ваши сообщения маленькие (128 байт), вы можете отключить алгоритм Nagle в отправителе , который заставляет отправителя ждать при отправке полезной нагрузки TCP меньше, чем MSS:

Приложения, которые ожидают откликов в режиме реального времени и низкой задержки, могут плохо реагировать с алгоритмом Nagle. Приложения, такие как сетевые многопользовательские видеоигры или движение мыши в операционной системе с дистанционным управлением, ожидают, что действия отправляются немедленно, а алгоритм намеренно задерживает передачу, увеличивая эффективность использования полосы пропускания за счет задержки. По этой причине в приложениях с чувствительной ко времени передачей с низкой пропускной способностью обычно используется TCP_NODELAY для обхода задержки Нейгла.

На приемнике вы можете отключить TCP с задержкой подтверждений :

Дополнительное время ожидания, введенное задержанным ACK, может привести к дополнительным задержкам при взаимодействии с определенными приложениями и конфигурациями. Если алгоритм Nagle используется отправляющей стороной, отправитель отправит данные в очередь до получения ACK. Если отправитель не отправляет достаточно данных, чтобы заполнить максимальный размер сегмента (например, если он выполняет две небольшие записи, за которыми следует блокирующее чтение), тогда передача будет приостановлена ​​до тайм-аута задержки ACK. Linux 2.4.4+ поддерживает опцию сокета TCP_QUICKACK, которая отключает задержку ACK.

C ++ код:

void disableTcpNagle(int sock) {
    int value = 1;
    if(::setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &value, sizeof value)) 
        throw std::system_error(errno, std::system_category(), "setsockopt(TCP_NODELAY)");
}

void enableTcpQuickAck(int sock) {
    int value = 1;
    if(::setsockopt(sock, IPPROTO_TCP, TCP_QUICKACK, &value, sizeof value)) 
        throw std::system_error(errno, std::system_category(), "setsockopt(TCP_QUICKACK)");
}
...