我正在编写一个运行在端口4900上的自定义p2p程序。在某些情况下,当人在路由器后面时,此端口无法从互联网访问。是否有一个自动的方式,使访问端口从互联网。我不太清楚其他P2P应用程序是如何工作的。有没有人能帮我解释一下?
polhcujo1#
P2P连接在一个简而言之。假设我们在这里谈论UDP。下面的步骤也可以通过一些调整应用于TCP。1.枚举所有本地IP地址(通常只有1个)。为每个具有IP地址的适配器在给定端口号**上创建UDP套接字。1.对于步骤1中创建的每个套接字,使用相同的套接字联系STUN或TURN服务器,以发现您的外部IP地址,并发现内部端口号Map到NAT外部的内容(端口值并不总是相同的)。也就是说,您的本地地址192.168.1.2:4900对外部世界可能是128.11.12.13:8888。并且,当使用相同的本地端口到其他IP地址时,一些NAT并不总是使用相同的端口Map。TURN还将为您提供一个“中继地址”。您也可以使用UPNP直接从路由器获取端口Map地址(如果它支持该协议)。1.通过集合服务(SIP、XMPP、即时消息、Web服务、电子邮件、带字符串的杯子),将您的地址候选列表发布到服务或向其他客户端发送通知,说“嘿,我想与您联系”。此消息包括步骤1和2中收集的所有“候选地址”(ip和端口对)。1.远程客户端在接收到连接邀请时也执行上述步骤1和2。然后通过他接收邀请者的候选人列表的相同通道发送回他的候选人列表。1.冲孔步骤。两个客户端都开始通过UDP向另一端的候选地址发送测试消息,并在其端侦听相同的消息。无论何时收到消息,都要回复到消息的来源地址。最终,客户端将发现它们也有一对可以可靠地发送数据报的地址。通常,一个端点做出关于与哪个地址对(套接字)通信的最终决定,并且协议促进该端点将该决定告知另一个端点。
**-通常最好不要依赖P2P客户端的知名端口。因为位于同一NAT或防火墙后的两个客户端不太可能同时使用您的软件。
下面是一些需要探索的技术的快速总结。STUN-是一个简单的服务器和协议,用于NAT/路由后的客户端发现其外部IP和端口Map。TURN是STUN的扩展,但支持防火墙和NAT阻止直接连接的P2P连接场景的中继。ICE是STUN和TURN用于建立P2P连接的一组步骤。ICE是上述步骤1-5的正式方案。ICE上的两组优秀幻灯片是here和here。WebRTC是ICE标准的一个变体,也是一个用于使用STUN和TURN创建P2P会话的参考库。UPNP + Internet Gateway Device Protocol-某些路由器支持此功能,以便主机自动获取端口Map。libnice是一个用于Linux的开源C库(可能在Windows上工作),它实现了ICE。libjingle是Google的另一个ICE实现(C++)。适用于Windows和Linux。PJNATH是PJSIP编码库套件中的库。它是ICE堆栈(C代码)的一个很好的实现,并且已经移植到很多平台上。(Windows,Linux,Mac,iOS,Symbian,以及很快的Android)。最后,我有一个明目张胆的插头给你使用my STUN server code base。
ecbunoof2#
在某些情况下有解决方案,请参阅UPnP:https://en.wikipedia.org/wiki/Universal_Plug_and_Play#NAT_traversal我的家庭路由器允许这一点,基本上,NAT可以通过计算机的适当请求自动配置。我不指望这会在您的可用性方面提供很大的改进,因为没有那么多路由器都支持这一点并启用它。编辑:@大卫建议了一个用于UPnP的.NET库的SO问题:Is there a UPnP Library for .NET (C# or VB.NET)?
jxct1oxe3#
我会使用WebRTC技术作为此类应用程序的开源框架。
**Official Website**第一个字符
事实上,它是一个开源项目,支持所有必要的点对点技术:
qc6wkl3g4#
这可能比您正在寻找的要复杂一点,但TCP打孔是一种应该有效的技术。http://en.wikipedia.org/wiki/TCP_hole_punching或者,UPnP对于支持它的路由器/防火墙也很好用。
huwehgph5#
您还有另一个选择,即NAT Port Mapping Protocol (NAT-PMP) NAT-PMP被Skype或BitTorrent P2P客户端等VoIP应用程序广泛使用。
tquggr8v6#
对于简单的开始,我建议看看打孔技术。伟大的视频here。但请确保它并不总是与网络拓扑相关的工作。这解决了发现如何建立连接的ICE技术。
6条答案
按热度按时间polhcujo1#
P2P连接在一个简而言之。假设我们在这里谈论UDP。下面的步骤也可以通过一些调整应用于TCP。
1.枚举所有本地IP地址(通常只有1个)。为每个具有IP地址的适配器在给定端口号**上创建UDP套接字。
1.对于步骤1中创建的每个套接字,使用相同的套接字联系STUN或TURN服务器,以发现您的外部IP地址,并发现内部端口号Map到NAT外部的内容(端口值并不总是相同的)。也就是说,您的本地地址192.168.1.2:4900对外部世界可能是128.11.12.13:8888。并且,当使用相同的本地端口到其他IP地址时,一些NAT并不总是使用相同的端口Map。TURN还将为您提供一个“中继地址”。您也可以使用UPNP直接从路由器获取端口Map地址(如果它支持该协议)。
1.通过集合服务(SIP、XMPP、即时消息、Web服务、电子邮件、带字符串的杯子),将您的地址候选列表发布到服务或向其他客户端发送通知,说“嘿,我想与您联系”。此消息包括步骤1和2中收集的所有“候选地址”(ip和端口对)。
1.远程客户端在接收到连接邀请时也执行上述步骤1和2。然后通过他接收邀请者的候选人列表的相同通道发送回他的候选人列表。
1.冲孔步骤。两个客户端都开始通过UDP向另一端的候选地址发送测试消息,并在其端侦听相同的消息。无论何时收到消息,都要回复到消息的来源地址。最终,客户端将发现它们也有一对可以可靠地发送数据报的地址。通常,一个端点做出关于与哪个地址对(套接字)通信的最终决定,并且协议促进该端点将该决定告知另一个端点。
**-通常最好不要依赖P2P客户端的知名端口。因为位于同一NAT或防火墙后的两个客户端不太可能同时使用您的软件。
下面是一些需要探索的技术的快速总结。
STUN-是一个简单的服务器和协议,用于NAT/路由后的客户端发现其外部IP和端口Map。
TURN是STUN的扩展,但支持防火墙和NAT阻止直接连接的P2P连接场景的中继。
ICE是STUN和TURN用于建立P2P连接的一组步骤。ICE是上述步骤1-5的正式方案。ICE上的两组优秀幻灯片是here和here。
WebRTC是ICE标准的一个变体,也是一个用于使用STUN和TURN创建P2P会话的参考库。
UPNP + Internet Gateway Device Protocol-某些路由器支持此功能,以便主机自动获取端口Map。
libnice是一个用于Linux的开源C库(可能在Windows上工作),它实现了ICE。
libjingle是Google的另一个ICE实现(C++)。适用于Windows和Linux。
PJNATH是PJSIP编码库套件中的库。它是ICE堆栈(C代码)的一个很好的实现,并且已经移植到很多平台上。(Windows,Linux,Mac,iOS,Symbian,以及很快的Android)。
最后,我有一个明目张胆的插头给你使用my STUN server code base。
ecbunoof2#
在某些情况下有解决方案,请参阅UPnP:https://en.wikipedia.org/wiki/Universal_Plug_and_Play#NAT_traversal
我的家庭路由器允许这一点,基本上,NAT可以通过计算机的适当请求自动配置。
我不指望这会在您的可用性方面提供很大的改进,因为没有那么多路由器都支持这一点并启用它。
编辑:@大卫建议了一个用于UPnP的.NET库的SO问题:Is there a UPnP Library for .NET (C# or VB.NET)?
jxct1oxe3#
我会使用WebRTC技术作为此类应用程序的开源框架。
**Official Website**第一个字符
事实上,它是一个开源项目,支持所有必要的点对点技术:
qc6wkl3g4#
这可能比您正在寻找的要复杂一点,但TCP打孔是一种应该有效的技术。http://en.wikipedia.org/wiki/TCP_hole_punching
或者,UPnP对于支持它的路由器/防火墙也很好用。
huwehgph5#
您还有另一个选择,即NAT Port Mapping Protocol (NAT-PMP) NAT-PMP被Skype或BitTorrent P2P客户端等VoIP应用程序广泛使用。
tquggr8v6#
对于简单的开始,我建议看看打孔技术。伟大的视频here。但请确保它并不总是与网络拓扑相关的工作。这解决了发现如何建立连接的ICE技术。