[Решено] TCP_NODELAY = 1, но 200ms delay
От: TailWind  
Дата: 13.09.25 15:03
Оценка:
Решение: удалить DrWeb

Послылаю подряд два пакета по 16 байт
Получаю задержку в отправке 200мс

Посылаю один пакет 16. Отправляется сразу. Без задержки

От размера пакета не зависит. Два пакета по 512 так же тормозят

Но если послать перед ними или после них 2048 отправляется без задержки

Пробовал вставлять между пакетами Sleep(100), Sleep(50) — не помогает

Как он определяет что пакеты посланны один за другим?
Ведь если посылаю один пакет он отправляется тут же

Nagle выключен. То есть setsockopt TCP_NODELAY = 1

Проверял на разных компьютерах. На каких-то проблема есть. На каких то нет. Не зависит от версии винды.
Антивирус выключал

Что делать? Помогите!
Отредактировано 15.09.2025 10:00 TailWind . Предыдущая версия . Еще …
Отредактировано 15.09.2025 10:00 TailWind . Предыдущая версия .
Re: TCP_NODELAY = 1, но 200ms delay
От: Pzz Россия https://github.com/alexpevzner
Дата: 13.09.25 15:18
Оценка:
Здравствуйте, TailWind, Вы писали:

TW>Как он определяет что пакеты посланны один за другим?


Первый пакет уходит сразу. Второй и последующие ждут, пока или не наберётся полный сегмент или не будут подтверждены все ранее отправленные данные или пройдёт 200 ms, whatever is first.

TW>Nagle выключен. То есть setsockopt TCP_NODELAY = 1


Что-то слабо верится. С выйключенным Наглом должно уходить сразу.

Какая ОСь? Венда галимая?
Re[2]: TCP_NODELAY = 1, но 200ms delay
От: TailWind  
Дата: 13.09.25 15:37
Оценка:
Pzz>Что-то слабо верится. С выйключенным Наглом должно уходить сразу.

Проверил через getsockopt — включен

Pzz>Какая ОСь? Венда галимая?


1 машина Win7 — 0 ms delay
1 машина win10 — 0 ms delay
4 машины Win10 — 200ms delay

Один и тот же exe
Re[3]: TCP_NODELAY = 1, но 200ms delay
От: Pzz Россия https://github.com/alexpevzner
Дата: 13.09.25 16:43
Оценка:
Здравствуйте, TailWind, Вы писали:

TW>1 машина Win7 — 0 ms delay

TW>1 машина win10 — 0 ms delay
TW>4 машины Win10 — 200ms delay

TW>Один и тот же exe


Странно.

А у тебя это точно задержки на одной стороне, а не round-trip?
Re[2]: TCP_NODELAY = 1, но 200ms delay
От: TailWind  
Дата: 13.09.25 16:45
Оценка:
TW>>Nagle выключен. То есть setsockopt TCP_NODELAY = 1
Pzz>Что-то слабо верится. С выйключенным Наглом должно уходить сразу.

Закоментировал setsockopt TCP_NODELAY = 1
На тех машинах где было 0 ms стало 200 ms
Re: TCP_NODELAY = 1, но 200ms delay
От: kov_serg Россия  
Дата: 13.09.25 16:47
Оценка:
Здравствуйте, TailWind, Вы писали:

TW>Что делать?

Используйте UDP
Re[3]: TCP_NODELAY = 1, но 200ms delay
От: Pzz Россия https://github.com/alexpevzner
Дата: 13.09.25 16:49
Оценка:
Здравствуйте, TailWind, Вы писали:

TW>>>Nagle выключен. То есть setsockopt TCP_NODELAY = 1

Pzz>>Что-то слабо верится. С выйключенным Наглом должно уходить сразу.

TW>Закоментировал setsockopt TCP_NODELAY = 1

TW>На тех машинах где было 0 ms стало 200 ms

А на тех, где было 200 мс, ничего не изменилось?
Re[4]: TCP_NODELAY = 1, но 200ms delay
От: TailWind  
Дата: 13.09.25 16:53
Оценка:
Pzz>А у тебя это точно задержки на одной стороне, а не round-trip?

Точно
Компы в соседнем офисе по кабелю. Реальный Ping 0 ms должен быть

// Master

repeat(20)
{
  Win32_Timer  Timer;
  //
  UCHAR a[0x10000];
  //
  Socket.Write(a, 1);
  //
  Socket.Read (a, 16);
  Socket.Read (a, 16);
  //
  Timer.Report(Log);
}

// Slave

repeat(20)
{
  Win32_Timer  Timer;
  //
  UCHAR a[0x10000];
  //
  Socket.Read (a, 1);
  //
  Socket.Write(a, 16);
  Socket.Write(a, 16);
  //
  Timer.Report(Log);
}
Re[4]: TCP_NODELAY = 1, но 200ms delay
От: TailWind  
Дата: 13.09.25 16:56
Оценка:
TW>>Закоментировал setsockopt TCP_NODELAY = 1
TW>>На тех машинах где было 0 ms стало 200 ms

Pzz>А на тех, где было 200 мс, ничего не изменилось?


