TCP_NODELAY - это опция для быстрой отправки TCP-пакетов независимо от их размера. Это очень полезная опция, когда вопросы скорости, однако, мне любопытно, что он будет делать с этим:Как TCP_NODELAY влияет на последовательные вызовы write()?
Socket socket = [some socket];
socket.setTcpNoDelay(true);
OutputStream out = socket.getOutputStream();
out.write(byteArray1);
out.write(byteArray2);
out.write(byteArray3);
out.flush();
Я пытался найти то, что на самом деле делает флеш на SocketOutputStream
, но, насколько я знаю сейчас, это ничего не делает. Я надеялся, что это скажет сокет «отправить все ваши буферизованные данные сейчас», но, к сожалению, нет, это не так.
Мой вопрос: являются ли эти 3 байтовых массива отправлены в одном пакете? Я знаю, что у вас нет большого контроля над тем, как TCP создает сетевой пакет, но есть ли способ сказать сокету (по крайней мере, попытаться) упаковать эти байтовые массивы, поэтому избежать сетевых издержек? Можно вручную упаковать байтовые массивы и отправить их одним звонком в write
help?
«TCP_NODELAY .. полезен, когда скорость имеет значение». * NO *. Это полезно, когда * отзывчивость * имеет значение (получение отправленного байта как можно скорее). TCP_NODELAY может * уменьшить * общую пропускную способность, посылая * совокупные данные * относительно * НЕВИДИМО *. Буферизация хорошая: когда это возможно. IMHO ... – paulsm4
ПРЕДЛОЖЕНИЕ: Получите копию [wireshark] (http://www.wireshark.org) и проследите пакеты, фактически отправленные для пары тестовых программ сокетов. – paulsm4
Да, это то, что я имел в виду. ;-) Я знаю, что это неэффективно, но в моем случае _responsiveness_ важнее ожидания достаточного количества данных. Однако для случая, о котором идет речь, я хочу его оптимизировать, потому что отправка одиночных байтовых массивов не имеет особого смысла, это важно для всех из них. – AyCe