一尘不染

编写P2P应用程序

c#

我正在编写一个在端口4900上运行的自定义p2p程序。在某些情况下,当该人在路由器后面时,无法从Internet访问此端口。

是否有一种自动方法可以启用从Internet访问端口的功能。我不太确定其他p2p应用程序如何工作。

谁能给我一点启示吗?


阅读 467

收藏
2020-05-19

共1个答案

一尘不染

概括地说,P2P连接。假设我们在这里谈论UDP。进行一些调整后,以下步骤也可以应用于TCP。

  1. 枚举所有本地IP地址(通常只有1个)。在给定端口号**上为每个具有IP地址的适配器创建UDP套接字。

  2. 对于在步骤1中创建的每个套接字,请使用相同的套接字与STUN或TURN服务器联系,以发现您的外部IP地址,并发现内部端口号映射到NAT之外的内容(它并不总是相同的端口值)。也就是说,您的本地地址192.168.1.2:4900可能是外界的128.11.12.13:8888。而且,当使用相同的本地端口到其他IP地址时,某些NAT并不总是使用相同的端口映射。TURN还将为您提供“中继地址”。如果路由器支持该协议,也可以使用UPNP直接从路由器获取端口映射的地址。

  3. 通过集合服务(SIP,XMPP,即时消息,Web服务,电子邮件,带字符串的杯子),将候选地址列表发布到服务,或向另一个客户端发送通知,说:“嘿,我想与您建立联系”。该消息包括在步骤1和2中收集的所有“地址候选”(ip和端口对)。

  4. 远程客户端在收到连接邀请后,也将执行上述步骤1和2。然后通过与接收邀请者的候选者名单相同的渠道发回他的候选者名单。

  5. 打孔步骤。两个客户端都开始通过UDP将测试消息发送到另一方的候选地址,并在它们的末端侦听相同的消息。每当收到邮件时,请回复该邮件来自的地址。最终,客户端将发现他们有一对地址,它们也可以可靠地发送数据报。通常,一个端点对要与之通信的地址对(套接字)做出最终决定,而协议则有助于该端点告知另一端点该决定。

**-通常最好不要对P2P客户端依赖知名端口。因为位于相同NAT或防火墙后面的两个客户端可能无法同时使用您的软件。

这是一些要探索的技术的简要概述。

STUN-是用于NAT
/路由后的客户端的简单服务器和协议,以发现其外部IP和端口映射是什么。

TURN是STUN的扩展,但支持在防火墙和NAT阻止直接连接的P2P连接方案中进行中继。

ICE是使用STUN和TURN来建立P2P连接的一组步骤。ICE是上述步骤1-5的正式协议。两个优秀的集上冰滑梯是在这里这里

WebRTC是ICE标准的变体,也是用于使用STUN和TURN进行P2P会话的参考库。

UPNP +
Internet网关设备协议

-某些路由器支持此功能,以便主机自动获取端口映射。

libnice是用于Linux(可以在Windows上运行)的开源C库,它实现了ICE。

libjingle是Google的另一个ICE实现(使用C
++)。对于Windows和Linux。

PJNATHPJSIP编码库套件中的一个库。它是ICE堆栈(C代码)的良好实现,并已移植到许多平台上。(Windows,Linux,Mac,iOS,Symbian和即将推出的Android)。

最后,我有一个公然的插件供您使用我的STUN服务器代码库

2020-05-19