Так же и осталось 200 мс
Re[3]: TCP_NODELAY = 1, но 200ms delay
От: TailWind  
Дата: 13.09.25 17:50
Оценка:
TW>1 машина Win7 — 0 ms delay
TW>1 машина win10 — 0 ms delay
TW>4 машины Win10 — 200ms delay

Ещё один Win10 комп — 0 ms

Так что не версия Windows
Отредактировано 13.09.2025 17:51 TailWind . Предыдущая версия .
Re[5]: TCP_NODELAY = 1, но 200ms delay
От: Pzz Россия https://github.com/alexpevzner
Дата: 13.09.25 18:06
Оценка:
Здравствуйте, TailWind, Вы писали:

Pzz>>А на тех, где было 200 мс, ничего не изменилось?


TW>Так же и осталось 200 мс


Вот пишут, например, такие ужасы:

https://github.com/redis/hiredis/issues/785

Дескать, TCP_NODELAY на некоторых экземплярах венды не очень-то работает с неблокирующимися сокетами, и _sleep(0) помогает.
Re[6]: TCP_NODELAY = 1, но 200ms delay
От: TailWind  
Дата: 13.09.25 19:59
Оценка:
Pzz>Дескать, TCP_NODELAY на некоторых экземплярах венды не очень-то работает с неблокирующимися сокетами, и _sleep(0) помогает.

У меня в блокирующем режиме

На всякий случай попробовал добавить Sleep(500) до и перед setsockopt
Не помогло

Что-то уже начинаю думать о Man in Middle, у которого Naggle не выключен
Типа антивируса
Отредактировано 13.09.2025 20:00 TailWind . Предыдущая версия .
Re[2]: TCP_NODELAY = 1, но 200ms delay
От: TailWind  
Дата: 13.09.25 20:31
Оценка:
TW>>Что делать?
_>Используйте UDP

Я обломаюсь TCP стэк реализовывать сам
Потом не понятно как отвечать клиенту который за NAT

Проще уж 2048 байт добавлять к каждому пакету
Он тогда их отправляет сразу

Даже если:
2048
16
16
32
Сразу уходят
Re[7]: TCP_NODELAY = 1, но 200ms delay
От: Pzz Россия https://github.com/alexpevzner
Дата: 13.09.25 21:12
Оценка:
Здравствуйте, TailWind, Вы писали:

Pzz>>Дескать, TCP_NODELAY на некоторых экземплярах венды не очень-то работает с неблокирующимися сокетами, и _sleep(0) помогает.


TW>У меня в блокирующем режиме


Вообще, странно это очень. Я никогда не испытывал сложностей в венде с TCP_NODELAY и никогда не слышал о проблемах с этим. Что-то тут не так...

TW>Что-то уже начинаю думать о Man in Middle, у которого Naggle не выключен

TW>Типа антивируса

Вот так они и выдают себя, эти неаккуратные мужики посерёдке
Re: TCP_NODELAY = 1, но 200ms delay
От: TailWind  
Дата: 14.09.25 09:36
Оценка:
Новые вводные

Проблемы только у исходящего подключения
У сокета который делает Connect

У сокета который делает Accept всё нормально

Проверил на двух компах в локальной сети

Там Dr.Web стоит. Думаю что это он.
Мы отключали там все опции, включая родительский контроль
Не помогает. Боюсь он до конца не отключается

Однажды у меня уже была с ним подобная история

Попросил сделать комп на котором стоит чистый Windows. Ждём
Re[3]: TCP_NODELAY = 1, но 200ms delay
От: kov_serg Россия  
Дата: 14.09.25 10:14
Оценка: 1 (1)
Здравствуйте, TailWind, Вы писали:

TW>Я обломаюсь TCP стэк реализовывать сам

TW>Потом не понятно как отвечать клиенту который за NAT
https://librats.com/ ?

TW>Проще уж 2048 байт добавлять к каждому пакету

TW>Он тогда их отправляет сразу

TW>Даже если:

TW>2048
TW>16
TW>16
TW>32
TW>Сразу уходят
Костыли они такие. Никто не гарантирует что в винде еще что-нибудь ещё фатально обновят. И не понадобится новая подпорка.
Просто детектируйте что есть проблемы и сообщайте клиенту, что его ось устарела и пусть обновляет или ставит linux.

ps: а вы смотрели wireshark-ом что там происходит в сети?
и советы от m$ https://learn.microsoft.com/en-us/troubleshoot/windows-server/networking/tcpip-performance-known-issues
Отредактировано 14.09.2025 10:17 kov_serg . Предыдущая версия .
Re: TCP_NODELAY = 1, но 200ms delay
От: TailWind  
Дата: 15.09.25 09:58
Оценка: 15 (3) +1
Удалили DrWeb всё стало нормально

Причём просто выключение в нём всех опций не помогает. Только полное удаление
Re: [Решено] TCP_NODELAY = 1, но 200ms delay
От: Mr.Delphist  
Дата: 27.09.25 21:35
Оценка:
Здравствуйте, TailWind, Вы писали:

TW>Решение: удалить DrWeb


Если опустить шаманство: какая задача решается? Возможно, принцесса в другом замке, и дракона можно не убивать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.