p2p 和客户端-服务器节点设计之间的区别

difference between p2p and client-server node design

我在使用 c++ 本机调用(epoll 等)进行服务器-客户端应用程序开发方面有一些经验,现在我正在尝试使用 netty 对 p2p 做一些事情。但我无法明确区分 p2p 和服务器-客户端设计。 恕我直言,p2p 就像一个服务器应用程序,但也会像客户端一样连接到其他对等(服务器),对吗?哪种协议 tcp/udp 在 p2p 设计中更常用?我见过的文件共享p2p应用都是tcp base。 netty 指南中的 p2p 示例正在使用 udt,我想这将是点对点游戏的一个很好的用例,对吗?

您假设 P2P 点是具有服务器和客户端功能的应用程序是正确的。服务器是它从其他对等点接收连接的事实,而客户端是它向外连接到其他对等点的事实。

TCP 是可能的,但由于大多数 home/corporate/ISP 网络使用 NAT,对等点需要在其路由器上设置端口转发。对于普通计算机用户来说,这不是 practical/possible。一种使用 UDP 的称为 UDP 打孔的技术解决了这个问题(这可能仍然不适用于某些 NAT)。

在 UDP 打洞中,对等点会联系第三方 "tracker"/"coordination"/"relay" 服务器,该服务器会在两个对等点之间建立连接。假设您有两个对等点,A 和 B。对等点 A 会联系服务器并 "punch" 通过 NAT 的一个漏洞。服务器将收到打孔的详细信息(IP 地址、UDP 端口)。对等点 B 也会这样做。然后,服务器将对等点 A 的 IP 地址和 UDP 端口发送给对等点 B,反之亦然。现在两个点可以直接通信了。

如果实施得当,P2P 几乎可以用于服务器-客户端可以做的所有事情。 P2P 感兴趣的领域包括确定点之间的信任、防止某人创建许多假点来推翻网络、建立身份等。这些问题在客户端-服务器模型中具有众所周知的解决方案。

P2P 已用于:

文件共享 - Bittorrent、Gnutella

货币兑换 - 比特币

市场 - OpenBazaar

消息传递 - 位消息

参考文献:

http://www.brynosaurus.com/pub/net/p2pnat/