Я новичок в UDP и Java UDP API, и я знаю, что пакеты могут быть повреждены, разбиты на IP или неправильно каким-либо другим способом. Конечно, если такой пакет будет расколот, контрольная сумма в заголовке UDP будет неправильной.
При чтении UDP-пакета в Java, например DatagramSocket.receive(DatagramPacket)
, гарантировано ли, что содержимое принятого пакета является правильным (что означает, что вычисленная контрольная сумма является правильной)? Или Java также передаст поврежденные UDP-пакеты в приложение?
Короткий ответ:
Да, если не указано иное.
Длительный ответ:
Пакеты Udp включают в себя CHECKSUM, который используется вашей ОС, - это проверка пакетов для вас. Когда пакет с неправильной контрольной суммой получен, отбрасывается стеком ОС (до достижения уровня приложения).
Я никогда не пробовал, но в Ubuntu можно отключить контрольную сумму с помощью
ethtool --offload eth0 rx off
Из IETF RFC 5405 раздел 3.4 я цитирую:
[...] разработчикам приложений СЛЕДУЕТ проводить дополнительные проверки, где важна целостность данных [...]
Теперь, насколько важна целостность данных для вашего приложения и как вы цените "СЛЕДУЕТ" заглавными буквами, это зависит от вас.
Другими словами:
Следовательно, при реализации на сетевом уровне целостность принятых данных пакетов UDP остается неясной на прикладном уровне.