Реализация протокола UDP в системах Linux немного отличается от описанной здесь. В таких системах асинхронные сообщения об ошибках всегда возвращаются независимо от того, подключен ли сокет. Кроме того, если сеть работает достаточно быстро, иногда можно также обнаружить и передать сообщения об ошибках доставки дейтаграмм с помощью функции send().
Утерянные пакеты и фрагментация
Наиболее распространенные ошибки UDP обнаружить не так легко. Как описано ранее, сообщения UDP могут теряться во время передачи или поступать в порядке, отличном от того, в каком они были отправлены. Протокол UDP не предусматривает управления потоком данных, а каждый хост имеет лишь ограниченное буферное пространство для приема дейтаграмм, поэтому при получении хостом большего объема дейтаграмм, чем может прочитать приложение, лишние дейтаграммы уничтожаются без дополнительных сообщений.
Теоретически дейтаграммы могут иметь длину до 65535 байт, но на практике значение ограничено максимальной единицей передачи данных (MTU — maximum transmission unit) в сети. Дейтаграмма, превышающая эти размеры, разбивается на несколько частей, а операционная система получателя пытается повторно ее собрать. Если одна из частей утеряна при передаче, то отбрасывается вся дейтаграмма.
В сетях Ethernet единица передачи данных MTU составляет 1500 байт. Однако в некоторых линиях связи, через которые может пройти дейтаграмма, путешествуя по Internet, величина MTU имеет размер всего 576 байт. По этой причине лучше с самого начала применять сообщение UDP, не превышающее этого предела.