有没有一种自动的方式可以使该端口从互联网访问。我对其他P2P应用程序的工作原理并不太确定。
请问有人能够解答一下吗?
列出您所有本地IP地址(通常只有1个)。为每个具有IP地址的适配器创建一个给定端口号**的UDP套接字。
对于在步骤1中创建的每个套接字,使用相同的套接字联系STUN或TURN服务器,以发现您的外部IP地址,并发现内部端口号在NAT之外的映射方式(它并不总是相同的端口值)。也就是说,您的本地地址192.168.1.2:4900在外部世界上可能是128.11.12.13:8888。而某些NAT在使用相同的本地端口到其他IP地址时,并不总是使用相同的端口映射。TURN还将为您提供一个“中继地址”。如果您的路由器支持该协议,还可以使用UPNP直接获取端口映射地址。
通过约会服务(SIP、XMPP、即时消息、Web服务、电子邮件、带线的杯子),将您的地址候选列表发布到服务或向另一个客户端发送通知,内容为“嘿,我想与你连接”。此消息包括步骤1和2中收集的所有“地址候选”(IP和端口对)。
远程客户端在收到连接邀请后,也执行步骤1和2。然后通过接收到邀请者候选列表的同一通道将其候选列表发送回。
打洞步骤。双方开始通过UDP向对方的地址候选发送测试消息,并在其端口上侦听同一消息。每当收到消息时,回复到它来自的地址。最终,客户端将发现他们有一对可靠地发送数据报的地址。通常,一个端点做出最终决策,选择要与之通信的地址对(套接字),并且协议促进此端点告诉另一个端点这个决策。
通常最好不要依赖于一个众所周知的P2P客户端端口。因为两个在同一NAT或防火墙后面的客户端可能不能同时使用您的软件。
这里是一些技术的快速概述。
STUN - 是一个简单的服务器和协议,用于客户端在NAT /路由器后面发现其外部IP和端口映射。
TURN是对STUN的扩展,但支持中继 P2P 连接的场景,其中防火墙和 NAT 阻止直接连接。
ICE是一个设置 P2P 连接的步骤集,其中使用了 STUN 和 TURN。 ICE是步骤1-5的正式协议。两套关于 ICE 的优秀幻灯片在这里和这里。
WebRTC是ICE标准的一种变体,也是用于使用STUN和TURN进行P2P会话的参考库。
UPNP + Internet Gateway Device Protocol - 一些路由器支持此功能,使主机自动获取端口映射。
libnice是Linux的开源C库(可能也适用于Windows),实现了ICE。
libjingle是来自Google的另一种ICE实现(用C++编写)。适用于 Windows 和 Linux。
PJNATH是PJSIP编码库套件中的一个库。它是一个很好的ICE stack实现(C代码),并已移植到许多平台上(Windows,Linux,Mac,iOS,Symbian,即将支持Android)。
最后,我想为你推荐使用我的STUN服务器代码库。
128.11.12.13:8888
作为Natted IP和端口,而我的IP和端口是 192.168.1.2:4900
。假设我想将我的3000端口暴露给外部世界。那么我是否需要将所有到达4900端口的请求转发到3000端口? - Viren