Настройка сокетов для использования небольших пакетов в Java - PullRequest
1 голос
/ 16 марта 2009

Я обрабатываю критичные ко времени сообщения, которые направляются мне через очень медленное сетевое соединение. Я подключаюсь к исходному серверу (который я не могу контролировать) с помощью сокета Java TCP / IP. Данные имеют разную длину, но обычно составляют около 5000 байт, и в результате они разбиваются на несколько пакетов размером примерно 1400 байт.

Есть ли в моем клиентском коде Java какой-либо способ, которым я могу контролировать размер пакетов, которые используются для отправки мне данных? Я хотел бы поэкспериментировать с явным использованием пакетов меньшего размера, например 500-байтовых пакетов, что уменьшило бы время, необходимое для получения первого байта сообщения, за счет (возможной) стоимости увеличения заголовка.

Ответы [ 4 ]

2 голосов
/ 16 марта 2009

Я не думаю, что вы можете контролировать это с клиента, если вы не можете контролировать или изменить свой сервер. Я подозреваю, что сервер упаковывает данные в 1500-байтовый кадр Ethernet (подробности см. здесь ) и пытается оптимизировать доставку данных вам.

Эти 1500 байтов называются MTU . Вы могли бы возможно поиграть с этим на уровне ОС, но я подозреваю, что это принесет вам только горе.

1 голос
/ 16 марта 2009

Один способ, который мы нашли, чтобы решить задержку при начальном чтении, это установить флаги PUSH или URG в заголовке TCP / IP в клиентском запросе. Насколько мне известно, стандартная библиотека сокетов Java не позволяет вам делать это, но есть библиотека по адресу:

http://www.savarese.org/software/vserv-tcpip/

что, видимо, делает.

Отказ от ответственности: это было способом назад, когда (Java 1.1.8, я думаю), мы когда-либо использовали его только в Windows, и я подозреваю, что это тоже было чем-то вроде взлома, поэтому он может больше не работать. И я также не использовал библиотеку Savarese, поэтому не могу ручаться за это.

1 голос
/ 16 марта 2009

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

0 голосов
/ 17 марта 2009

Если вы хотите сократить время получения первого фрагмента данных, попробуйте установить Socket.setTcpNoDelay (true); setTcpNoDelay

...