我目前正在开发“基于节点”的系统,其中服务器将在专用网络上发送UDP广播(使用自定义协议),该广播将由支持指定协议的多个不同客户端接收。在请求之后,服务器将在一些客户端之间进行选择,以建立更稳定的TCP连接。
我对TCP和UDP都有很好的了解,但是我以前从未设计过这样的系统。您是否认为此系统是按正确的方式构建的,或者是否有更“标准”的方式来执行类似的操作?你有什么想法?
谢谢!
添加了程序图。
答案 0 :(得分:2)
有一个标准协议可以在网络上发布服务,您可能需要考虑:Simple Service Discovery Protocol,基于定期UDP多播:
简单服务发现协议(SSDP)是基于Internet协议套件的网络协议,用于广告和发现网络服务以及状态信息。它无需借助基于服务器的配置机制(例如动态主机配置协议(DHCP)或域名系统(DNS))并且无需对网络主机进行特殊的静态配置即可完成此任务。 SSDP是通用即插即用(UPnP)发现协议的基础,旨在用于住宅或小型办公室环境。
在此协议中,客户端可以加入该UDP多播组以发现本地网络服务,并根据需要启动与它们的连接。这几乎是该协议的预期用例,与您的用例有些不同。
IP / UDP多播的一个好处是,如果主机上没有进程加入该多播组,则可以将多播数据包丢弃到网络适配器中。另一个是IP / UDP多播可以跨网络路由。
在您发布的图中:
对于服务器来说,通过UDP多播自己通告是有意义的。
在线客户端将在启动或TCP连接断开时使用TCP连接到服务器。如果客户端由于某种原因终止而中断了TCP连接,并且服务器会立即意识到这一点,除非客户端关闭电源或OS崩溃。您可能希望启用频繁的TCP保持活动状态,以便服务器在没有数据从服务器传输到客户端的情况下尽快检测到死客户端。同样适用于客户端。
服务器与客户端之间的所有通信均通过TCP进行。否则,您将需要通过UDP实现可靠的消息传递或使用PGM,这可能需要很多工作。组播UDP仅应用于服务器发现,而不能用于需要可靠传递的双向通信。
主客户端还连接到服务器(可能在另一个端口上)以进行控制。主客户端可以发现所有可用的服务器(如果有多个),并允许用户选择要连接的服务器。