通过NAT进行P2P即时通讯

3
我正在尝试建立一个P2P即时通讯系统。虽然我还没有遇到这个问题,但我预计如果客户端在本地局域网(即:所有人)中处于NAT后面,我会有一些问题。让我解释下算法,你就会明白我的意思了。该系统由三个组件组成:服务器和两个客户端。客户端Alice想要与客户端Bob发起聊天。服务器仅跟踪在线用户,但实际对话不经过服务器(为了客户端的隐私)。因此,Alice和Bob都登录到服务器-从临时端口连接到服务器的静态侦听端口。他们告诉服务器他们监听传入聊天请求的静态端口。Alice询问服务器如何联系Bob。服务器除其他事项外,响应包括IP地址和侦听端口。Alice向那个IP地址和端口发送请求以建立连接。如果Bob在NAT后面,那么他肯定可以与服务器通信,因为他是启动通信的人。但是Alice的请求无法到达他,因为NAT关系尚未针对他为聊天请求所侦听的端口,从Alice的IP地址进行设置。是否有某种黑魔法可以使这项工作顺利完成?它是否会成为非问题?开发尚未进展到那个阶段,我还没有真正遇到这个问题。显而易见的是,我不希望最终用户为其侦听端口配置端口转发。对于前面提到的黑魔法,客户端和服务器都使用Java,但我只是一般性地寻求算法(以及它是否可行)。

看看像Jabber或者Skype这样的聊天系统。你要么需要配置端口转发,使用代理,要么使用常见的开放回退端口,如80... - Fildor
2个回答

1

请检查ICE

大多数P2P框架,如Java中的JXTA,使用中继服务器的原则。

假设A想要连接到B,而B在防火墙后面。

- both A and B establish ** outbound ** synchronous (or full duplex/websockets) connections to Relay Server R
- A signals to R that it wants to transmit data to B
- R 'binds' the inbound connection from A to the outbound connection to B (the synchronous HTTP response to B for instance)
- A sends data to R which is relayed to B

重要的是这里所有连接都是出站建立的(通常使用像HTTP这样的友好防火墙协议,使用众所周知的端口)
当你有分布式中继时,事情显然会变得更加复杂;然后你需要“路由器”通过依赖于分布式哈希映射(DHT)来维护到各个对等体的路由信息。

0

没有黑魔法。如果两个客户端都在NAT后面,消息必须通过第三方(服务器)传递。如果只涉及文本消息,我会考虑使用这种架构进行所有通信(如果隐私是问题,可以考虑某种加密)。服务器(或服务器)将负载更重,但您将获得更简单(在某些情况下更可靠)的架构。例如,如果Alice向Bob发送消息,而Bob遇到一些网络问题,服务器可以将消息排队并保留一段时间,稍后再传递它(即使Alice离线)。另一件事是会议(群组)聊天。仅使用P2P处理它要困难得多(但可能非常有趣)。但是,如果所有客户端都在NAT后面,则会出现相同的问题。我还强烈建议为所有传输和接收的消息(来自客户端和服务器)实施应用程序级别的确认机制。像TCP / IP这样的协议不够可靠。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接