客户服务器架构

时间:2012-07-26 11:50:34

标签: networking udp client-server nat-traversal

我很难为我的应用程序的服务器客户端方面选择什么技术。

定义设计

  • Windows,C#on .net 2
  • 在许多机器上都有.net 2服务。我称之为客户。
  • 机器可以位于连接到Internet的NAT(或非连接)后面的不同网络中。
  • 服务器服务是公开的。

要求

  • 根据需要与客户沟通。
  • 客户端必须侦听传入的连接。
  • 服务器可以在线也可以不在线。
  • 无法进行端口转发。

我有什么选择做那样的事情? 现在我正在研究UDP Hole打孔技术。 UDP打孔技术设置和我的设置之间的区别在于,不是在NAT和中介服务器后面有2个客户端,我只得到NAT后面必须与服务器通信的客户端。这一定要容易,但我很难理解和实施。 我使用这种NAT遍历是正确的,也可能是其他一些方法更容易实现?

我考虑过的其他方法:

  • 当服务在线看到服务器时,使用TCP创建与服务器的连接。问题是我有大约200个客户,而且数量正在上升,我担心这是一个资源杀手。

  • 当服务在线查看服务器时,检查数据库表中的命令,然后再每隔30秒检查一次。这也是我服务器的资源杀手。

最重要的是,如果UDP Hole Punching技术是这种情况的正确方法,请为将在NAT后面的服务上运行的de UDPServer提供一些代码构思。

谢谢。

1 个答案:

答案 0 :(得分:2)

打孔和p2p

您可能对high level discussion of UDP hole punching感兴趣。如果您希望客户端(两者都可能位于防火墙后面)在没有中继服务器的情况下直接通信,则需要打孔。这是多少同伴2对等(p2p)通信工作。

对于p2p,通常NAT的客户端必须使用一些外部服务器来确定彼此的“服务器自反地址”。当NAT转换发生时,防火墙端口后面可以映射到公共的某个任意端口。客户端可以使用STUN server来确定其“服务器自反地址”。然后,客户端将通过中间服务器交换服务器自反地址并启动通信(通过打孔来启动会话)。

通常,NAT不会以允许如上所述的直接通信的方式运行。将数据包发送到不同的目标将导致NAT根据目标将端口映射到完全不同的值。在这种情况下,需要TURN server

链接

服务器 - 客户端通信

如果您的客户只需要与服务器通信,则不需要打孔。只要客户端可以与公共Internet通信,那么您可以使用任何C#套接字API(我不熟悉C#)来连接服务器的公共IP /端口组合。通常,进行套接字连接的客户端不指定源端口,并让底层套接字API做出决定,因为它确实无关紧要。

您的服务器应该侦听特定端口(您做出此决定),当它从客户端收到数据包时,数据包的源地址将是一些NAT地址。换句话说,源地址将是您的客户端所支持的任何防火墙的公共IP。如果NAT更改了客户端数据包的源端口,则服务器将此NAT端口视为源端口。这无关紧要,因为当服务器发回响应数据包时,客户端计算机上的NAT将转换目标端口(它在内部存储转换)并正确地将数据包发送回正确的私有主机(客户端)。

相关问题