Networking 客户机-服务器体系结构

Networking 客户机-服务器体系结构,networking,udp,client-server,nat-traversal,Networking,Udp,Client Server,Nat Traversal,我在为我的应用程序的服务器-客户机方面选择什么技术而挣扎 定义设计 Windows,C#on.NET2 在许多机器上都有.NET2服务。我称之为客户 机器可以在NAT后面的不同网络中(或不连接到Internet) 服务器服务是公共的 要求 根据需要与客户沟通 客户端必须侦听传入的连接 服务器可以在线,也可以不在线 无法进行端口转发 我有什么选择去做那样的事情? 现在我在看UDP打孔技术。UDP打孔技术设置和我的设置之间的区别在于,我没有在NAT和中介服务器后面有两个客户机,而是只在NAT

我在为我的应用程序的服务器-客户机方面选择什么技术而挣扎

定义设计
  • Windows,C#on.NET2
  • 在许多机器上都有.NET2服务。我称之为客户
  • 机器可以在NAT后面的不同网络中(或不连接到Internet)
  • 服务器服务是公共的
要求
  • 根据需要与客户沟通
  • 客户端必须侦听传入的连接
  • 服务器可以在线,也可以不在线
  • 无法进行端口转发
我有什么选择去做那样的事情? 现在我在看UDP打孔技术。UDP打孔技术设置和我的设置之间的区别在于,我没有在NAT和中介服务器后面有两个客户机,而是只在NAT后面有一个必须与服务器通信的客户机。这一定很容易,但我很难理解和实施。 我使用这种NAT遍历的方法是正确的,或者其他一些方法更容易实现

我考虑的其他方法:

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

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

最重要的是,如果UDP打孔技术是这个场景的正确方法,请提供一些将在NAT后面的服务上运行的UDPServer的代码想法

谢谢。

打孔和p2p 你可能对一个新的工作感兴趣。如果您希望客户端(两者可能都在防火墙后面)在没有中继服务器的情况下直接通信,则需要打孔。这是多少对等2(p2p)通信工作

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

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

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


您的服务器应该正在侦听一个特定的端口(您做出这个决定),当它从客户端接收到一个数据包时,数据包的源地址将是某个NAT'ed地址。换句话说,源地址将是您的客户机背后的任何防火墙的公共IP。如果NAT更改了客户端数据包的源端口,服务器会将此NAT端口视为源端口。其实这并不重要,因为当服务器发回响应数据包时,客户端机器上的NAT将转换目标端口(它在内部存储转换),并将数据包正确地发送回正确的专用主机(客户端)。

您能否更具体地说明第一个要求。。。“按需与客户端通信。”客户端是否需要相互通信(对等),或者是客户端和服务器之间的唯一通信?如果客户端不需要直接通信(不是p2p),那么这就不是nat穿越问题。只要服务器是公共的,客户端可以访问公共互联网,那么通信就“有效”。感谢您提供的所有有趣的信息。“按需与客户端通信。”“意思是:我不希望客户机和服务器之间一直存在连接。就在我需要的时候。随需应变。因此,我需要通信的服务器部分(UDPServer或TCPServer等)位于NAT后面的客户机上。我真正的服务器将充当一个客户机,在服务器联机且我需要连接时,尝试连接到通信服务器(即在NAT后面的客户机上侦听)。