Здесь недостаточно подробностей, чтобы сделать хорошо обоснованную критику.Если бы вы нанимали меня за советом, я бы хотел узнать больше о предложении, но, поскольку я делаю это бесплатно, я просто отвечу на вопрос в соответствии с заданным вопросом и постараюсь сделать его практичным, а не идеальным.
Я бы сказал, что UDP не подходит для ранней части вашего протокола.Вы не можете просто передать один пакет большому количеству хостов в Интернете (хотя вы можете сделать это в типичных локальных сетях).Полезная нагрузка 20 КБ - это не та вещь, которую вы обычно можете передавать в одной дейтаграмме в любом случае, и в тот момент, когда сообщения не помещаются в одну дейтаграмму, UDP теряет большую часть своей привлекательности, потому что вы начинаете заново изобретать TCP (плохо).
Вероятно, самое простое, что вы можете сделать, - это основать свою систему на HTTP и работать с реализациями, которые включают все различные ускорения, которые Google (в основном) внедряет в разработку HTTP.Это включает в себя TCP Fast Open и тому подобное.Инициируйте соединения с выбранными вами серверами;некоторые будут реагировать быстрее, чем другие: используйте это в своих интересах, выбирая самые быстрые.Кстати, не стоит недооценивать важность эффективной реализации по сравнению с теоретическим временем прохождения туда и обратно.
Для второго этапа продолжайте с HTTP, как и раньше.Для эффективности вы можете оставить все соединения открытыми в конце первой фазы, а затем закрыть все, кроме выбранного вами партнера второй фазы.Из вашего описания не ясно, что обмен на второй фазе подходит для модели HTTP, поэтому мне нужно немного помахать рукой.
Также возможно, что вы можете просто держать TCP-соединения открытыми для всехболее или менее постоянно доступны одноранговые узлы, что почти постоянно уклоняется от затрат на установление соединенияТысяча одновременных открытых соединений велика, но в большинстве случаев не возмутительна (хотя вам может потребоваться настроить параметры ОС, чтобы разрешить это).Если вы сделаете это, вы можете просто говорить по любому протоколу, который вам нравится, по TCP.Если это действительно одноранговый протокол, вам нужно только одно TCP-соединение на пару.Реализовать подобные вещи сложно, хотя, по моему опыту, обычный программист сделает это ужасно.