Информация об изменениях

Сообщение Re: Socket.Send слипаются? от 17.08.2023 20:07

Изменено 09.05.2024 18:46 CRT

Re: Socket.Send слипаются?
Здравствуйте, 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 на первый пакет.
Re: Socket.Send слипаются?
Здравствуйте, 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 на первый пакет.