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

时间:2015-09-05 00:08:29

标签: networking udp p2p ports multipeer-connectivity

我正在构建一个简单的对等应用程序,其中大约8个参与者彼此连接(n*n)。我将使用UDP,其中包含可靠性和订购协议。每个对等体每秒将广播几KB数据。

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

  1. 每个对等端占用一个端口,所有消息都通过
  2. 接收
  3. 每个对等体为每个其他对等体获取一个端口,并且仅使用其对应端口
  4. 与对等体通信

    每种方法有哪些优点和缺点?

3 个答案:

答案 0 :(得分:1)

我从未对这种应用模式做过任何事情,但这是我的一些想法。

需要考虑的一件大事是,对等体之间是否有防火墙。如果是这样,每个侦听端口都需要打孔。这可以完成一次(例如路由器端口转发规则)或动态(UPnP等),但您可能无法依靠自动全锥NAT为您执行此操作。如果您希望同伴之间有任何防火墙,我建议您使用单个端口以便于编程,并严格按照其远程地址或其他协议标识符识别您的对等端。

每个用户使用一个端口可以使识别通信变得更加简单,但是如果您希望参与者数量增加n(n-1)/ 2。如果你从不期望超过一个小数目(例如20),那么每个端口的端口将在没有太多努力的情况下运行良好。

您(可能)的另一个选择可能是使用多播。如果所有同伴都在同一个广播域上,这将减少总线争用,并可能使您的编码更加清晰。

希望这会有所帮助。如果这不是您正在寻找的,我道歉。祝你好运!

答案 1 :(得分:1)

只创建一个端口与每个对等端进行通信是最佳选择。您只创建一个套接字,并且只使用一个端口来发送/接收具有所需数量的对等数据的数据。您可以通过查看每个数据包的源地址来区分接收的数据。这种方式代码更简单,资源效率更高。

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

答案 2 :(得分:1)

  

每个对等端占用一个端口,所有消息都通过

接收

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

  

每个对等体为每个其他对等体接受一个端口,并且仅与之通信   使用相应端口的对等端

见上文,最重要的是,这首先与您的广播基本理念相矛盾。它只是增加了一定程度的复杂性(并且可能不是很具可扩展性,即使你现在只设想了8个同行)。

根据你的基本要求,我认为你可能会陷入两难境地:

  • 向所有人播放所有内容,
  • 但您仍希望对等方能够只与对等方进行通信,这本身就是单播。

这引发了一些问题,正如你已经通过提出问题所意识到的那样。

我看到其他两个问题:

  • 可伸缩性方面,广播的一切方法,而你实际上需要单播,将在网络上放置一些无用的负载。这不太好。
  • 广播方法决定了UDP,但你仍然想要可靠的数据传输,所以你说你必须在顶层添加一个&34;可靠性和订购协议"。如果我们只使用TCP,就不需要这个(不那么容易)的工作。

还有第三种方法:

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

此方法用于SSDP(简单服务发现协议),UPnP的一部分。我建议你使用SSDP,它可能会因为你想做的事而臃肿,你说你想要一些简单的东西。

总而言之,您首先必须解决您的困境:决定并区分真正需要广播的数据与单播部分。 YMMV。

PS:使用广播UDP也会出现问题,即虽然在局域网上确定,但除非您使用多播路由,否则不会通过路由器。但这是另一个故事。