分别在不同地区的两台计算机(北京某网吧某计算机 A,上海某网吧某计算机 B),通过 UDP 打洞之后,可以不经过服务器进行文件传输、视频聊天、文字聊天么?

2016-04-29 17:20:44 +08:00
 dbfox
P2P 打洞有接触过的么?实现思路是什么?
网上看了一堆博文,试验过几个例子,都以失败告终
QQ 是怎么实现的?


个人理解:

北京某网吧某计算机 A ,上海某网吧某计算机 B

A 如果 要与 B 进行通讯,需要借助服务器 S

A 与 服务器 S 建立连接
B 与 服务器 S 建立连接


A 想发信息给 B ,首先是 A 把信息 发送给 S , S 再发给 B ,但是这样不叫 P2P ,而且服务器 S 在用户多的情况下流量是个问题。

我想实现 A 在 S 的帮助下与 B 可以直接通讯, B 也可以直接通讯 A

A 连接上 S , B 连接上 S , S 通过什么手段 可以让 A 与 B 直接通讯呢?
6859 次点击
所在节点    程序员
35 条回复
morven
2016-04-29 17:27:29 +08:00
直接通讯的话公网 IP 或 dzm 是必要的吧
colatin
2016-04-29 17:28:32 +08:00
如果是严格的 NAT ,肯定无法直接通信。
dbfox
2016-04-29 17:31:41 +08:00
看到了这里我大致也理解了

双方都在局域网内就没有办法 TCP 直连了,所以像 QQ 等都会尽量使用 UDP 直连的

IP 地址转换不需要你处理,网关默认就已经进行了转换。
服务器接收到 DatagramPacket 中 getAddress 和 getPort 已经是网关的端口


UDP 打洞的过程大致如此:
1 、双方都通过 UDP 与服务器通讯后,网关默认就是做了一个外网 IP 和端口号 与你内网 IP 与端口号的映射,这个无需设置的,服务器也不需要知道客户的真正内网 IP
2 、用户 A 先通过服务器知道用户 B 的外网地址与端口
3 、用户 A 向用户 B 的外网地址与端口发送消息,
4 、在这一次发送中,用户 B 的网关会拒收这条消息,因为它的映射中并没有这条规则。
5 、但是用户 A 的网关就会增加了一条允许规则,允许接收从 B 发送过来的消息
6 、服务器要求用户 B 发送一个消息到用户 A 的外网 IP 与端口号
7 、用户 B 发送一条消息,这时用户 A 就可以接收到 B 的消息,而且网关 B 也增加了允许规则
8 、之后,由于网关 A 与网关 B 都增加了允许规则,所以 A 与 B 都可以向对方的外网 IP 和端口号发送消息
tinyproxy
2016-04-29 17:32:15 +08:00
1. DHT 协议收好 http://www.bittorrent.org/beps/bep_0005.html
2. P2P 启动的时候需要一个 Bootstrap 服务器,介绍你入党并告诉你几个其他党员的存在,然后你跟其他党员愉快的搅基的时候就可以不用管入党介绍人了。
3. 说错了请楼下轻拍, P2P 的东西只研究过 DHT 。
dbfox
2016-04-29 17:38:54 +08:00
@tinyproxy 感谢 5/1 研究研究
lbp0200
2016-04-29 19:25:02 +08:00
有个开源项目,狗洞
zhicheng
2016-04-29 19:34:31 +08:00
不是所有的 NAT 都能打洞。
laiyingdong
2016-04-29 19:40:42 +08:00
有一个应用实现 N2N VPN 与 QQ 等等 UDP 打洞是类似的 需要注意的是如果是 Symmetric (对称) NAT 穿透是很困难的 (网吧不可能 因为要玩游戏必须要 UDP 穿透)
SlipStupig
2016-04-29 20:26:52 +08:00
用 stun 可以实现你想要的....
qile1
2016-04-29 20:38:15 +08:00
具体打洞不太清楚,我认为数据传输可能需要两个内网通过互通后可以实现
jimzhong
2016-04-29 20:54:09 +08:00
如果双方 NAT 设备靠谱,应该是可以实现的。
iwege
2016-04-29 22:02:07 +08:00
打洞的不知道
后面的可以考虑走 webrtc
ahtsiu
2016-04-30 00:25:54 +08:00
stun , voip 的最佳拍档
msg7086
2016-04-30 03:16:35 +08:00
@tinyproxy DHT 是个 Hashtable 。
jsq2627
2016-04-30 03:34:42 +08:00
stun 打洞
turn 中转
ice 全自动协商
tinyproxy
2016-04-30 08:10:05 +08:00
@msg7086 是,但楼主要的东西,模仿 dht 做一套是能搞定的,至于你说的 hash table ,既然自己做了,这个函数自己改改就好了,或者扩充一下协议也行。
msg7086
2016-04-30 08:43:15 +08:00
@tinyproxy 楼主并不需要哈希表。
msg7086
2016-04-30 08:44:23 +08:00
@tinyproxy 我仔细想了想你的回复,觉得你应该是没有审题。
haoc
2016-04-30 09:09:48 +08:00
需要例子的话,试一下 webrtc 呀~~
aru
2016-04-30 09:55:31 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/275368

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX