在我的点对点应用程序中,我应该使用多个端口吗?



我正在构建一个简单的点对点应用程序,其中大约8个参与者都相互连接(n*n)。我将使用UDP与可靠性和排序协议层在顶部。每个对等点每秒将广播几KB的数据。

我想到有两种方法可以配置每个对等端上的端口:

  1. 每个对等端使用一个端口,所有消息都通过该端口接收。
  2. 每个对等体为另一个对等体占用一个端口,并且只使用对应的端口与另一个对等体通信

每种方法的优缺点是什么?

只创建一个端口与每个对等体通信是最好的选择。您只需创建一个套接字,并使用一个端口与任意数量的对等端发送/接收数据。您可以通过查看每个数据包的源地址来区分接收到的数据。这样代码就不那么复杂,而且资源效率更高。

创建多个端口绝对没有优势。这会使您的代码复杂化,并且会使用更多的资源而没有任何好处。资源消耗将随着节点的增加而增加。

我从未使用过这种应用程序模型,以下是我的一些想法。

需要考虑的一件大事是对等点之间是否有防火墙。如果是这样,就需要为每个监听端口打一个孔。这可以做一次。路由器端口转发规则)或动态(UPnP等),但你可能无法指望自动全锥NAT为你做这件事。如果你希望在你的对等点之间有防火墙,我建议你使用一个端口,以便于你的编程,并严格通过它们的远程地址或其他协议内标识符来识别你的对等点。

为每个用户使用单个端口将使识别通信更简单,但如果您期望参与者数量增长n(n-1)/2。如果你从不期望超过一个小数目(例如:20), port per peer不需要太多的努力就可以很好地工作。

您(可能)的另一个选择可能是使用多播。如果所有的对等节点都在同一个广播域中,这将减少总线争用,并可能使您的编码更简洁。

希望这对你有帮助。如果这不是你想要的,我很抱歉。好运!

每个对等端使用一个端口,所有消息都通过该端口接收。

如果每个对等体都能获得传入数据报的源IP/源端口(我打赌它可以),这就足以区分对等体了。

每个对等体为对方取一个端口,只与对方通信使用其对应端口的对等体

见上文,最重要的是,这与你最初的广播基本想法相矛盾。它只是增加了一定程度的复杂性(并且可能不是很可扩展,即使现在你设想只有8个节点)。

在你的基本要求中,我想你可能会在以下两种情况中进退两难:

  • 向所有人广播所有内容,
  • 但是你仍然希望一个对等体能够"只与另一个对等体通信",这本质上是单播的。

这就产生了一些问题,正如你问这个问题时已经意识到的。

我看到另外两个问题:

  • 可扩展性方面,广播一切的方法,而你有时实际上需要单播会给网络带来一些无用的负载。
  • 广播方式决定了UDP,但你仍然想要可靠的数据传输,所以正如你所说的,你必须添加一个"可靠性和排序协议层"。如果我们可以使用TCP,就不需要这种(不那么容易的)工作了。

还有第三种方法:

  • 为每个对等体使用广播UDP在网络上宣布自己,以便其他对等体可以…
  • …发现并与该对等体建立单播TCP连接。没有更多的可靠性和订购问题+减少网络负载。

此方法用于SSDP(简单服务发现协议),它是UPnP的一部分。我确实不是建议你使用SSDP,它可能对你想做的事情来说是臃肿的,你说你想要一些简单的。

总而言之,您首先必须解决您的困境:决定并区分真正需要广播的数据与单播部分。YMMV . PS:与广播UDP也带来的问题,虽然OK在局域网,这将不会通过路由器,除非你使用多播路由。但那是另一个故事了

最新更新