P2P 是一种客户端与客户端之间,点对点连接的技术,在早前的客户端都是公网IP,没有NAT的情况下,P2P是较为容易实现的。
但现在的P2P,实现上面会略微有一些复杂:需要采取UDP打洞的技术,但UDP打出来的洞,是有持续时间的,因为ASN/ISP(运营商)对于P2P,存在较为严重的技术限制。
并且UDP能不能打洞,还需要取决于NAT的限制类型,可以参考下文了解NAT的类型及限制条件
关于NAT的几种类型_nat有几种-CSDN博客
P2P示意图:
上图为P2P的标准架构,即一个P2P中心服务器,用以为P2P发现其它P2P客户端提供支援,并可以实现UDP打洞。
P2P具体流程/NS为:
1、P2P Client 上线流程
1.1、P2P Client 分配一个随机UDP端口并向中心服务器,发送 Hello 数据报
1.2、P2P Center 收到来自P2P Client 的 Hello 数据报后,分配一个随机的临时UDP端口并反向该客户端的目的 IPEndPoint(地址端点;IP+PORT)发送数据,来等待测试 ACK 应答,这类似 TCP SYN/CONNECT 的三次握手的流程,其目的是为了确保NAT的类型是被支援P2P工作流的。
2、根据P2P业务类型的不同,当P2P Client 上线流程完成之后,则P2P Center,可能需要广播所有在线的 P2P Client 的IP+PORT(地址端点)
当然,这也可能不需要,而是P2P Client 在上线后主动进行 “Discover(发现)”,在大多数的 P2P 工程及解决方案之中,并不需要在P2P上线后,主动广播并告知所有其它在线的P2P Client 链路信息。
3、当P2P Client 获取到其它 P2P Client 的链路信息之后,则需要向目的 P2P Client 进行双向握手,以确保双方之间建立所需的通信链路。
4、当第三条完成之后,P2P Client 之间便可以正常交换数据,但在一些P2P解决方案及场景之中并不需要握手这个过程,它们是直接投递并双向交换数据报。