Я думаю, вопрос о том, как сделать UDP надежным, может быть неправильным. UDP ненадежен более или менее по определению - ipso facto. Вы не добьетесь успеха, делая реализацию протокола на стороне ОС более «надежной».
Очень многие приложения, использующие UDP, используют его, потому что им нужна природа с малыми издержками и низкой задержкой гораздо больше, чем точная надежность TCP. Но почти все эти приложения все еще нуждаются в некотором механизме для проверки сквозного приема определенных типов сообщений и, возможно, даже повторной сборки и / или первоначального рукопожатия. Подумайте о SIP в VoIP телефонии, например; Латентное трехстороннее рукопожатие TCP и очень постепенный контроль перегрузки не совсем приемлемы для приличного времени установления вызова или QoS, но определенно необходим некоторый способ подтверждения сообщений (для этого и нужны предварительные ответы, в терминологии SIP). Или различные протоколы, используемые в онлайн-играх - одна и та же основная идея.
Весьма вероятно, что реальное намерение назначения - даже если оно не указано четко - не столько в том, чтобы сделать UDP надежным, сколько в создании простой программы, в которой использует UDP и имеет некоторый примитивный уровень абстракции надежности в своей собственной схеме связи, как бы инкапсулированный в UDP.