Установить ограничение размера пакета udp
У меня есть сервер CentOS с приложением JAVA, которое получает пакеты данных UDP, все работает нормально, пока размер пакета не превышает 584 байта, я кое-что прочитал и, похоже, являюсь ограничением протокола UDP.
Мой больший пакет имеет длину 631 байт (полезная нагрузка)
Я тестирую отправку 631 байта в той же сети с одной машины Windows на другую машину Windows, и, кажется, работает нормально, но если я отправлю ту же дату на сервер CentOS, сервер поймает только первые 584 байта.
Я снимаю с компьютера Windows с Microsoft Network Monitor 3.4, и пакеты не фрагментируются.
Должен ли я установить какой-либо системный параметр на сервере? Является ли предел машины JAVA?
Может ли кто-нибудь направить меня, пожалуйста? Я новичок в этом. Благодарю.
Я проверяю iptables и кажется пустым.
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
1 ответ
Я тестирую отправку 631 байта в той же сети с одной машины Windows на другую машину Windows, и, кажется, работает нормально, но если я отправлю ту же дату на сервер CentOS, сервер поймает только первые 584 байта.
Это не имеет особого смысла. С UDP вы получаете либо полный пакет, либо ничего, кроме случаев, когда приложение явно вызывает send с длиной, меньшей пакета, и задает также MSG_TRUNC
принять усечение пакета. Таким образом, любые ограничения здесь должны быть сделаны приложением. Сам пакет UDP может иметь размер до 64 КБ, и я уверен, что сама Java не меняет каждый приемный вызов приложения на использование только небольшой длины, в противном случае у многих других Java-приложений могут возникнуть проблемы.
Поэтому, пожалуйста, проверьте, как выполняется чтение внутри приложения. Я предполагаю, что это явный предел при чтении. Вы также можете запустить приложение с помощью strace и проверить, как приложение вызывает recv или recvmsg, там вы можете увидеть размер, который запрашивает приложение.
Конечно, также может случиться так, что приложение никогда не получит пакеты, потому что они фильтруются вне приложения. В этом случае вам следует проверить с помощью tcpdump / wireshark, поступают ли пакеты на машину вообще, например, проверять не на стороне отправителя, а на стороне получателя.