Socket.Send слипаются?
От: TailWind  
Дата: 29.03.23 07:57
Оценка:
Отправляю сообщение по TCP:

(8 байт размер данных, данные)

На том конце делаю recv 8 байт
Потом recv размера данных

Так вот если send вызываю один раз (склеиваю сам два блока), то работает почти за ноль времени
Если сначала делаю send 8 байт, а потом ещё раз send для данных, почему-то отрабатывает за 400 мс

В чём прикол?

Какие-то флаги я не так выставил?
Re: Socket.Send слипаются?
От: fk0 Россия https://fk0.name
Дата: 29.03.23 09:06
Оценка: +4
Здравствуйте, TailWind, Вы писали:

TW>Отправляю сообщение по TCP:

TW>Так вот если send вызываю один раз (склеиваю сам два блока), то работает почти за ноль времени
TW>Если сначала делаю send 8 байт, а потом ещё раз send для данных, почему-то отрабатывает за 400 мс

TW>Какие-то флаги я не так выставил?


TCP_NODELAY, man setsockopt, google://Nagle algorithm.
Re[2]: Socket.Send слипаются?
От: TailWind  
Дата: 29.03.23 13:45
Оценка:
Огромное спасибо!
Re: Socket.Send слипаются?
От: CRT  
Дата: 17.08.23 20:07
Оценка: 4 (1)
Здравствуйте, TailWind, Вы писали:

TW>Так вот если send вызываю один раз (склеиваю сам два блока), то работает почти за ноль времени

TW>Если сначала делаю send 8 байт, а потом ещё раз send для данных, почему-то отрабатывает за 400 мс

TW>В чём прикол?


Это синергия (в отрицательном смысле) алгоритма Nagle на отправляющей стороне, и алгоритма ACK delay на принимающей.

Происходит следующее

На отправляющей стороне :
send(8 байт) — твои 8 байт тут же полетели по проводам.
send(остальное) — Согласно алгоритму Nagle система ждет ACK на твой первый восьмибайтовый пакет,
и только потом посылает данные. send() при этом сразу вернулась — данные просто буферизировались в системе.

На принимающей стороне :
recv() приняла 8 байт. Из-за алгоритма "ACK delay" cистема не отправляет ACK сразу — ждет что твоя программа (на принимающей стороне) отправит в ответ некие данные и тогда система отправит ACK вместе с ними. Не дождавшись этого, через x милисекунд система всё таки посылает голый ACK на первый пакет.
Отредактировано 09.05.2024 18:46 CRT . Предыдущая версия . Еще …
Отредактировано 17.08.2023 20:17 CRT . Предыдущая версия .
Отредактировано 17.08.2023 20:15 CRT . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.