UDP и рандомизация портов - PullRequest
0 голосов
/ 02 марта 2012

В настоящее время я программирую приложение UDP, которое позволяет клиентам входить в систему.После этого их конечная точка сохраняется в списке.

private void socket_Callback(IAsyncResult result_)
{
    EndPoint remote = new IPEndPoint(IPAddress.Any, 0);
    socket.EndReceiveFrom(result_, ref remote);

    if (!listOfEndPoints.Contains(remote))
    {
        // registration process

        // add it to list
        listOfEndPoints.Add(remote)
    }
    else
    {
        // process packet
    }
}

Однако иногда NAT клиента назначает каждому пакету свою внешнюю конечную точку.Если конечной точкой исходного пакета регистрации является 12.34.56.78:1000, эта конечная точка добавляется в список.Если тот же клиент затем отправит другой пакет, NAT назначит ему другой порт, поэтому его конечной точкой будет 12.34.56.78:1001.Это приводит к тому, что сервер предполагает, что клиент не зарегистрирован, и пытается обработать пакет как регистрационный.Излишне говорить, что это не сработает.

Способ исправить это - отправить клиенту идентификатор (который, однако, может быть легко подделан, если он не супершифрованный)Однако клиент должен будет добавить его к каждому пакету, который он отправляет на сервер.Так что было бы не очень эффективно делать это таким образом.

Есть ли другой способ сообщить, что пакет поступил от того же клиента, что и пакет регистрации?

1 Ответ

3 голосов
/ 02 марта 2012

Вы определенно должны не использовать IP-адрес источника и порт пакета UDP, чтобы связать его с логическим соединением. Вы должны включить идентификатор соединения в каждый пакет и обновить IP-адрес и порт, на который вы отвечаете, если вы получаете новый IP-адрес и порт для того же логического соединения. Если проблема с переадресацией соединения является проблемой, вам может потребоваться реализовать некоторую форму защиты, такую ​​как безопасная контрольная сумма в датаграмме.

TCP обрабатывает ассоциированные пакеты с соединениями для вас. С UDP вы должны связать датаграммы с логическими сеансами самостоятельно. Я не знаю, почему вы думаете, что «было бы не очень эффективно делать это так».

Одним из недостатков UDP является то, что если вам нужно что-то, что предоставляет TCP, вы должны кодировать его самостоятельно.

Кстати, я никогда не видел, чтобы порты менялись таким образом. Вы уверены, что клиентский код не поврежден, возможно, открывая новый сокет для каждой дейтаграммы, которую он отправляет.

...