在我的点对点应用程序中,我应该使用多个端口吗?
In my peer to peer application, should I use multiple ports?
我正在构建一个简单的点对点应用程序,其中大约 8 个参与者都相互连接 (n*n
)。我将使用 UDP 并在其上层添加可靠性和排序协议。每个对等点每秒将广播几 KB 的数据。
我想到有两种方法可以在每个对等点上配置端口:
- 每个对等点占用一个端口,所有消息都通过该端口接收
- 每个peer为其他peer占用一个端口,并且只与使用其对应端口的peer通信
每种方法的优缺点是什么?
我从未对这种应用程序模型做过任何事情,但这是我的一些想法。
要考虑的一件大事是点之间是否有任何防火墙。如果是这样,则需要为每个监听端口打孔。这可以一次性完成(例如路由器端口转发规则)或动态(UPnP 等),但您可能无法指望自动全锥 NAT 为您完成此操作。如果您希望您的对等点之间有任何防火墙,我建议您使用单个端口以便于您编程,并严格通过他们的远程地址或其他一些协议内标识符来识别您的对等点。
每个用户使用一个端口将使识别通信变得更加简单,但如果您希望参与者的数量增加 n(n-1)/2。如果您从不期望超过一个小数字(例如 20),那么每个对等端口将在不费吹灰之力的情况下正常工作。
您的另一个选择(可能)可能是使用多播。如果您的所有同行都在同一个广播域中,这将减少总线争用,并可能使您的编码更清晰。
希望这对您有所帮助。如果这不是您要找的,我深表歉意。祝你好运!
只创建一个端口来与每个对等点通信是最好的选择。您只创建一个套接字,只使用一个端口 send/receive 与任意数量的对等方的数据。您可以通过查看每个数据包的源地址来区分接收到的数据。这种方式的代码更简单,资源效率更高。
创建多个端口绝对没有优势。它会使您的代码复杂化,并且会使用更多的资源而没有任何好处。资源消耗会随着对等点的增加而增长。
Each peer takes one port and all messages are received via that
如果每个对等点都可以获得传入数据报的源 IP/source 端口(我敢打赌它可以),这足以区分对等点。
Each peer takes a port for each other peer, and only communicates with
a peer using its corresponding port
见上文,最重要的是,这首先与您广播的基本想法相矛盾。它只是增加了一定程度的复杂性(并且可能不是很可扩展,即使现在您设想只有 8 个对等节点)。
在你的基本要求中,我认为你可能有一个两难选择:
- 向所有人广播一切,
- 但您仍然希望对等点能够 "only communicates with a peer",这本质上是单播的。
这会引发一些问题,正如您通过提问已经意识到的那样。
我看到另外 2 个问题:
- 在可扩展性方面,广播一切的方法而你有时实际上需要单播会给网络带来一些无用的负载。这不漂亮。
- 广播方法规定了 UDP,但您仍然需要可靠的数据传输,因此正如您所说,您必须添加一个 "reliability and ordering protocol layered on top"。如果我们可以使用 TCP,就不需要这项(不太容易的)工作了。
还有第三种方法:
- 为每个对等点使用广播 UDP 在网络上宣布自己,以便其他对等点可以...
- ...发现它,然后与该对等点建立单播 TCP 连接。不再存在可靠性和排序问题 + 减少网络负载。
这种方法在 UPnP 的一部分 SSDP(简单服务发现协议)中使用。我 不 建议你使用 SSDP,它可能对你想做的事情臃肿,你说你想要一些简单的东西。
总而言之,您首先必须解决您的困境:决定并区分真正需要广播的数据与单播部分。 YMMV.
PS:广播 UDP 也带来了一个问题,即尽管在 LAN 上没问题,但除非您使用多播路由,否则它不会通过路由器。但那是另外一回事了。
我正在构建一个简单的点对点应用程序,其中大约 8 个参与者都相互连接 (n*n
)。我将使用 UDP 并在其上层添加可靠性和排序协议。每个对等点每秒将广播几 KB 的数据。
我想到有两种方法可以在每个对等点上配置端口:
- 每个对等点占用一个端口,所有消息都通过该端口接收
- 每个peer为其他peer占用一个端口,并且只与使用其对应端口的peer通信
每种方法的优缺点是什么?
我从未对这种应用程序模型做过任何事情,但这是我的一些想法。
要考虑的一件大事是点之间是否有任何防火墙。如果是这样,则需要为每个监听端口打孔。这可以一次性完成(例如路由器端口转发规则)或动态(UPnP 等),但您可能无法指望自动全锥 NAT 为您完成此操作。如果您希望您的对等点之间有任何防火墙,我建议您使用单个端口以便于您编程,并严格通过他们的远程地址或其他一些协议内标识符来识别您的对等点。
每个用户使用一个端口将使识别通信变得更加简单,但如果您希望参与者的数量增加 n(n-1)/2。如果您从不期望超过一个小数字(例如 20),那么每个对等端口将在不费吹灰之力的情况下正常工作。
您的另一个选择(可能)可能是使用多播。如果您的所有同行都在同一个广播域中,这将减少总线争用,并可能使您的编码更清晰。
希望这对您有所帮助。如果这不是您要找的,我深表歉意。祝你好运!
只创建一个端口来与每个对等点通信是最好的选择。您只创建一个套接字,只使用一个端口 send/receive 与任意数量的对等方的数据。您可以通过查看每个数据包的源地址来区分接收到的数据。这种方式的代码更简单,资源效率更高。
创建多个端口绝对没有优势。它会使您的代码复杂化,并且会使用更多的资源而没有任何好处。资源消耗会随着对等点的增加而增长。
Each peer takes one port and all messages are received via that
如果每个对等点都可以获得传入数据报的源 IP/source 端口(我敢打赌它可以),这足以区分对等点。
Each peer takes a port for each other peer, and only communicates with a peer using its corresponding port
见上文,最重要的是,这首先与您广播的基本想法相矛盾。它只是增加了一定程度的复杂性(并且可能不是很可扩展,即使现在您设想只有 8 个对等节点)。
在你的基本要求中,我认为你可能有一个两难选择:
- 向所有人广播一切,
- 但您仍然希望对等点能够 "only communicates with a peer",这本质上是单播的。
这会引发一些问题,正如您通过提问已经意识到的那样。
我看到另外 2 个问题:
- 在可扩展性方面,广播一切的方法而你有时实际上需要单播会给网络带来一些无用的负载。这不漂亮。
- 广播方法规定了 UDP,但您仍然需要可靠的数据传输,因此正如您所说,您必须添加一个 "reliability and ordering protocol layered on top"。如果我们可以使用 TCP,就不需要这项(不太容易的)工作了。
还有第三种方法:
- 为每个对等点使用广播 UDP 在网络上宣布自己,以便其他对等点可以...
- ...发现它,然后与该对等点建立单播 TCP 连接。不再存在可靠性和排序问题 + 减少网络负载。
这种方法在 UPnP 的一部分 SSDP(简单服务发现协议)中使用。我 不 建议你使用 SSDP,它可能对你想做的事情臃肿,你说你想要一些简单的东西。
总而言之,您首先必须解决您的困境:决定并区分真正需要广播的数据与单播部分。 YMMV.
PS:广播 UDP 也带来了一个问题,即尽管在 LAN 上没问题,但除非您使用多播路由,否则它不会通过路由器。但那是另外一回事了。