代码之家  ›  专栏  ›  技术社区  ›  sdgfsdh

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

  •  0
  • sdgfsdh  · 技术社区  · 9 年前

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

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

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

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

    3 回复  |  直到 9 年前
        1
  •  1
  •   Tahlil    9 年前

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

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

        2
  •  1
  •   Joel C    9 年前

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

    要考虑的一个重要问题是对等端之间是否有防火墙。如果是这样,则需要为每个侦听端口打一个洞。这可以一次完成(例如,路由器端口转发规则)或动态完成(UPnP等),但您可能无法指望自动全锥NAT为您完成此操作。如果您希望在对等端之间设置防火墙,我建议您使用单个端口以方便编程,并严格通过远程地址或其他协议内标识符来识别对等端。

    每个用户使用一个端口将使识别通信更加简单,但如果您希望参与者的数量增加n(n-1)/2。如果您从未期望超过一个小数目(例如20个),则每个对等端口将工作得很好,无需付出太多努力。

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

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

        3
  •  1
  •   jbm    9 年前

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

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

    每个对等体为每个其他对等体使用一个端口,并且仅与 使用其对应端口的对等方

    请参见上文,最重要的是,这一点与您的广播基本理念相矛盾。它只是增加了一定程度的复杂性(而且可能不太可扩展,即使目前您只设想了8个对等体)。

    在您的基本要求中,我认为您可能会在以下两个方面陷入两难境地:

    • 向每个人广播一切,
    • 但您仍然希望对等方能够“仅与对等方通信”,这本身就是单播。

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

    我看到了另外两个问题:

    • 就可扩展性而言,广播所有内容的方法,而有时实际上需要单播,这会给网络带来一些无用的负载。这不漂亮。
    • 广播方式要求UDP,但您仍然需要可靠的数据传输,因此正如您所说的,您必须添加“可靠性和排序协议”。如果我们能够使用TCP,这项工作就不需要了。

    还有第三种方法:

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

    该方法用于UPnP的一部分SSDP(简单服务发现协议)。我愿意 建议你使用SSDP,它可能对你想做的事情来说过于臃肿,你说你想要一些简单的东西。

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

    PS:使用广播UDP也会遇到这样的问题:虽然在LAN上可以,但除非使用多播路由,否则这不会通过路由器。但这是另一个故事。