Estoy escribiendo un servidor UDP, que es el primero para mí; Solo he hecho un poco de comunicaciones TCP. Y estoy teniendo problemas para averiguar exactamente cómo distinguir qué usuario es el que, dado que UDP trata solo con paquetes en lugar de conexiones y, por lo tanto, no puedo decir exactamente con quién me estoy comunicando.¿Cómo se puede distinguir entre dos clientes UDP diferentes en la misma dirección IP?
Aquí es pseudocódigo de mi bucle de servidor actual:
DatagramPacket p;
socket.receive(p); // now p contains the user's IP and port, and the data
int key = getKey(p);
if(key == 0) { // connection request
key = makeKey(p);
clients.add(key, p.ip);
send(p.ip, p.port, key); // give the user his key
} else { // user has a key
// verify key belongs to that IP address
// lookup the user's session data based on the key
// react to the packet in the context of the session
}
En el diseño de este, me quedé en cuenta estos puntos: pueden existir
- varios usuarios en la misma dirección IP, debido a la presencia de enrutadores, por lo tanto, los usuarios deben tener una clave de identificación por separado.
- Los paquetes pueden ser falsificados, por lo que la clave debe verificarse con su dirección IP original e ignorarse si un IP diferente intenta usar la clave.
- El puerto de salida en el lado del cliente puede cambiar entre los paquetes.
¿Es correcta esta tercera suposición o simplemente puedo suponer que una combinación de usuario = un puerto IP +? ¿Se hace esto comúnmente, o debería continuar creando una clave especial como la que estoy haciendo actualmente?
No estoy del todo claro sobre cómo TCP negocia una conexión, así que si crees que debería modelarlo fuera del TCP, por favor, enlázame a un buen tutorial o algo sobre el desastre SYN/SYNACK/ACK de TCP.
También tenga en cuenta que tengo una disposición para volver a enviar una clave, si una IP envía un 0 y esa IP ya tiene una clave pendiente; Lo omití para mantener el fragmento simple. Entiendo que no se garantiza que llegue UDP, y planeo agregar confiabilidad al código de manejo del paquete principal más tarde también.
Así es como funcionan los protocolos UDP típicos. Se espera que un único cliente siga usando el mismo puerto durante una sola "transacción" o "sesión". – caf
Exactamente mi punto. – EJP