我在使用c++本机调用(epoll等)开发服务器-客户端应用程序方面有一些经验,现在我正在尝试使用netty来处理p2p。但我无法明确区分p2p和服务器-客户端设计。IMHO,p2p就像服务器应用程序,但也会像客户端一样连接到其他对等端(服务器),对吗?在p2p设计中,哪个协议更常用?我看到的文件共享p2p应用程序都是tcp基础。来自网络指南的p2p示例正在使用udt,我想这将是点对点游戏的一个很好的用例,对吗?
发布于 2015-06-18 11:22:39
您正确地假设P2P对等点是具有服务器和客户端功能的应用程序。服务器是指它从其他对等点接收到连接的事实,而客户端是它向外连接到其他对等点的事实。
TCP是可能的,但由于大多数家庭/公司/ISP网络使用NAT,节点需要在其路由器上设置端口转发。对于一般的计算机用户来说,这是不实际的/不可能的。使用UDP的一种称为UDP孔打孔的技术解决了这一问题(对于某些NAT来说,这可能仍然不起作用)。
在UDP孔打孔中,节点会联系第三方“跟踪器”/“协调”/“中继”服务器,以建立两个节点之间的连接。假设您有两个对等点,A和B。同侪A会与服务器联系,并通过NAT“穿孔”一个洞。服务器将收到穿孔孔的详细信息(IP地址,UDP端口)。B同伴也会这么做。然后,服务器将向B发送对等点A的IP地址和UDP端口,反之亦然。现在这两个对等点可以直接交流了。
如果实现得当,P2P对于服务器客户机所能做的几乎所有事情都是有用的。P2P感兴趣的领域包括确定对等点之间的信任、防止某人创建许多虚假的对等点来推翻网络、建立身份等。这些问题在客户端-服务器模型中有着众所周知的解决方案。
P2P已用于:
文件共享- Bittorrent,Gnutella
货币交换-比特币
市场- OpenBazaar
消息传递- Bitmessage
参考文献:
http://www.brynosaurus.com/pub/net/p2pnat/
https://stackoverflow.com/questions/30907129
复制相似问题