sel*_*bie 108
简而言之,P2P连接.假设我们在这里讨论UDP.以下步骤也可以应用于TCP并进行一些调整.
枚举所有本地IP地址(通常只有1个).对于具有IP地址的每个适配器,在给定端口号**上创建UDP套接字.
对于在步骤1中创建的每个套接字,请联系具有相同套接字的STUN或TURN服务器以发现外部IP地址并发现内部端口号映射到NAT外部(它并不总是相同的端口值).也就是说,您的本地地址192.168.1.2:4900可能是128.11.12.13:8888对外界.当使用相同的本地端口到其他IP地址时,一些NAT并不总是使用相同的端口映射.TURN还将为您提供"中继地址".如果它支持该协议,您还可以使用UPNP直接从路由器获取端口映射地址.
通过会合服务(SIP,XMPP,即时消息,Web服务,电子邮件,带字符串的杯子),将您的地址候选列表发布到服务或向其他客户发送通知,说"嘿,我想与您联系".此消息包括步骤1和2中收集的所有"地址候选"(IP和端口对).
在接收到连接邀请时,远程客户端也执行上面的步骤1和2.然后通过他收到邀请者候选人名单的同一频道发回他的候选人名单.
打孔步骤.两个客户端都开始通过UDP向另一方的地址候选者发送测试消息,并在其末端侦听相同的消息.每当收到消息时,回复它所来自的地址.最终,客户端会发现他们有一对地址,他们也可以可靠地发送数据报.通常,一个端点最终决定与哪个地址对(套接字)进行通信,协议有助于该端点告知另一个端点这一决定.
** - 通常最好不要依赖于P2P客户端的知名端口.因为同一NAT或防火墙后面的两个客户端不可能同时使用您的软件.
以下是一些要探索的技术的快速摘要.
STUN - 是一个简单的服务器和协议,用于NAT /路由后面的客户端,以发现它们的外部IP和端口映射是什么.
TURN是STUN的扩展,但支持中继防火墙和NAT阻止直接连接的P2P连接方案.
ICE是一组步骤,STUN和TURN用于建立P2P连接.ICE是上述步骤1-5的正式协议.ICE的两套优秀幻灯片就在这里和这里.
WebRTC是ICE标准的变体,也是使用STUN和TURN进行P2P会话的参考库.
UPNP + Internet网关设备协议 - 某些路由器支持此主机自动获取端口映射.
libnice是一个用于Linux(可能在Windows上工作)的开源C库,它实现了ICE.
libjingle是Google的另一个ICE实现(在C++中).适用于Windows和Linux.
PJNATH是PJSIP编码库套件中的一个库.它是ICE堆栈(C代码)的一个很好的实现,并已移植到许多平台.(Windows,Linux,Mac,iOS,Symbian,很快Android).
最后,我有一个明确的插件供您使用我的STUN服务器代码库.
在某些情况下有解决方案,请参阅 UPnP:https : //en.wikipedia.org/wiki/Universal_Plug_and_Play#NAT_traversal
我的家用路由器允许这样做,基本上,NAT 可以通过计算机的正确请求自动配置。
我不会指望这会大大提高您的可用性,因为没有多少路由器同时支持并启用它。
编辑:@David 为 UPnP 的 .NET 库建议了这个 SO 问题:Is there a UPnP Library for .NET (C# or VB.NET)?
| 归档时间: |
|
| 查看次数: |
20442 次 |
| 最近记录: |