Здравствуйте, 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 на первый пакет.