Конфигурация стека LWIP
Я использую стек LWIP для TCP/IP.
Мое приложение - это серверное приложение. Он непрерывно отправляет пакет клиенту. Клиент получает пакет без какой-либо задержки. Но он отправляет ACK через 200 мс.
Стек LWIP всегда ожидает пакет ACK, прежде чем отправит следующий пакет.
Есть ли какая-либо конфигурация, которая заставляет стек LWIP отправлять пакет без ожидания пакета ACK, пожалуйста, сообщите нам об этом.
Спасибо и всего наилучшего, Hemanth Kumar PG
2 ответа
Проверьте, какие значения вы настроили для настроек TCP стека. Значения по умолчанию находятся в include/lwip/opt.h
Вы должны настроить их со своими lwipopts.h
которые включаются в верхней части opt.h
и, таким образом, перезаписывает любые значения по умолчанию.
Следующие значения должны быть интересны для вас. У них очень консервативные настройки по умолчанию, чтобы LwIP работал на очень низких ресурсах:
/**
* TCP_MSS: TCP Maximum segment size. (default is 536, a conservative default,
* you might want to increase this.)
* For the receive side, this MSS is advertised to the remote side
* when opening a connection. For the transmit size, this MSS sets
* an upper limit on the MSS advertised by the remote host.
*/
#ifndef TCP_MSS
#define TCP_MSS 536
#endif
другие значения в основном рассчитываются из этого:
/**
* TCP_WND: The size of a TCP window. This must be at least
* (2 * TCP_MSS) for things to work well
*/
#ifndef TCP_WND
#define TCP_WND (4 * TCP_MSS)
#endif
/**
* TCP_SND_BUF: TCP sender buffer space (bytes).
* To achieve good performance, this should be at least 2 * TCP_MSS.
*/
#ifndef TCP_SND_BUF
#define TCP_SND_BUF (2 * TCP_MSS)
#endif
/**
* TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least
* as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work.
*/
#ifndef TCP_SND_QUEUELEN
#define TCP_SND_QUEUELEN ((4 * (TCP_SND_BUF) + (TCP_MSS - 1))/(TCP_MSS))
#endif
Что вы испытываете, так это то, что окно TCP слишком маленькое, и поэтому стек будет ожидать ACK, чтобы иметь возможность отправить следующий пакет (ы).
Более подробную информацию об этом можно найти в вики LWIP:
http://lwip.wikia.com/wiki/Lwipopts.h
домашняя страница проекта:
http://savannah.nongnu.org/projects/lwip/
или в списке рассылки:
https://lists.nongnu.org/mailman/listinfo/lwip-users
Это звучит так, что вы сталкиваетесь с классическим плохим взаимодействием между алгоритмом отложенного ACK и алгоритмом Нейгла, когда вы получаете временную блокировку продолжительности таймера отложенного ACK. Это не относится к LwIP, и приложения могут работать с традиционными стеками IP. Посмотрите ссылки ниже для получения дополнительной информации по этой проблеме:
- Задержка подтверждения TCP
- Проблемы производительности TCP, вызванные взаимодействием между алгоритмом Nagle и задержанным ACK
В зависимости от формата сообщения приложения, вы можете решить эту проблему, отключив алгоритм Nagle с помощью опции сокета TCP_NODELAY или изменив шаблон записи, чтобы не выполнять последующие небольшие записи меньше максимального размера сегмента