p2p穿透是一种tcp/ip协议还是?

mrpoul 发布于 2016/07/06 21:36
阅读 3K+
收藏 4

各位技术达人们好!

     我学习过tcp/ip,也做过相关的通信小型服务端模块开发。最近有个项目,因为经过多个路由器,然后听别的厂商说得用p2p穿透技术来实现通信。

    那这个p2p是一种tcp/ip协议,例如类似于ftp,smtp等等协议,就是我可以在开发的时候直接调用库api?还是这个p2p必须自己了解协议,然后去实现?或者也是通过tcp或者udp的socket函数进行设置,或者我上面的理解都有误。

    麻烦哪位技术高手解答一下,对了,我的那个项目是智能家居方面的。

加载中
0
渡世白玉
渡世白玉

一般p2p都是走udp协议。这个好跨越路由和子网。

当然tcp也不是不可以,只是难度太高,还要路由的特殊支持。

p2p 的流程一般是:

双方都有一个udp监听特定的端口,而且吧监听信息发送到服务器,服务器会把A 的信息给B,B的信息给A,然后A 就可以直接UDP发送报文给B,B发报文同理。 我自己测试过,udp的跨子网路由中专的信息大概会保持到2分钟左右。

至于上层丢包重发,数据校验这个你就要应用层去做了。


至于现成的库,基于p2p协议的bt和电驴协议有库,直接p2p实现的库,我就不知道了。

mrpoul
mrpoul
回复 @渡世白玉 : 感谢耐心解答
渡世白玉
渡世白玉
回复 @mrpoul : 例子的话,你去google “UDP p2p 打洞 例子” 有不少的。 java或者C++的、、
渡世白玉
渡世白玉
回复 @mrpoul : 没问题的,多级路由也一样。
mrpoul
mrpoul
那如果有两级路由器呢,是不是就有问题?
mrpoul
mrpoul
你好!是否可以分享个简单的例子,udp校验重发这些机制都不用,就是A-服务器-B,然后A-B;是否有简单的例子可以分享,谢谢!
0
scylla
scylla

你描述的是P2P中的NAT穿透,俗称P2P打洞,一般是不同子网里的客户机使用UDP协议去访问公网服务器,并在公网服务器上记录外网地址和外网映射端口,发送给对方;在各自网关上路由信息会保留一段时间;再由客户机直接访问对方的外网地址跟端口,建立传输。

Java的P2P技术话可以看看JXTA,默认客户机会加入的一个global网络,自己实现一个也不错

mrpoul
mrpoul
回复 @scylla : 感谢耐心解答和技术分享,谢谢
scylla
scylla
回复 @mrpoul : 对 http://blog.csdn.net/ustcgy/article/details/5655050 这里面讲了穿透时的3种情况
mrpoul
mrpoul
你好,很感谢你的回答,谢谢! 然后我再问一下,你说“并在公网服务器上记录外网地址和外网映射端口,发送给对方;在各自网关上路由信息会保留一段时间;再由客户机直接访问对方的外网地址跟端口,建立传输。” 从这段话我理解是p2p的穿透,其实是各自网关上保留了路由信息,才可以实现; 反之,就是路由信息没有了,就不能穿透了。 我的理解正确吗?谢谢!
0
雷兽
大多数p2p实际上根本没穿透  而是互相约定了nat端口而已
雷兽
回复 @mrpoul : 两边都在内网 肯定要用个中继的有外网端口的节点 不然没办法联系通信的吧
mrpoul
mrpoul
回复 @雷兽 : 谢谢耐心的解答,谢谢
雷兽
回复 @mrpoul : 因为很明显就算是udp 也得有一方在外才能通信
雷兽
回复 @mrpoul : 大多数的p2p 都有一方必定在外网有一个端口 或者nat端口 或者有一个拥有这种级别端口的转发中间端 比如电骡 ed2k 就是这样 必然有一些外部客户端作为转接服务器端 来为只在内网的客户端做转发
mrpoul
mrpoul
你好,很感谢你的回答,谢谢! 约定nat端口,那只能在一级路由下才能实现,那如果是两级路由或者多级, 这种约定是不是就行不通了吧,那可以怎么实现?而这种实现才是p2p吗?
0
mrpoul
mrpoul
首先非常感谢给位的解答,大家都给出了不同的角度,最佳只有一个,我就按时间来选了,感谢大家
0
dreamsfly
dreamsfly
并不是所有路由器都可以打洞的,NAT在中等左右才可
返回顶部
顶部