У меня есть сетевое приложение, работающее на Windows Server 2008 R2, которое должно отправлять небольшие пакеты за очень короткий промежуток времени, каждая микросекунда имеет значение. Моя проблема в том, что Windows накапливает пакеты и отправляет их в большом пакете TCP, но я хочу, чтобы каждый пакет отправлялся отдельно.
Я отключил модерацию прерываний в ник. Я также установил размер MTU интерфейса на 63 (это наименьший размер, в который помещается мой пакет). Я проверяю трафик с помощью Microsoft Netmon, и в большинстве случаев этот параметр игнорируется, и Windows продолжает накапливать пакеты перед их отправкой. Что я делаю не так? Есть ли другой способ заставить окна отправлять небольшие пакеты, как только пакеты приходят на интерфейс? Насколько мне известно, Windows использует Nagle для объединения данных, но я не мог отключить его с помощью реестра. Я не могу поменять платформу.
Если у вас есть какой-либо контроль над самим приложением, установите параметр сокета TCP_NODELAY при создании сокета будет иметь тот эффект, который вы ищете. Это сообщает сокету, что нужно отключить Nagel для этого соединения. Это, наверное, самый надежный метод.
Похоже, вы уже открыли TcpAckFrequency
трюк с реестром; но если вы этого не сделали, это может принести некоторое облегчение, если вы не можете настроить код приложения. Для этого:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Interfaces
TcpAckFrequency
и установите его на 1.Раньше был ключ под названием TcpNoDelay
есть, но, похоже, он был удален для Win 2008.