Ваши вопросы - это лишь верхушка списка вопросов, которые нужно знать при использовании UDP. Вы должны ожидать, что маршрутизаторы NAT не смогут обеспечить какую-либо значимую переадресацию протокола UDP, который вы разрабатываете. TCP работает, потому что маршрутизаторы понимают конечный автомат TCP и сохраняют состояние соединения каждого сеанса, чтобы знать, как его переслать. Они будут не знать , как работает ваш собственный протокол UDP. Устройства NAT включают специальные обработчики протоколов для хорошо известных приложений UDP.
Если отправитель связан с исходным портом и / или интерфейсом, исходные порты отправителя остаются неизменными до тех пор, пока они не будут связаны.
С помощью UDP вы можете привязать обоих пиров к известному исходному порту для (dst) входящих и (или src) исходящих сообщений. Для клиент-серверных приложений вы обычно хотите, чтобы клиент связывался с динамическим портом источника, чтобы несколько клиентов могли сосуществовать в одной клиентской системе. Затем сервер может ответить клиенту, используя динамический порт источника, предоставленный через порт src, из запроса, используемого в качестве порта назначения в ответе. Использование известного порта для одноранговых узлов позволяет настроить переадресацию UDP в устройствах NAT.
бывший клиент / сервер с сервером на известном порту 3000
клиент связывается со случайным портом (1234), но знает, что сервер прослушивает порт 3000.
клиент (src 1234) -> сервер (dst 3000)
сервер (dst 1234) -> клиент (src 3000)
...
Если компьютер имеет несколько интерфейсов, вам следует ожидать либо явного связывания слушателя или отправителя с конкретным IP-адресом, либо возможности обработки запросов и ответов от однорангового узла, отправляемого и получаемого с случайного IP на основе капризов таблицы маршрутизации компьютеров. Если вы решите связать запросы с конкретным интерфейсом, то вам необходимо знать таблицу маршрутизации, если сообщения от мультидоменной системы должны проходить через другой локальный интерфейс для доставки. Например, если вы привязали сокет UDP к 127.0.0.1, вы, очевидно, не сможете использовать его для отправки на любые маршрутизируемые IP-адреса в Интернете.
С точки зрения разработки протокола, обычно используется для кадрирования идентификатора сеанса и полей последовательности в полезной нагрузке UDP, чтобы одноранговые узлы могли отслеживать сеансы и отдельные обмены.
Существует целый ряд проблем фрагментации, сосуществования NAT, безопасности и перегрузки, о которых необходимо знать, чтобы успешно разработать надежный протокол UDP. Я советую против этого, если в этом нет крайней необходимости.