Networking TCP/UDP打孔和混合P2P+客户机/服务器体系结构

Networking TCP/UDP打孔和混合P2P+客户机/服务器体系结构,networking,tcp,udp,p2p,hole-punching,Networking,Tcp,Udp,P2p,Hole Punching,我有一个混合架构,其中a是一个试图从B请求内容的客户机,B是一个潜在在NAT后面的服务器,尽管不一定。S是一个服务器,充当a和B的中间人,以以下方式使用打孔: A联系S并说我想从B那里得到一些东西。S给A B最后一个已知的IP地址和端口,A开始尝试联系B。同时,S给B A的IP地址和端口,B开始尝试联系A S将不作为中继服务器;相互连接后,所有通信将在a和B之间的直接连接中进行。如果它们无法直接连接,则连接将失败。UDP和TCP都有这个问题 我的问题是,最有效的方法是什么,使S与B的IP地址和端

我有一个混合架构,其中a是一个试图从B请求内容的客户机,B是一个潜在在NAT后面的服务器,尽管不一定。S是一个服务器,充当a和B的中间人,以以下方式使用打孔:


A联系S并说我想从B那里得到一些东西。S给A B最后一个已知的IP地址和端口,A开始尝试联系B。同时,S给B A的IP地址和端口,B开始尝试联系A

S将不作为中继服务器;相互连接后,所有通信将在a和B之间的直接连接中进行。如果它们无法直接连接,则连接将失败。UDP和TCP都有这个问题

我的问题是,最有效的方法是什么,使S与B的IP地址和端口保持最新,以便任意数量的As可以随时连接到B。我还希望解决方案能够处理这样一种情况:如果B后面的NAT干扰了端口,比如将它们增加1,我将能够猜测端口实际是什么

我已经想到了解决方案,但我并不完全满意:


通过每X秒从B向S发送一个请求,用B的IP地址和端口更新S。我的问题是,如果X太高,S将无法获得B的正确信息,如果X太低,则会给B和S带来开销。我怀疑这将最终成为最终答案,诀窍是找到X的正确值。

据我所知,As通过建立连接直接从B请求内容,为了建立连接,他们从服务器S请求B的IP和端口地址。我认为,As可以连接到服务器,当他们从B请求内容时,它首先将数据上传到服务器,以便As可以从服务器下载内容。否,在这种情况下我不能使用中继。我会更新问题的,好的。在这种情况下,B仅在其IP信息发生更改时才将其发送到服务器。因此,当从A接收到信息查询时,服务器发送一个带有相关端口B的UDP段,以确认B的当前信息是最新的。如果失败,则意味着B已关闭或信息错误,不应将任何信息返回给A。否则,B的IP和端口将发送给A。A联系S并说我想从B获取一些信息。S给出B最后已知的IP地址和端口,A开始尝试联系B。同时,S给出B的IP地址和端口,然后B开始尝试联系A。问题是,如果B不不断向S提出请求,我如何确保B中的孔保持打开状态