2010-04-11 141 views
6

我正在写一个UDP服务器,这是我的第一个;我只做了一点TCP通信。而且我很难搞清楚如何区分哪个用户是哪个用户,因为UDP只处理数据包而不处理连接,因此我无法确切知道我与谁进行通信。如何区分同一个IP地址上的两个不同的UDP客户端?

这是我目前的服务器循环的伪代码:

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 
} 

在设计这个,我牢记以下几点:

  • 多个用户可以在同一个IP地址存在,因路由器的存在,因此用户必须有一个单独的识别密钥。
  • 数据包可能被欺骗,因此应该根据其原始IP地址检查密钥,并在其他IP尝试使用该密钥时忽略该密钥。
  • 客户端的出站端口可能在数据包之间发生更改。

第三个假设是否正确,或者我可以简单地假设一个用户=一个IP +端口组合?这是通常完成的,还是应该继续创建一个像我目前正在做的特殊键?

我并不完全清楚TCP协商连接的方式,所以如果您认为我应该将其建模为TCP,那么请将我链接到一个很好的教程或关于TCP的SYN/SYNACK/ACK混乱的内容。

另请注意,如果IP发送0,并且该IP已具有挂起的密钥,我确实有重新发送密钥的规定;我省略了它以保持简单的代码片段。我知道UDP不能保证到达,我打算以后也为主分组处理代码增加可靠性。

回答

6

UDP包头有一个源端口,通常用作回复端口。如果不使用,它应该为零,然后由高级协议来确定如何协调请求 - 响应活动与多个客户端。

2

您的问题仅仅是您在使用UDP时需要注意的iceburg WRT洗衣清单的一部分。您应该期望NAT路由器无法提供您设计的任何有意义的UDP协议转发。因为路由器了解TCP状态机并存储每个会话的连接状态,所以它们知道如何转发它,因此TCP工作正常。他们将有不知道您的自定义UDP协议如何工作。 NAT设备包括用于众所周知的UDP应用的特定协议处理程序。

如果发件人绑定到源端口和/或接口,发件人源端口保持不变直到解除绑定。

使用UDP,您可以将两个对等端绑定到(dst)传入消息或(src)传出消息的已知源端口。对于客户端/服务器应用程序,您通常希望客户端绑定到动态源端口,以便多个客户端可以共存于单个客户端系统上。然后,服务器可以使用通过src端口提供的动态源端口响应客户端请求,该请求用作响应中的目标端口。使用已知端口的对等方允许您在NAT设备中配置UDP转发。

前客户与服务器/服务器的已知端口3000

客户端绑定到一个随机端口(1234),但知道服务器3000端口监听。 客户端(SRC 1234) - >服务器(DST 3000) 服务器(DST 1234) - >客户端(SRC 3000) ...

如果计算机具有多个接口,你应该预料到要么需要明确绑定听众或发送者指定到特定的IP地址,或者能够处理来自对等方的请求和响应,所述请求和响应基于计算机路由表的突发事件从随机IP接收和接收。如果您选择将请求绑定到特定的接口,那么如果来自多宿主系统的消息需要通过不同的本地接口进行传递,则需要了解路由表。例如,如果你将UDP套接字绑定到127.0.0.1,你显然不能用它发送到任何Internet可路由的IP地址。

就协议设计而言,它通常用于在UDP有效载荷中构造会话ID和序列字段,以便对等方可以跟踪会话和单个交换。

为了成功设计一个强大的UDP协议,您需要了解一些碎片,NAT共存,安全和拥塞问题。除非绝对必要,否则我会反对。

2
* The outbound port on the client side might change among packets. 

那是第三个假设是正确的

若客户持续使用相同的出站插槽。发送第一个数据报将导致一个本地绑定,因此从此以后,套接字将位于一个固定的本地端口上。

+0

这是典型的UDP协议的工作原理。预计单个客户端将在单个“事务”或“会话”期间继续使用相同的端口。 – caf 2010-04-11 11:08:34

+0

准确地说,我的观点。 – EJP 2010-04-29 01:05:59

相关问题